blob: d954c0240d4e1420f8c900763945b999ad65d4f4 [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"
Yilong Li1d6ca342020-11-02 13:13:31 -080023#ifdef __Fuchsia__
24struct goldfish_dma_context;
25#else
Lingfeng Yang88c170c2016-11-30 00:52:35 +000026#include "goldfish_dma.h"
Yilong Li1d6ca342020-11-02 13:13:31 -080027#endif
keunyoungb85b2752013-03-08 12:28:03 -080028
Alistair Strachan694745b2018-03-30 18:11:39 -070029#include <cutils/native_handle.h>
Lingfeng Yang1ec6f432019-01-23 10:04:52 -080030
Lingfeng Yang6f9871b2020-08-17 15:46:53 -070031#ifdef GFXSTREAM
David Reveman74e99bb2019-02-15 18:47:25 -050032#include <mutex>
Lingfeng Yangad6f67d2019-02-19 15:47:53 -080033#else
34#include <utils/threads.h>
35#endif
36
Yilong Li3c673cc2020-07-11 00:47:40 -070037#include <memory>
Gurchetan Singha1292d92021-10-22 16:02:25 -070038#include <cstring>
Lingfeng Yang18835352016-05-23 12:16:04 -070039
keunyoungb85b2752013-03-08 12:28:03 -080040class GLEncoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070041struct gl_client_context_t;
keunyoungb85b2752013-03-08 12:28:03 -080042class GL2Encoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070043struct gl2_client_context_t;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080044
45namespace goldfish_vk {
Lingfeng Yang6a283672018-11-01 13:37:56 -070046class VkEncoder;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080047}
keunyoungb85b2752013-03-08 12:28:03 -080048
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070049// ExtendedRCEncoderContext is an extended version of renderControl_encoder_context_t
Lingfeng Yangabc65162018-12-21 18:14:48 -080050// that will be used to track available emulator features.
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070051class ExtendedRCEncoderContext : public renderControl_encoder_context_t {
52public:
53 ExtendedRCEncoderContext(IOStream *stream, ChecksumCalculator *checksumCalculator)
Lingfeng Yangabc65162018-12-21 18:14:48 -080054 : renderControl_encoder_context_t(stream, checksumCalculator),
Roman Kiryanovc5731552019-10-09 14:20:21 -070055 m_dmaCxt(NULL), m_dmaPtr(NULL), m_dmaPhysAddr(0) { }
Lingfeng Yangabc65162018-12-21 18:14:48 -080056 void setSyncImpl(SyncImpl syncImpl) { m_featureInfo.syncImpl = syncImpl; }
57 void setDmaImpl(DmaImpl dmaImpl) { m_featureInfo.dmaImpl = dmaImpl; }
huansd96d5bd2018-10-15 14:32:46 -070058 void setHostComposition(HostComposition hostComposition) {
Lingfeng Yangabc65162018-12-21 18:14:48 -080059 m_featureInfo.hostComposition = hostComposition; }
60 bool hasNativeSync() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V2; }
61 bool hasNativeSyncV3() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V3; }
Lingfeng Yang65cd34f2019-10-24 09:30:45 -070062 bool hasNativeSyncV4() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V4; }
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -070063 bool hasVirtioGpuNativeSync() const { return m_featureInfo.hasVirtioGpuNativeSync; }
huansd96d5bd2018-10-15 14:32:46 -070064 bool hasHostCompositionV1() const {
Lingfeng Yangabc65162018-12-21 18:14:48 -080065 return m_featureInfo.hostComposition == HOST_COMPOSITION_V1; }
Huihong Luoa38b63c2019-08-08 16:14:34 -070066 bool hasHostCompositionV2() const {
67 return m_featureInfo.hostComposition == HOST_COMPOSITION_V2; }
Huan Song1c4af992019-06-24 17:05:54 -070068 bool hasYUVCache() const {
69 return m_featureInfo.hasYUVCache; }
Lingfeng Yang22e361a2019-10-12 07:19:00 -070070 bool hasAsyncUnmapBuffer() const {
71 return m_featureInfo.hasAsyncUnmapBuffer; }
Lingfeng Yangc49d89d2020-08-20 12:33:04 -070072 bool hasHostSideTracing() const {
73 return m_featureInfo.hasHostSideTracing;
74 }
Lingfeng Yangeefefd42020-11-06 03:28:21 -080075 bool hasAsyncFrameCommands() const {
76 return m_featureInfo.hasAsyncFrameCommands;
77 }
Kaiyi Li97a5cf22021-04-21 16:12:01 -070078 bool hasSyncBufferData() const {
79 return m_featureInfo.hasSyncBufferData; }
Huan Song3b46fcc2021-09-20 21:28:44 -070080 bool hasHWCMultiConfigs() const {
81 return m_featureInfo.hasHWCMultiConfigs;
82 }
Lingfeng Yangabc65162018-12-21 18:14:48 -080083 DmaImpl getDmaVersion() const { return m_featureInfo.dmaImpl; }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000084 void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
Roman Kiryanovc5731552019-10-09 14:20:21 -070085 void bindDmaDirectly(void* dmaPtr, uint64_t dmaPhysAddr) {
86 m_dmaPtr = dmaPtr;
87 m_dmaPhysAddr = dmaPhysAddr;
Roman Kiryanov382ce562019-06-03 12:39:58 -070088 }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000089 virtual uint64_t lockAndWriteDma(void* data, uint32_t size) {
Roman Kiryanovc5731552019-10-09 14:20:21 -070090 if (m_dmaPtr && m_dmaPhysAddr) {
Lingfeng Yangd3672112021-08-04 17:00:07 -070091 if (data != m_dmaPtr) {
92 memcpy(m_dmaPtr, data, size);
93 }
Roman Kiryanovc5731552019-10-09 14:20:21 -070094 return m_dmaPhysAddr;
Roman Kiryanov382ce562019-06-03 12:39:58 -070095 } else if (m_dmaCxt) {
96 return writeGoldfishDma(data, size, m_dmaCxt);
Roman Kiryanov943161f2019-03-22 12:57:52 -070097 } else {
98 ALOGE("%s: ERROR: No DMA context bound!", __func__);
Lingfeng Yang88c170c2016-11-30 00:52:35 +000099 return 0;
100 }
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000101 }
Lingfeng Yangabc65162018-12-21 18:14:48 -0800102 void setGLESMaxVersion(GLESMaxVersion ver) { m_featureInfo.glesMaxVersion = ver; }
103 GLESMaxVersion getGLESMaxVersion() const { return m_featureInfo.glesMaxVersion; }
Roman Kiryanov382ce562019-06-03 12:39:58 -0700104 bool hasDirectMem() const {
105#ifdef HOST_BUILD
106 // unit tests do not support restoring "guest" ram because there is no VM
107 return false;
108#else
109 return m_featureInfo.hasDirectMem;
110#endif
111 }
Lingfeng Yangabc65162018-12-21 18:14:48 -0800112
113 const EmulatorFeatureInfo* featureInfo_const() const { return &m_featureInfo; }
114 EmulatorFeatureInfo* featureInfo() { return &m_featureInfo; }
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700115private:
Roman Kiryanov382ce562019-06-03 12:39:58 -0700116 static uint64_t writeGoldfishDma(void* data, uint32_t size,
117 struct goldfish_dma_context* dmaCxt) {
Yilong Li1d6ca342020-11-02 13:13:31 -0800118#ifdef __Fuchsia__
119 ALOGE("%s Not implemented!", __FUNCTION__);
120 return 0u;
121#else
Roman Kiryanov943161f2019-03-22 12:57:52 -0700122 ALOGV("%s(data=%p, size=%u): call", __func__, data, size);
123
124 goldfish_dma_write(dmaCxt, data, size);
125 uint64_t paddr = goldfish_dma_guest_paddr(dmaCxt);
126
127 ALOGV("%s: paddr=0x%llx", __func__, (unsigned long long)paddr);
128 return paddr;
Yilong Li1d6ca342020-11-02 13:13:31 -0800129#endif
Roman Kiryanov943161f2019-03-22 12:57:52 -0700130 }
131
Lingfeng Yangabc65162018-12-21 18:14:48 -0800132 EmulatorFeatureInfo m_featureInfo;
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000133 struct goldfish_dma_context* m_dmaCxt;
Roman Kiryanovc5731552019-10-09 14:20:21 -0700134 void* m_dmaPtr;
135 uint64_t m_dmaPhysAddr;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700136};
137
Alistair Strachan694745b2018-03-30 18:11:39 -0700138// Abstraction for gralloc handle conversion
139class Gralloc {
140public:
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800141 virtual uint32_t createColorBuffer(
Gurchetan Singh0f780ad2021-10-26 13:05:05 -0700142 ExtendedRCEncoderContext* rcEnc, int width, int height, uint32_t glformat) = 0;
Alistair Strachan694745b2018-03-30 18:11:39 -0700143 virtual uint32_t getHostHandle(native_handle_t const* handle) = 0;
144 virtual int getFormat(native_handle_t const* handle) = 0;
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800145 virtual size_t getAllocatedSize(native_handle_t const* handle) = 0;
Alistair Strachan694745b2018-03-30 18:11:39 -0700146 virtual ~Gralloc() {}
147};
148
149// Abstraction for process pipe helper
150class ProcessPipe {
151public:
Gurchetan Singh6adffbd2022-03-16 19:22:19 -0700152 virtual bool processPipeInit(int stream_handle, HostConnectionType connType, renderControl_encoder_context_t *rcEnc) = 0;
Alistair Strachan694745b2018-03-30 18:11:39 -0700153 virtual ~ProcessPipe() {}
154};
155
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700156struct EGLThreadInfo;
157
Gurchetan Singh6f7f30c2022-02-14 15:37:32 -0800158// Rutabaga capsets.
159#define VIRTIO_GPU_CAPSET_NONE 0
160#define VIRTIO_GPU_CAPSET_VIRGL 1
161#define VIRTIO_GPU_CAPSET_VIRGL2 2
162#define VIRTIO_GPU_CAPSET_GFXSTREAM 3
163#define VIRTIO_GPU_CAPSET_VENUS 4
164#define VIRTIO_GPU_CAPSET_CROSS_DOMAIN 5
Lingfeng Yang4d0ffea2019-10-12 16:51:59 -0700165
keunyoungb85b2752013-03-08 12:28:03 -0800166class HostConnection
167{
168public:
169 static HostConnection *get();
Gurchetan Singh6f7f30c2022-02-14 15:37:32 -0800170 static HostConnection *getOrCreate(uint32_t capset_id);
171
172 static HostConnection *getWithThreadInfo(EGLThreadInfo* tInfo,
173 uint32_t capset_id = VIRTIO_GPU_CAPSET_NONE);
Lingfeng Yang200c7162016-06-13 08:39:28 -0700174 static void exit();
Lingfeng Yang25bca5a2020-10-21 09:52:10 -0700175 static void exitUnclean(); // for testing purposes
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800176
Gurchetan Singh6f7f30c2022-02-14 15:37:32 -0800177 static std::unique_ptr<HostConnection> createUnique(uint32_t capset_id = VIRTIO_GPU_CAPSET_NONE);
Yilong Li8a87f172020-07-11 01:48:31 -0700178 HostConnection(const HostConnection&) = delete;
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800179
keunyoungb85b2752013-03-08 12:28:03 -0800180 ~HostConnection();
181
182 GLEncoder *glEncoder();
183 GL2Encoder *gl2Encoder();
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800184 goldfish_vk::VkEncoder *vkEncoder();
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700185 ExtendedRCEncoderContext *rcEncoder();
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700186
Gurchetan Singha9f27912022-02-09 12:56:27 -0800187 int getRendernodeFd() { return m_rendernodeFd; }
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700188
Yahan Zhoub7f09082016-03-10 11:45:02 -0800189 ChecksumCalculator *checksumHelper() { return &m_checksumHelper; }
Alistair Strachan694745b2018-03-30 18:11:39 -0700190 Gralloc *grallocHelper() { return m_grallocHelper; }
keunyoungb85b2752013-03-08 12:28:03 -0800191
192 void flush() {
193 if (m_stream) {
194 m_stream->flush();
195 }
196 }
197
Lingfeng Yang200c7162016-06-13 08:39:28 -0700198 void setGrallocOnly(bool gralloc_only) {
199 m_grallocOnly = gralloc_only;
200 }
201
202 bool isGrallocOnly() const { return m_grallocOnly; }
203
David Reveman74e99bb2019-02-15 18:47:25 -0500204#ifdef __clang__
205#pragma clang diagnostic push
206#pragma clang diagnostic ignored "-Wthread-safety-analysis"
207#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800208 void lock() const { m_lock.lock(); }
209 void unlock() const { m_lock.unlock(); }
David Reveman74e99bb2019-02-15 18:47:25 -0500210#ifdef __clang__
211#pragma clang diagnostic pop
212#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800213
Lingfeng Yang25bca5a2020-10-21 09:52:10 -0700214 bool exitUncleanly; // for testing purposes
215
keunyoungb85b2752013-03-08 12:28:03 -0800216private:
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800217 // If the connection failed, |conn| is deleted.
218 // Returns NULL if connection failed.
Gurchetan Singh6f7f30c2022-02-14 15:37:32 -0800219 static std::unique_ptr<HostConnection> connect(uint32_t capset_id);
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800220
keunyoungb85b2752013-03-08 12:28:03 -0800221 HostConnection();
222 static gl_client_context_t *s_getGLContext();
223 static gl2_client_context_t *s_getGL2Context();
Lingfeng Yang18835352016-05-23 12:16:04 -0700224
Yurii Zubrytskyib2327642016-11-04 12:01:36 -0700225 const std::string& queryGLExtensions(ExtendedRCEncoderContext *rcEnc);
Yahan Zhoub7f09082016-03-10 11:45:02 -0800226 // setProtocol initilizes GL communication protocol for checksums
227 // should be called when m_rcEnc is created
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700228 void setChecksumHelper(ExtendedRCEncoderContext *rcEnc);
229 void queryAndSetSyncImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000230 void queryAndSetDmaImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange6556dc2017-01-09 12:04:12 -0800231 void queryAndSetGLESMaxVersion(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800232 void queryAndSetNoErrorState(ExtendedRCEncoderContext *rcEnc);
huansd96d5bd2018-10-15 14:32:46 -0700233 void queryAndSetHostCompositionImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangabc65162018-12-21 18:14:48 -0800234 void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
235 void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangc53e7472019-03-27 08:50:55 -0700236 void queryAndSetDeferredVulkanCommandsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangb55ed1c2019-06-20 15:57:08 -0700237 void queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang87f11962019-06-27 16:28:53 +0000238 void queryAndSetVulkanCreateResourcesWithRequirementsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangfc179c52020-02-04 07:04:57 -0800239 void queryAndSetVulkanIgnoredHandles(ExtendedRCEncoderContext *rcEnc);
Huan Song1c4af992019-06-24 17:05:54 -0700240 void queryAndSetYUVCache(ExtendedRCEncoderContext *mrcEnc);
Lingfeng Yang22e361a2019-10-12 07:19:00 -0700241 void queryAndSetAsyncUnmapBuffer(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang4c542412020-02-04 18:18:32 -0800242 void queryAndSetVirtioGpuNext(ExtendedRCEncoderContext *rcEnc);
Roman Kiryanov54331312020-03-12 14:05:34 -0700243 void queryHasSharedSlotsHostMemoryAllocator(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang2f39a1f2020-04-14 19:24:41 -0700244 void queryAndSetVulkanFreeMemorySync(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700245 void queryAndSetVirtioGpuNativeSync(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang4c056b22020-07-02 11:43:57 -0700246 void queryAndSetVulkanShaderFloat16Int8Support(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangf89f75d2020-07-09 17:42:33 -0700247 void queryAndSetVulkanAsyncQueueSubmitSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangc49d89d2020-08-20 12:33:04 -0700248 void queryAndSetHostSideTracingSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangeefefd42020-11-06 03:28:21 -0800249 void queryAndSetAsyncFrameCommands(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange610fb72021-01-22 11:29:22 -0800250 void queryAndSetVulkanQueueSubmitWithCommandsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangd44959e2021-02-17 14:49:53 -0800251 void queryAndSetVulkanBatchedDescriptorSetUpdateSupport(ExtendedRCEncoderContext *rcEnc);
Kaiyi Li97a5cf22021-04-21 16:12:01 -0700252 void queryAndSetSyncBufferData(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang83fab8b2021-07-15 12:52:09 -0700253 void queryAndSetVulkanAsyncQsri(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang46b2f1c2021-08-05 19:48:49 -0700254 void queryAndSetReadColorBufferDma(ExtendedRCEncoderContext *rcEnc);
Huan Song3b46fcc2021-09-20 21:28:44 -0700255 void queryAndSetHWCMultiConfigs(ExtendedRCEncoderContext* rcEnc);
Yilong Lid13a3892021-04-25 12:15:35 -0700256 GLint queryVersion(ExtendedRCEncoderContext* rcEnc);
keunyoungb85b2752013-03-08 12:28:03 -0800257
258private:
Lingfeng Yang4d0ffea2019-10-12 16:51:59 -0700259 HostConnectionType m_connectionType;
Lingfeng Yangb36e3f52020-01-14 12:59:23 -0800260 GrallocType m_grallocType;
Yilong Li3c673cc2020-07-11 00:47:40 -0700261
Lingfeng Yangfa7efc32020-08-27 09:10:42 -0700262 // intrusively refcounted
263 IOStream* m_stream = nullptr;
264
Yilong Li3c673cc2020-07-11 00:47:40 -0700265 std::unique_ptr<GLEncoder> m_glEnc;
266 std::unique_ptr<GL2Encoder> m_gl2Enc;
Lingfeng Yangfa7efc32020-08-27 09:10:42 -0700267
268 // intrusively refcounted
269 goldfish_vk::VkEncoder* m_vkEnc = nullptr;
Yilong Li3c673cc2020-07-11 00:47:40 -0700270 std::unique_ptr<ExtendedRCEncoderContext> m_rcEnc;
271
Yahan Zhoub7f09082016-03-10 11:45:02 -0800272 ChecksumCalculator m_checksumHelper;
Yilong Li3c673cc2020-07-11 00:47:40 -0700273 Gralloc* m_grallocHelper = nullptr;
274 ProcessPipe* m_processPipe = nullptr;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700275 std::string m_glExtensions;
Lingfeng Yang200c7162016-06-13 08:39:28 -0700276 bool m_grallocOnly;
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800277 bool m_noHostError;
Lingfeng Yang6f9871b2020-08-17 15:46:53 -0700278#ifdef GFXSTREAM
David Reveman74e99bb2019-02-15 18:47:25 -0500279 mutable std::mutex m_lock;
Lingfeng Yangad6f67d2019-02-19 15:47:53 -0800280#else
281 mutable android::Mutex m_lock;
282#endif
Lingfeng Yangf9fc6ad2020-05-27 09:57:13 -0700283 int m_rendernodeFd;
keunyoungb85b2752013-03-08 12:28:03 -0800284};
285
286#endif