Home | History | Annotate | Download | only in OpenglSystemCommon
      1 /*
      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 
     19 #include "IOStream.h"
     20 #include "renderControl_enc.h"
     21 #include "ChecksumCalculator.h"
     22 #include "goldfish_dma.h"
     23 
     24 #include <string>
     25 
     26 class GLEncoder;
     27 struct gl_client_context_t;
     28 class GL2Encoder;
     29 struct gl2_client_context_t;
     30 
     31 // SyncImpl determines the presence of host/guest OpenGL fence sync
     32 // capabilities. It corresponds exactly to EGL_ANDROID_native_fence_sync
     33 // capability, but for the emulator, we need to make sure that
     34 // OpenGL pipe protocols match, so we use a special extension name
     35 // here.
     36 // SYNC_IMPL_NONE means that the native fence sync capability is
     37 // not present, and we will end up using the equivalent of glFinish
     38 // in order to preserve buffer swapping order.
     39 // SYNC_IMPL_NATIVE_SYNC means that we do have native fence sync
     40 // capability, and we will use a fence fd to synchronize buffer swaps.
     41 enum SyncImpl {
     42     SYNC_IMPL_NONE = 0,
     43     SYNC_IMPL_NATIVE_SYNC_V2 = 1,
     44     SYNC_IMPL_NATIVE_SYNC_V3 = 2,
     45 };
     46 
     47 // Interface:
     48 // Use the highest of v2 or v3 that show up, making us
     49 // SYNC_IMPL_NATIVE_SYNC_V2 or SYNC_IMPL_NATIVE_SYNC_V3.
     50 static const char kRCNativeSyncV2[] = "ANDROID_EMU_native_sync_v2";
     51 static const char kRCNativeSyncV3[] = "ANDROID_EMU_native_sync_v3";
     52 
     53 // DMA for OpenGL
     54 enum DmaImpl {
     55     DMA_IMPL_NONE = 0,
     56     DMA_IMPL_v1 = 1,
     57 };
     58 
     59 static const char kDmaExtStr_v1[] = "ANDROID_EMU_dma_v1";
     60 
     61 // OpenGL ES max supported version
     62 enum GLESMaxVersion {
     63     GLES_MAX_VERSION_2 = 0,
     64     GLES_MAX_VERSION_3_0 = 1,
     65     GLES_MAX_VERSION_3_1 = 2,
     66     GLES_MAX_VERSION_3_2 = 3,
     67 };
     68 
     69 static const char kGLESMaxVersion_2[] = "ANDROID_EMU_gles_max_version_2";
     70 static const char kGLESMaxVersion_3_0[] = "ANDROID_EMU_gles_max_version_3_0";
     71 static const char kGLESMaxVersion_3_1[] = "ANDROID_EMU_gles_max_version_3_1";
     72 static const char kGLESMaxVersion_3_2[] = "ANDROID_EMU_gles_max_version_3_2";
     73 
     74 // No querying errors from host extension
     75 static const char kGLESNoHostError[] = "ANDROID_EMU_gles_no_host_error";
     76 
     77 // ExtendedRCEncoderContext is an extended version of renderControl_encoder_context_t
     78 // that will be used to track SyncImpl.
     79 class ExtendedRCEncoderContext : public renderControl_encoder_context_t {
     80 public:
     81     ExtendedRCEncoderContext(IOStream *stream, ChecksumCalculator *checksumCalculator)
     82         : renderControl_encoder_context_t(stream, checksumCalculator) {
     83         m_dmaCxt = NULL;
     84         }
     85     void setSyncImpl(SyncImpl syncImpl) { m_syncImpl = syncImpl; }
     86     void setDmaImpl(DmaImpl dmaImpl) { m_dmaImpl = dmaImpl; }
     87     bool hasNativeSync() const { return m_syncImpl >= SYNC_IMPL_NATIVE_SYNC_V2; }
     88     bool hasNativeSyncV3() const { return m_syncImpl >= SYNC_IMPL_NATIVE_SYNC_V3; }
     89     DmaImpl getDmaVersion() const { return m_dmaImpl; }
     90     void bindDmaContext(struct goldfish_dma_context* cxt) { m_dmaCxt = cxt; }
     91     virtual uint64_t lockAndWriteDma(void* data, uint32_t size) {
     92         ALOGV("%s: call", __FUNCTION__);
     93         if (!m_dmaCxt) {
     94             ALOGE("%s: ERROR: No DMA context bound!",
     95                   __FUNCTION__);
     96             return 0;
     97         }
     98         goldfish_dma_lock(m_dmaCxt);
     99         goldfish_dma_write(m_dmaCxt, data, size);
    100         uint64_t paddr = goldfish_dma_guest_paddr(m_dmaCxt);
    101         ALOGV("%s: paddr=0x%llx", __FUNCTION__, paddr);
    102         return paddr;
    103     }
    104     void setGLESMaxVersion(GLESMaxVersion ver) { m_glesMaxVersion = ver; }
    105     GLESMaxVersion getGLESMaxVersion() const { return m_glesMaxVersion; }
    106 private:
    107     SyncImpl m_syncImpl;
    108     DmaImpl m_dmaImpl;
    109     struct goldfish_dma_context* m_dmaCxt;
    110     GLESMaxVersion m_glesMaxVersion;
    111 };
    112 
    113 struct EGLThreadInfo;
    114 
    115 class HostConnection
    116 {
    117 public:
    118     static HostConnection *get();
    119     static HostConnection *getWithThreadInfo(EGLThreadInfo* tInfo);
    120     static void exit();
    121     ~HostConnection();
    122 
    123     GLEncoder *glEncoder();
    124     GL2Encoder *gl2Encoder();
    125     ExtendedRCEncoderContext *rcEncoder();
    126     ChecksumCalculator *checksumHelper() { return &m_checksumHelper; }
    127 
    128     void flush() {
    129         if (m_stream) {
    130             m_stream->flush();
    131         }
    132     }
    133 
    134     void setGrallocOnly(bool gralloc_only) {
    135         m_grallocOnly = gralloc_only;
    136     }
    137 
    138     bool isGrallocOnly() const { return m_grallocOnly; }
    139 
    140     int getPipeFd() const { return m_pipeFd; }
    141 
    142 private:
    143     HostConnection();
    144     static gl_client_context_t  *s_getGLContext();
    145     static gl2_client_context_t *s_getGL2Context();
    146 
    147     const std::string& queryGLExtensions(ExtendedRCEncoderContext *rcEnc);
    148     // setProtocol initilizes GL communication protocol for checksums
    149     // should be called when m_rcEnc is created
    150     void setChecksumHelper(ExtendedRCEncoderContext *rcEnc);
    151     void queryAndSetSyncImpl(ExtendedRCEncoderContext *rcEnc);
    152     void queryAndSetDmaImpl(ExtendedRCEncoderContext *rcEnc);
    153     void queryAndSetGLESMaxVersion(ExtendedRCEncoderContext *rcEnc);
    154     void queryAndSetNoErrorState(ExtendedRCEncoderContext *rcEnc);
    155 
    156 private:
    157     IOStream *m_stream;
    158     GLEncoder   *m_glEnc;
    159     GL2Encoder  *m_gl2Enc;
    160     ExtendedRCEncoderContext *m_rcEnc;
    161     ChecksumCalculator m_checksumHelper;
    162     std::string m_glExtensions;
    163     bool m_grallocOnly;
    164     int m_pipeFd;
    165     bool m_noHostError;
    166 };
    167 
    168 #endif
    169