blob: e297b37ca09808d2b6da84e00551821e29705cd3 [file] [log] [blame]
keunyoungb85b2752013-03-08 12:28:03 -08001/*
2* Copyright (C) 2011 The Android Open Source Project
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16#ifndef __COMMON_HOST_CONNECTION_H
17#define __COMMON_HOST_CONNECTION_H
18
Lingfeng Yangabc65162018-12-21 18:14:48 -080019#include "EmulatorFeatureInfo.h"
keunyoungb85b2752013-03-08 12:28:03 -080020#include "IOStream.h"
21#include "renderControl_enc.h"
Yahan Zhoub7f09082016-03-10 11:45:02 -080022#include "ChecksumCalculator.h"
Lingfeng Yang88c170c2016-11-30 00:52:35 +000023#include "goldfish_dma.h"
keunyoungb85b2752013-03-08 12:28:03 -080024
Alistair Strachan694745b2018-03-30 18:11:39 -070025#include <cutils/native_handle.h>
Lingfeng Yang1ec6f432019-01-23 10:04:52 -080026
Lingfeng Yangad6f67d2019-02-19 15:47:53 -080027#ifdef GOLDFISH_VULKAN
David Reveman74e99bb2019-02-15 18:47:25 -050028#include <mutex>
Lingfeng Yangad6f67d2019-02-19 15:47:53 -080029#else
30#include <utils/threads.h>
31#endif
32
Yilong Li3c673cc2020-07-11 00:47:40 -070033#include <memory>
Lingfeng Yang18835352016-05-23 12:16:04 -070034#include <string>
35
keunyoungb85b2752013-03-08 12:28:03 -080036class GLEncoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070037struct gl_client_context_t;
keunyoungb85b2752013-03-08 12:28:03 -080038class GL2Encoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070039struct gl2_client_context_t;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080040
41namespace goldfish_vk {
Lingfeng Yang6a283672018-11-01 13:37:56 -070042class VkEncoder;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080043}
keunyoungb85b2752013-03-08 12:28:03 -080044
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070045// ExtendedRCEncoderContext is an extended version of renderControl_encoder_context_t
Lingfeng Yangabc65162018-12-21 18:14:48 -080046// that will be used to track available emulator features.
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070047class ExtendedRCEncoderContext : public renderControl_encoder_context_t {
48public:
49 ExtendedRCEncoderContext(IOStream *stream, ChecksumCalculator *checksumCalculator)
Lingfeng Yangabc65162018-12-21 18:14:48 -080050 : renderControl_encoder_context_t(stream, checksumCalculator),
Roman Kiryanovc5731552019-10-09 14:20:21 -070051 m_dmaCxt(NULL), m_dmaPtr(NULL), m_dmaPhysAddr(0) { }
Lingfeng Yangabc65162018-12-21 18:14:48 -080052 void setSyncImpl(SyncImpl syncImpl) { m_featureInfo.syncImpl = syncImpl; }
53 void setDmaImpl(DmaImpl dmaImpl) { m_featureInfo.dmaImpl = dmaImpl; }
huansd96d5bd2018-10-15 14:32:46 -070054 void setHostComposition(HostComposition hostComposition) {
Lingfeng Yangabc65162018-12-21 18:14:48 -080055 m_featureInfo.hostComposition = hostComposition; }
56 bool hasNativeSync() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V2; }
57 bool hasNativeSyncV3() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V3; }
Lingfeng Yang65cd34f2019-10-24 09:30:45 -070058 bool hasNativeSyncV4() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V4; }
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -070059 bool hasVirtioGpuNativeSync() const { return m_featureInfo.hasVirtioGpuNativeSync; }
huansd96d5bd2018-10-15 14:32:46 -070060 bool hasHostCompositionV1() const {
Lingfeng Yangabc65162018-12-21 18:14:48 -080061 return m_featureInfo.hostComposition == HOST_COMPOSITION_V1; }
Huihong Luoa38b63c2019-08-08 16:14:34 -070062 bool hasHostCompositionV2() const {
63 return m_featureInfo.hostComposition == HOST_COMPOSITION_V2; }
Huan Song1c4af992019-06-24 17:05:54 -070064 bool hasYUVCache() const {
65 return m_featureInfo.hasYUVCache; }
Lingfeng Yang22e361a2019-10-12 07:19:00 -070066 bool hasAsyncUnmapBuffer() const {
67 return m_featureInfo.hasAsyncUnmapBuffer; }
Lingfeng Yangabc65162018-12-21 18:14:48 -080068 DmaImpl getDmaVersion() const { return m_featureInfo.dmaImpl; }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000069 void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
Roman Kiryanovc5731552019-10-09 14:20:21 -070070 void bindDmaDirectly(void* dmaPtr, uint64_t dmaPhysAddr) {
71 m_dmaPtr = dmaPtr;
72 m_dmaPhysAddr = dmaPhysAddr;
Roman Kiryanov382ce562019-06-03 12:39:58 -070073 }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000074 virtual uint64_t lockAndWriteDma(void* data, uint32_t size) {
Roman Kiryanovc5731552019-10-09 14:20:21 -070075 if (m_dmaPtr && m_dmaPhysAddr) {
76 memcpy(m_dmaPtr, data, size);
77 return m_dmaPhysAddr;
Roman Kiryanov382ce562019-06-03 12:39:58 -070078 } else if (m_dmaCxt) {
79 return writeGoldfishDma(data, size, m_dmaCxt);
Roman Kiryanov943161f2019-03-22 12:57:52 -070080 } else {
81 ALOGE("%s: ERROR: No DMA context bound!", __func__);
Lingfeng Yang88c170c2016-11-30 00:52:35 +000082 return 0;
83 }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000084 }
Lingfeng Yangabc65162018-12-21 18:14:48 -080085 void setGLESMaxVersion(GLESMaxVersion ver) { m_featureInfo.glesMaxVersion = ver; }
86 GLESMaxVersion getGLESMaxVersion() const { return m_featureInfo.glesMaxVersion; }
Roman Kiryanov382ce562019-06-03 12:39:58 -070087 bool hasDirectMem() const {
88#ifdef HOST_BUILD
89 // unit tests do not support restoring "guest" ram because there is no VM
90 return false;
91#else
92 return m_featureInfo.hasDirectMem;
93#endif
94 }
Lingfeng Yangabc65162018-12-21 18:14:48 -080095
96 const EmulatorFeatureInfo* featureInfo_const() const { return &m_featureInfo; }
97 EmulatorFeatureInfo* featureInfo() { return &m_featureInfo; }
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070098private:
Roman Kiryanov382ce562019-06-03 12:39:58 -070099 static uint64_t writeGoldfishDma(void* data, uint32_t size,
100 struct goldfish_dma_context* dmaCxt) {
Roman Kiryanov943161f2019-03-22 12:57:52 -0700101 ALOGV("%s(data=%p, size=%u): call", __func__, data, size);
102
103 goldfish_dma_write(dmaCxt, data, size);
104 uint64_t paddr = goldfish_dma_guest_paddr(dmaCxt);
105
106 ALOGV("%s: paddr=0x%llx", __func__, (unsigned long long)paddr);
107 return paddr;
108 }
109
Lingfeng Yangabc65162018-12-21 18:14:48 -0800110 EmulatorFeatureInfo m_featureInfo;
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000111 struct goldfish_dma_context* m_dmaCxt;
Roman Kiryanovc5731552019-10-09 14:20:21 -0700112 void* m_dmaPtr;
113 uint64_t m_dmaPhysAddr;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700114};
115
Alistair Strachan694745b2018-03-30 18:11:39 -0700116// Abstraction for gralloc handle conversion
117class Gralloc {
118public:
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800119 virtual uint32_t createColorBuffer(
120 ExtendedRCEncoderContext* rcEnc, int width, int height, uint32_t glformat);
Alistair Strachan694745b2018-03-30 18:11:39 -0700121 virtual uint32_t getHostHandle(native_handle_t const* handle) = 0;
122 virtual int getFormat(native_handle_t const* handle) = 0;
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800123 virtual size_t getAllocatedSize(native_handle_t const* handle) = 0;
Alistair Strachan694745b2018-03-30 18:11:39 -0700124 virtual ~Gralloc() {}
125};
126
127// Abstraction for process pipe helper
128class ProcessPipe {
129public:
Lingfeng Yang9c26ebf2019-12-30 09:14:49 -0800130 virtual bool processPipeInit(HostConnectionType connType, renderControl_encoder_context_t *rcEnc) = 0;
Alistair Strachan694745b2018-03-30 18:11:39 -0700131 virtual ~ProcessPipe() {}
132};
133
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700134struct EGLThreadInfo;
135
Lingfeng Yang4d0ffea2019-10-12 16:51:59 -0700136
keunyoungb85b2752013-03-08 12:28:03 -0800137class HostConnection
138{
139public:
140 static HostConnection *get();
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700141 static HostConnection *getWithThreadInfo(EGLThreadInfo* tInfo);
Lingfeng Yang200c7162016-06-13 08:39:28 -0700142 static void exit();
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800143
144 static HostConnection *createUnique();
145 static void teardownUnique(HostConnection* con);
146
keunyoungb85b2752013-03-08 12:28:03 -0800147 ~HostConnection();
148
Lingfeng Yang4d0ffea2019-10-12 16:51:59 -0700149 HostConnectionType connectionType() const {
150 return m_connectionType;
151 }
152
keunyoungb85b2752013-03-08 12:28:03 -0800153 GLEncoder *glEncoder();
154 GL2Encoder *gl2Encoder();
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800155 goldfish_vk::VkEncoder *vkEncoder();
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700156 ExtendedRCEncoderContext *rcEncoder();
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700157
158 // Returns rendernode fd, in case the stream is virtio-gpu based.
159 // Otherwise, attempts to create a rendernode fd assuming
160 // virtio-gpu is available.
161 int getOrCreateRendernodeFd();
162
Yahan Zhoub7f09082016-03-10 11:45:02 -0800163 ChecksumCalculator *checksumHelper() { return &m_checksumHelper; }
Alistair Strachan694745b2018-03-30 18:11:39 -0700164 Gralloc *grallocHelper() { return m_grallocHelper; }
keunyoungb85b2752013-03-08 12:28:03 -0800165
166 void flush() {
167 if (m_stream) {
168 m_stream->flush();
169 }
170 }
171
Lingfeng Yang200c7162016-06-13 08:39:28 -0700172 void setGrallocOnly(bool gralloc_only) {
173 m_grallocOnly = gralloc_only;
174 }
175
176 bool isGrallocOnly() const { return m_grallocOnly; }
177
David Reveman74e99bb2019-02-15 18:47:25 -0500178#ifdef __clang__
179#pragma clang diagnostic push
180#pragma clang diagnostic ignored "-Wthread-safety-analysis"
181#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800182 void lock() const { m_lock.lock(); }
183 void unlock() const { m_lock.unlock(); }
David Reveman74e99bb2019-02-15 18:47:25 -0500184#ifdef __clang__
185#pragma clang diagnostic pop
186#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800187
keunyoungb85b2752013-03-08 12:28:03 -0800188private:
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800189 // If the connection failed, |conn| is deleted.
190 // Returns NULL if connection failed.
191 static HostConnection* connect(HostConnection* con);
192
keunyoungb85b2752013-03-08 12:28:03 -0800193 HostConnection();
194 static gl_client_context_t *s_getGLContext();
195 static gl2_client_context_t *s_getGL2Context();
Lingfeng Yang18835352016-05-23 12:16:04 -0700196
Yurii Zubrytskyib2327642016-11-04 12:01:36 -0700197 const std::string& queryGLExtensions(ExtendedRCEncoderContext *rcEnc);
Yahan Zhoub7f09082016-03-10 11:45:02 -0800198 // setProtocol initilizes GL communication protocol for checksums
199 // should be called when m_rcEnc is created
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700200 void setChecksumHelper(ExtendedRCEncoderContext *rcEnc);
201 void queryAndSetSyncImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000202 void queryAndSetDmaImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange6556dc2017-01-09 12:04:12 -0800203 void queryAndSetGLESMaxVersion(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800204 void queryAndSetNoErrorState(ExtendedRCEncoderContext *rcEnc);
huansd96d5bd2018-10-15 14:32:46 -0700205 void queryAndSetHostCompositionImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangabc65162018-12-21 18:14:48 -0800206 void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
207 void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangc53e7472019-03-27 08:50:55 -0700208 void queryAndSetDeferredVulkanCommandsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangb55ed1c2019-06-20 15:57:08 -0700209 void queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang87f11962019-06-27 16:28:53 +0000210 void queryAndSetVulkanCreateResourcesWithRequirementsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangfc179c52020-02-04 07:04:57 -0800211 void queryAndSetVulkanIgnoredHandles(ExtendedRCEncoderContext *rcEnc);
Huan Song1c4af992019-06-24 17:05:54 -0700212 void queryAndSetYUVCache(ExtendedRCEncoderContext *mrcEnc);
Lingfeng Yang22e361a2019-10-12 07:19:00 -0700213 void queryAndSetAsyncUnmapBuffer(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang4c542412020-02-04 18:18:32 -0800214 void queryAndSetVirtioGpuNext(ExtendedRCEncoderContext *rcEnc);
Roman Kiryanov54331312020-03-12 14:05:34 -0700215 void queryHasSharedSlotsHostMemoryAllocator(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang2f39a1f2020-04-14 19:24:41 -0700216 void queryAndSetVulkanFreeMemorySync(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700217 void queryAndSetVirtioGpuNativeSync(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang4c056b22020-07-02 11:43:57 -0700218 void queryAndSetVulkanShaderFloat16Int8Support(ExtendedRCEncoderContext *rcEnc);
keunyoungb85b2752013-03-08 12:28:03 -0800219
220private:
Lingfeng Yang4d0ffea2019-10-12 16:51:59 -0700221 HostConnectionType m_connectionType;
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800222 GrallocType m_grallocType;
Yilong Li3c673cc2020-07-11 00:47:40 -0700223
224 std::unique_ptr<IOStream> m_stream;
225 std::unique_ptr<GLEncoder> m_glEnc;
226 std::unique_ptr<GL2Encoder> m_gl2Enc;
227 std::unique_ptr<goldfish_vk::VkEncoder> m_vkEnc;
228 std::unique_ptr<ExtendedRCEncoderContext> m_rcEnc;
229
Yahan Zhoub7f09082016-03-10 11:45:02 -0800230 ChecksumCalculator m_checksumHelper;
Yilong Li3c673cc2020-07-11 00:47:40 -0700231 Gralloc* m_grallocHelper = nullptr;
232 ProcessPipe* m_processPipe = nullptr;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700233 std::string m_glExtensions;
Lingfeng Yang200c7162016-06-13 08:39:28 -0700234 bool m_grallocOnly;
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800235 bool m_noHostError;
Lingfeng Yangad6f67d2019-02-19 15:47:53 -0800236#ifdef GOLDFISH_VULKAN
David Reveman74e99bb2019-02-15 18:47:25 -0500237 mutable std::mutex m_lock;
Lingfeng Yangad6f67d2019-02-19 15:47:53 -0800238#else
239 mutable android::Mutex m_lock;
240#endif
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700241 int m_rendernodeFd;
242 bool m_rendernodeFdOwned;
keunyoungb85b2752013-03-08 12:28:03 -0800243};
244
245#endif