blob: 098dadc952105551db6ad960f3c740505417076f [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
David Reveman74e99bb2019-02-15 18:47:25 -050027#include <mutex>
Lingfeng Yang18835352016-05-23 12:16:04 -070028#include <string>
29
keunyoungb85b2752013-03-08 12:28:03 -080030class GLEncoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070031struct gl_client_context_t;
keunyoungb85b2752013-03-08 12:28:03 -080032class GL2Encoder;
Yahan Zhoue8cf63d2016-09-22 12:33:50 -070033struct gl2_client_context_t;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080034
35namespace goldfish_vk {
Lingfeng Yang6a283672018-11-01 13:37:56 -070036class VkEncoder;
Lingfeng Yangb1d90102018-11-29 16:10:36 -080037}
keunyoungb85b2752013-03-08 12:28:03 -080038
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070039// ExtendedRCEncoderContext is an extended version of renderControl_encoder_context_t
Lingfeng Yangabc65162018-12-21 18:14:48 -080040// that will be used to track available emulator features.
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070041class ExtendedRCEncoderContext : public renderControl_encoder_context_t {
42public:
43 ExtendedRCEncoderContext(IOStream *stream, ChecksumCalculator *checksumCalculator)
Lingfeng Yangabc65162018-12-21 18:14:48 -080044 : renderControl_encoder_context_t(stream, checksumCalculator),
45 m_dmaCxt(NULL) { }
46 void setSyncImpl(SyncImpl syncImpl) { m_featureInfo.syncImpl = syncImpl; }
47 void setDmaImpl(DmaImpl dmaImpl) { m_featureInfo.dmaImpl = dmaImpl; }
huansd96d5bd2018-10-15 14:32:46 -070048 void setHostComposition(HostComposition hostComposition) {
Lingfeng Yangabc65162018-12-21 18:14:48 -080049 m_featureInfo.hostComposition = hostComposition; }
50 bool hasNativeSync() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V2; }
51 bool hasNativeSyncV3() const { return m_featureInfo.syncImpl >= SYNC_IMPL_NATIVE_SYNC_V3; }
huansd96d5bd2018-10-15 14:32:46 -070052 bool hasHostCompositionV1() const {
Lingfeng Yangabc65162018-12-21 18:14:48 -080053 return m_featureInfo.hostComposition == HOST_COMPOSITION_V1; }
54 DmaImpl getDmaVersion() const { return m_featureInfo.dmaImpl; }
Lingfeng Yang88c170c2016-11-30 00:52:35 +000055 void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
56 virtual uint64_t lockAndWriteDma(void* data, uint32_t size) {
57 ALOGV("%s: call", __FUNCTION__);
58 if (!m_dmaCxt) {
59 ALOGE("%s: ERROR: No DMA context bound!",
60 __FUNCTION__);
61 return 0;
62 }
63 goldfish_dma_lock(m_dmaCxt);
64 goldfish_dma_write(m_dmaCxt, data, size);
65 uint64_t paddr = goldfish_dma_guest_paddr(m_dmaCxt);
Lingfeng Yange38d15c2018-09-24 16:24:01 -070066 ALOGV("%s: paddr=0x%llx", __FUNCTION__, (unsigned long long)paddr);
Lingfeng Yang88c170c2016-11-30 00:52:35 +000067 return paddr;
68 }
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:
Lingfeng Yangabc65162018-12-21 18:14:48 -080075 EmulatorFeatureInfo m_featureInfo;
Lingfeng Yang88c170c2016-11-30 00:52:35 +000076 struct goldfish_dma_context* m_dmaCxt;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -070077};
78
Alistair Strachan694745b2018-03-30 18:11:39 -070079// Abstraction for gralloc handle conversion
80class Gralloc {
81public:
82 virtual uint32_t getHostHandle(native_handle_t const* handle) = 0;
83 virtual int getFormat(native_handle_t const* handle) = 0;
84 virtual ~Gralloc() {}
85};
86
87// Abstraction for process pipe helper
88class ProcessPipe {
89public:
90 virtual bool processPipeInit(renderControl_encoder_context_t *rcEnc) = 0;
91 virtual ~ProcessPipe() {}
92};
93
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -070094struct EGLThreadInfo;
95
keunyoungb85b2752013-03-08 12:28:03 -080096class HostConnection
97{
98public:
99 static HostConnection *get();
Lingfeng Yang6e99bcf2017-04-07 13:48:13 -0700100 static HostConnection *getWithThreadInfo(EGLThreadInfo* tInfo);
Lingfeng Yang200c7162016-06-13 08:39:28 -0700101 static void exit();
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800102
103 static HostConnection *createUnique();
104 static void teardownUnique(HostConnection* con);
105
keunyoungb85b2752013-03-08 12:28:03 -0800106 ~HostConnection();
107
108 GLEncoder *glEncoder();
109 GL2Encoder *gl2Encoder();
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800110 goldfish_vk::VkEncoder *vkEncoder();
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700111 ExtendedRCEncoderContext *rcEncoder();
Yahan Zhoub7f09082016-03-10 11:45:02 -0800112 ChecksumCalculator *checksumHelper() { return &m_checksumHelper; }
Alistair Strachan694745b2018-03-30 18:11:39 -0700113 Gralloc *grallocHelper() { return m_grallocHelper; }
keunyoungb85b2752013-03-08 12:28:03 -0800114
115 void flush() {
116 if (m_stream) {
117 m_stream->flush();
118 }
119 }
120
Lingfeng Yang200c7162016-06-13 08:39:28 -0700121 void setGrallocOnly(bool gralloc_only) {
122 m_grallocOnly = gralloc_only;
123 }
124
125 bool isGrallocOnly() const { return m_grallocOnly; }
126
David Reveman74e99bb2019-02-15 18:47:25 -0500127#ifdef __clang__
128#pragma clang diagnostic push
129#pragma clang diagnostic ignored "-Wthread-safety-analysis"
130#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800131 void lock() const { m_lock.lock(); }
132 void unlock() const { m_lock.unlock(); }
David Reveman74e99bb2019-02-15 18:47:25 -0500133#ifdef __clang__
134#pragma clang diagnostic pop
135#endif
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800136
keunyoungb85b2752013-03-08 12:28:03 -0800137private:
Lingfeng Yang1ec6f432019-01-23 10:04:52 -0800138 // If the connection failed, |conn| is deleted.
139 // Returns NULL if connection failed.
140 static HostConnection* connect(HostConnection* con);
141
keunyoungb85b2752013-03-08 12:28:03 -0800142 HostConnection();
143 static gl_client_context_t *s_getGLContext();
144 static gl2_client_context_t *s_getGL2Context();
Lingfeng Yang18835352016-05-23 12:16:04 -0700145
Yurii Zubrytskyib2327642016-11-04 12:01:36 -0700146 const std::string& queryGLExtensions(ExtendedRCEncoderContext *rcEnc);
Yahan Zhoub7f09082016-03-10 11:45:02 -0800147 // setProtocol initilizes GL communication protocol for checksums
148 // should be called when m_rcEnc is created
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700149 void setChecksumHelper(ExtendedRCEncoderContext *rcEnc);
150 void queryAndSetSyncImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yang88c170c2016-11-30 00:52:35 +0000151 void queryAndSetDmaImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange6556dc2017-01-09 12:04:12 -0800152 void queryAndSetGLESMaxVersion(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800153 void queryAndSetNoErrorState(ExtendedRCEncoderContext *rcEnc);
huansd96d5bd2018-10-15 14:32:46 -0700154 void queryAndSetHostCompositionImpl(ExtendedRCEncoderContext *rcEnc);
Lingfeng Yangabc65162018-12-21 18:14:48 -0800155 void queryAndSetDirectMemSupport(ExtendedRCEncoderContext *rcEnc);
156 void queryAndSetVulkanSupport(ExtendedRCEncoderContext *rcEnc);
keunyoungb85b2752013-03-08 12:28:03 -0800157
158private:
159 IOStream *m_stream;
160 GLEncoder *m_glEnc;
161 GL2Encoder *m_gl2Enc;
Lingfeng Yangb1d90102018-11-29 16:10:36 -0800162 goldfish_vk::VkEncoder *m_vkEnc;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700163 ExtendedRCEncoderContext *m_rcEnc;
Yahan Zhoub7f09082016-03-10 11:45:02 -0800164 ChecksumCalculator m_checksumHelper;
Alistair Strachan694745b2018-03-30 18:11:39 -0700165 Gralloc *m_grallocHelper;
166 ProcessPipe *m_processPipe;
Lingfeng Yang4f12b8d2016-07-13 16:26:10 -0700167 std::string m_glExtensions;
Lingfeng Yang200c7162016-06-13 08:39:28 -0700168 bool m_grallocOnly;
Lingfeng Yange980c7a2018-01-12 14:50:18 -0800169 bool m_noHostError;
David Reveman74e99bb2019-02-15 18:47:25 -0500170 mutable std::mutex m_lock;
keunyoungb85b2752013-03-08 12:28:03 -0800171};
172
173#endif