blob: 2f9f83f89f0be516ef3663665190452c71f309d4 [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
Lingfeng Yang18835352016-05-23 12:16:04 -070033#include <string>
34
keunyoungb85b2752013-03-08 12:28:03 -080035class GLEncoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070036struct gl_client_context_t;
keunyoungb85b2752013-03-08 12:28:03 -080037class GL2Encoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070038struct gl2_client_context_t;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080039
40namespace goldfish_vk {
Lingfeng Yang6a283672018-11-01 13:37:56 -070041class VkEncoder;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080042}
keunyoungb85b2752013-03-08 12:28:03 -080043
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070044// ExtendedRCEncoderContext is an extended version of renderControl_encoder_context_t
Lingfeng Yangabc65162018-12-21 18:14:48 -080045// that will be used to track available emulator features.
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070046class ExtendedRCEncoderContext : public renderControl_encoder_context_t {
47public:
48 ExtendedRCEncoderContext(IOStream *stream, ChecksumCalculator *checksumCalculator)
Lingfeng Yangabc65162018-12-21 18:14:48 -080049 : renderControl_encoder_context_t(stream, checksumCalculator),
Roman Kiryanov2e9eba72019-05-17 09:25:05 -070050 m_dmaCxt(NULL) { }
Lingfeng Yangabc65162018-12-21 18:14:48 -080051 void setSyncImpl(SyncImpl syncImpl) { m_featureInfo.syncImpl = syncImpl; }
52 void setDmaImpl(DmaImpl dmaImpl) { m_featureInfo.dmaImpl = dmaImpl; }
huansd96d5bd2018-10-15 14:32:46 -070053 void setHostComposition(HostComposition hostComposition) {
Lingfeng Yangabc65162018-12-21 18:14:48 -080054 m_featureInfo.hostComposition = hostComposition; }
55 bool hasNativeSync() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V2; }
56 bool hasNativeSyncV3() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V3; }
huansd96d5bd2018-10-15 14:32:46 -070057 bool hasHostCompositionV1() const {
Lingfeng Yangabc65162018-12-21 18:14:48 -080058 return m_featureInfo.hostComposition == HOST_COMPOSITION_V1; }
59 DmaImpl getDmaVersion() const { return m_featureInfo.dmaImpl; }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000060 void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
61 virtual uint64_t lockAndWriteDma(void* data, uint32_t size) {
Roman Kiryanov2e9eba72019-05-17 09:25:05 -070062 if (m_dmaCxt) {
63 return lockAndWriteGoldfishDma(data, size, m_dmaCxt);
Roman Kiryanov943161f2019-03-22 12:57:52 -070064 } else {
65 ALOGE("%s: ERROR: No DMA context bound!", __func__);
Lingfeng Yang88c170c2016-11-30 00:52:35 +000066 return 0;
67 }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000068 }
Lingfeng Yangabc65162018-12-21 18:14:48 -080069 void setGLESMaxVersion(GLESMaxVersion ver) { m_featureInfo.glesMaxVersion = ver; }
70 GLESMaxVersion getGLESMaxVersion() const { return m_featureInfo.glesMaxVersion; }
71
72 const EmulatorFeatureInfo* featureInfo_const() const { return &m_featureInfo; }
73 EmulatorFeatureInfo* featureInfo() { return &m_featureInfo; }
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070074private:
Roman Kiryanov2e9eba72019-05-17 09:25:05 -070075 static uint64_t lockAndWriteGoldfishDma(void* data, uint32_t size,
76 struct goldfish_dma_context* dmaCxt) {
Roman Kiryanov943161f2019-03-22 12:57:52 -070077 ALOGV("%s(data=%p, size=%u): call", __func__, data, size);
78
79 goldfish_dma_write(dmaCxt, data, size);
80 uint64_t paddr = goldfish_dma_guest_paddr(dmaCxt);
81
82 ALOGV("%s: paddr=0x%llx", __func__, (unsigned long long)paddr);
83 return paddr;
84 }
85
Lingfeng Yangabc65162018-12-21 18:14:48 -080086 EmulatorFeatureInfo m_featureInfo;
Lingfeng Yang88c170c2016-11-30 00:52:35 +000087 struct goldfish_dma_context* m_dmaCxt;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070088};
89
Alistair Strachan694745b2018-03-30 18:11:39 -070090// Abstraction for gralloc handle conversion
91class Gralloc {
92public:
93 virtual uint32_t getHostHandle(native_handle_t const* handle) = 0;
94 virtual int getFormat(native_handle_t const* handle) = 0;
95 virtual ~Gralloc() {}
96};
97
98// Abstraction for process pipe helper
99class ProcessPipe {
100public:
101 virtual bool processPipeInit(renderControl_encoder_context_t *rcEnc) = 0;
102 virtual ~ProcessPipe() {}
103};
104
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700105struct EGLThreadInfo;
106
keunyoungb85b2752013-03-08 12:28:03 -0800107class HostConnection
108{
109public:
110 static HostConnection *get();
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700111 static HostConnection *getWithThreadInfo(EGLThreadInfo* tInfo);
Lingfeng Yang200c7162016-06-13 08:39:28 -0700112 static void exit();
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800113
114 static HostConnection *createUnique();
115 static void teardownUnique(HostConnection* con);
116
keunyoungb85b2752013-03-08 12:28:03 -0800117 ~HostConnection();
118
119 GLEncoder *glEncoder();
120 GL2Encoder *gl2Encoder();
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800121 goldfish_vk::VkEncoder *vkEncoder();
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700122 ExtendedRCEncoderContext *rcEncoder();
Yahan Zhoub7f09082016-03-10 11:45:02 -0800123 ChecksumCalculator *checksumHelper() { return &m_checksumHelper; }
Alistair Strachan694745b2018-03-30 18:11:39 -0700124 Gralloc *grallocHelper() { return m_grallocHelper; }
keunyoungb85b2752013-03-08 12:28:03 -0800125
126 void flush() {
127 if (m_stream) {
128 m_stream->flush();
129 }
130 }
131
Lingfeng Yang200c7162016-06-13 08:39:28 -0700132 void setGrallocOnly(bool gralloc_only) {
133 m_grallocOnly = gralloc_only;
134 }
135
136 bool isGrallocOnly() const { return m_grallocOnly; }
137
David Reveman74e99bb2019-02-15 18:47:25 -0500138#ifdef __clang__
139#pragma clang diagnostic push
140#pragma clang diagnostic ignored "-Wthread-safety-analysis"
141#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800142 void lock() const { m_lock.lock(); }
143 void unlock() const { m_lock.unlock(); }
David Reveman74e99bb2019-02-15 18:47:25 -0500144#ifdef __clang__
145#pragma clang diagnostic pop
146#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800147
keunyoungb85b2752013-03-08 12:28:03 -0800148private:
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800149 // If the connection failed, |conn| is deleted.
150 // Returns NULL if connection failed.
151 static HostConnection* connect(HostConnection* con);
152
keunyoungb85b2752013-03-08 12:28:03 -0800153 HostConnection();
154 static gl_client_context_t *s_getGLContext();
155 static gl2_client_context_t *s_getGL2Context();
Lingfeng Yang18835352016-05-23 12:16:04 -0700156
Yurii Zubrytskyib2327642016-11-04 12:01:36 -0700157 const std::string& queryGLExtensions(ExtendedRCEncoderContext *rcEnc);
Yahan Zhoub7f09082016-03-10 11:45:02 -0800158 // setProtocol initilizes GL communication protocol for checksums
159 // should be called when m_rcEnc is created
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700160 void setChecksumHelper(ExtendedRCEncoderContext *rcEnc);
161 void queryAndSetSyncImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000162 void queryAndSetDmaImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange6556dc2017-01-09 12:04:12 -0800163 void queryAndSetGLESMaxVersion(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800164 void queryAndSetNoErrorState(ExtendedRCEncoderContext *rcEnc);
huansd96d5bd2018-10-15 14:32:46 -0700165 void queryAndSetHostCompositionImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangabc65162018-12-21 18:14:48 -0800166 void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
167 void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangc53e7472019-03-27 08:50:55 -0700168 void queryAndSetDeferredVulkanCommandsSupport(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangb55ed1c2019-06-20 15:57:08 -0700169 void queryAndSetVulkanNullOptionalStringsSupport(ExtendedRCEncoderContext *rcEnc);
keunyoungb85b2752013-03-08 12:28:03 -0800170
171private:
172 IOStream *m_stream;
173 GLEncoder *m_glEnc;
174 GL2Encoder *m_gl2Enc;
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800175 goldfish_vk::VkEncoder *m_vkEnc;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700176 ExtendedRCEncoderContext *m_rcEnc;
Yahan Zhoub7f09082016-03-10 11:45:02 -0800177 ChecksumCalculator m_checksumHelper;
Alistair Strachan694745b2018-03-30 18:11:39 -0700178 Gralloc *m_grallocHelper;
179 ProcessPipe *m_processPipe;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700180 std::string m_glExtensions;
Lingfeng Yang200c7162016-06-13 08:39:28 -0700181 bool m_grallocOnly;
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800182 bool m_noHostError;
Lingfeng Yangad6f67d2019-02-19 15:47:53 -0800183#ifdef GOLDFISH_VULKAN
David Reveman74e99bb2019-02-15 18:47:25 -0500184 mutable std::mutex m_lock;
Lingfeng Yangad6f67d2019-02-19 15:47:53 -0800185#else
186 mutable android::Mutex m_lock;
187#endif
keunyoungb85b2752013-03-08 12:28:03 -0800188};
189
190#endif