1b85b2756d1e247f8314bb591700fb175d7346631keunyoung/* 2b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Copyright 2011 The Android Open Source Project 3b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 4b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Licensed under the Apache License, Version 2.0 (the "License"); 5b85b2756d1e247f8314bb591700fb175d7346631keunyoung* you may not use this file except in compliance with the License. 6b85b2756d1e247f8314bb591700fb175d7346631keunyoung* You may obtain a copy of the License at 7b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 8b85b2756d1e247f8314bb591700fb175d7346631keunyoung* http://www.apache.org/licenses/LICENSE-2.0 9b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 10b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Unless required by applicable law or agreed to in writing, software 11b85b2756d1e247f8314bb591700fb175d7346631keunyoung* distributed under the License is distributed on an "AS IS" BASIS, 12b85b2756d1e247f8314bb591700fb175d7346631keunyoung* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b85b2756d1e247f8314bb591700fb175d7346631keunyoung* See the License for the specific language governing permissions and 14b85b2756d1e247f8314bb591700fb175d7346631keunyoung* limitations under the License. 15b85b2756d1e247f8314bb591700fb175d7346631keunyoung*/ 16b85b2756d1e247f8314bb591700fb175d7346631keunyoung 17b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "EGLClientIface.h" 18b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "HostConnection.h" 19b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "GLEncoder.h" 20b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "GLES/gl.h" 21b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "GLES/glext.h" 22b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "ErrorLog.h" 23b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "gralloc_cb.h" 24b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "ThreadInfo.h" 25f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens#include "EGLImage.h" 26b85b2756d1e247f8314bb591700fb175d7346631keunyoung 27b85b2756d1e247f8314bb591700fb175d7346631keunyoung 28b85b2756d1e247f8314bb591700fb175d7346631keunyoung//XXX: fix this macro to get the context from fast tls path 29b85b2756d1e247f8314bb591700fb175d7346631keunyoung#define GET_CONTEXT GLEncoder * ctx = getEGLThreadInfo()->hostConn->glEncoder(); 30b85b2756d1e247f8314bb591700fb175d7346631keunyoung 31b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "gl_entry.cpp" 32b85b2756d1e247f8314bb591700fb175d7346631keunyoung 33b85b2756d1e247f8314bb591700fb175d7346631keunyoung//The functions table 34b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "gl_ftable.h" 35b85b2756d1e247f8314bb591700fb175d7346631keunyoung 36b85b2756d1e247f8314bb591700fb175d7346631keunyoungstatic EGLClient_eglInterface * s_egl = NULL; 37b85b2756d1e247f8314bb591700fb175d7346631keunyoungstatic EGLClient_glesInterface * s_gl = NULL; 38b85b2756d1e247f8314bb591700fb175d7346631keunyoung 39b85b2756d1e247f8314bb591700fb175d7346631keunyoung#define DEFINE_AND_VALIDATE_HOST_CONNECTION(ret) \ 40b85b2756d1e247f8314bb591700fb175d7346631keunyoung HostConnection *hostCon = HostConnection::get(); \ 41b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (!hostCon) { \ 42b85b2756d1e247f8314bb591700fb175d7346631keunyoung ALOGE("egl: Failed to get host connection\n"); \ 43b85b2756d1e247f8314bb591700fb175d7346631keunyoung return ret; \ 44b85b2756d1e247f8314bb591700fb175d7346631keunyoung } \ 45b85b2756d1e247f8314bb591700fb175d7346631keunyoung renderControl_encoder_context_t *rcEnc = hostCon->rcEncoder(); \ 46b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (!rcEnc) { \ 47b85b2756d1e247f8314bb591700fb175d7346631keunyoung ALOGE("egl: Failed to get renderControl encoder context\n"); \ 48b85b2756d1e247f8314bb591700fb175d7346631keunyoung return ret; \ 49b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 50b85b2756d1e247f8314bb591700fb175d7346631keunyoung 51b85b2756d1e247f8314bb591700fb175d7346631keunyoung//GL extensions 52f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capensvoid glEGLImageTargetTexture2DOES(void * self, GLenum target, GLeglImageOES img) 53b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 54e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner (void)self; 55e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner 56f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens DBG("glEGLImageTargetTexture2DOES v1 target=%#x img=%p", target, img); 57f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 58f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens EGLImage_t *image = (EGLImage_t*)img; 59f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 60f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens if (image->target == EGL_NATIVE_BUFFER_ANDROID) { 61f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens //TODO: check error - we don't have a way to set gl error 62f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens android_native_buffer_t* native_buffer = image->native_buffer; 63f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 64f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) { 65f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens return; 66f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens } 67f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 68f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens if (native_buffer->common.version != sizeof(android_native_buffer_t)) { 69f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens return; 70f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens } 71f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 72f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens GET_CONTEXT; 73f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens DEFINE_AND_VALIDATE_HOST_CONNECTION(); 74f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens 75f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens ctx->override2DTextureTarget(target); 76f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens rcEnc->rcBindTexture(rcEnc, 77f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens ((cb_handle_t *)(native_buffer->handle))->hostHandle); 78f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens ctx->restore2DTextureTarget(); 79b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 80f831502c8f9eae06f10a074d515d841816894ea2Nicolas Capens else if (image->target == EGL_GL_TEXTURE_2D_KHR) { 817eb60a50b92d49249e8a64f1aae43daf0747c8c8Nicolas Capens GET_CONTEXT; 827eb60a50b92d49249e8a64f1aae43daf0747c8c8Nicolas Capens ctx->override2DTextureTarget(target); 831278811fc4934c4c751815941408c94a2176f4c1Nicolas Capens GLeglImageOES hostImage = reinterpret_cast<GLeglImageOES>((intptr_t)image->host_egl_image); 841278811fc4934c4c751815941408c94a2176f4c1Nicolas Capens ctx->m_glEGLImageTargetTexture2DOES_enc(self, target, hostImage); 857eb60a50b92d49249e8a64f1aae43daf0747c8c8Nicolas Capens ctx->restore2DTextureTarget(); 86b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 87b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 88b85b2756d1e247f8314bb591700fb175d7346631keunyoung 89b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid glEGLImageTargetRenderbufferStorageOES(void *self, GLenum target, GLeglImageOES image) 90b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 91e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner (void)self; 92e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner (void)target; 93e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner 94b85b2756d1e247f8314bb591700fb175d7346631keunyoung DBG("glEGLImageTargetRenderbufferStorageOES v1 target=%#x image=%p", 95b85b2756d1e247f8314bb591700fb175d7346631keunyoung target, image); 96b85b2756d1e247f8314bb591700fb175d7346631keunyoung //TODO: check error - we don't have a way to set gl error 97b85b2756d1e247f8314bb591700fb175d7346631keunyoung android_native_buffer_t* native_buffer = (android_native_buffer_t*)image; 98b85b2756d1e247f8314bb591700fb175d7346631keunyoung 99b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) { 100b85b2756d1e247f8314bb591700fb175d7346631keunyoung return; 101b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 102b85b2756d1e247f8314bb591700fb175d7346631keunyoung 103b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (native_buffer->common.version != sizeof(android_native_buffer_t)) { 104b85b2756d1e247f8314bb591700fb175d7346631keunyoung return; 105b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 106b85b2756d1e247f8314bb591700fb175d7346631keunyoung 107b85b2756d1e247f8314bb591700fb175d7346631keunyoung DEFINE_AND_VALIDATE_HOST_CONNECTION(); 108b85b2756d1e247f8314bb591700fb175d7346631keunyoung rcEnc->rcBindRenderbuffer(rcEnc, 109b85b2756d1e247f8314bb591700fb175d7346631keunyoung ((cb_handle_t *)(native_buffer->handle))->hostHandle); 110b85b2756d1e247f8314bb591700fb175d7346631keunyoung 111b85b2756d1e247f8314bb591700fb175d7346631keunyoung return; 112b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 113b85b2756d1e247f8314bb591700fb175d7346631keunyoung 114b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid * getProcAddress(const char * procname) 115b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 116b85b2756d1e247f8314bb591700fb175d7346631keunyoung // search in GL function table 117b85b2756d1e247f8314bb591700fb175d7346631keunyoung for (int i=0; i<gl_num_funcs; i++) { 118b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (!strcmp(gl_funcs_by_name[i].name, procname)) { 119b85b2756d1e247f8314bb591700fb175d7346631keunyoung return gl_funcs_by_name[i].proc; 120b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 121b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 122b85b2756d1e247f8314bb591700fb175d7346631keunyoung return NULL; 123b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 124b85b2756d1e247f8314bb591700fb175d7346631keunyoung 125b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid finish() 126b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 127b85b2756d1e247f8314bb591700fb175d7346631keunyoung glFinish(); 128b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 129b85b2756d1e247f8314bb591700fb175d7346631keunyoung 130e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yangvoid getIntegerv(unsigned int pname, int* param) 131e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yang{ 132e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yang glGetIntegerv((GLenum)pname, (GLint*)param); 133e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yang} 134e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yang 135b85b2756d1e247f8314bb591700fb175d7346631keunyoungconst GLubyte *my_glGetString (void *self, GLenum name) 136b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 137e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner (void)self; 138e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner 139f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang //see ref in https://www.khronos.org/opengles/sdk/docs/man 140f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang //name in glGetString can be one of the following five values 141f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang switch (name) { 142f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang case GL_VERSION: 143f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang case GL_VENDOR: 144f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang case GL_RENDERER: 145f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang case GL_SHADING_LANGUAGE_VERSION: 146f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang case GL_EXTENSIONS: 147f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang if (s_egl) { 148f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang return (const GLubyte*)s_egl->getGLString(name); 149f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang } 150f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang break; 151f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang default: 152f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang GET_CONTEXT; 153f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang ctx->setError(GL_INVALID_ENUM); 154f8ccadcad38bd7dd8e41864f376392f6081d7217Lingfeng Yang break; 155b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 156b85b2756d1e247f8314bb591700fb175d7346631keunyoung return NULL; 157b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 158b85b2756d1e247f8314bb591700fb175d7346631keunyoung 159b85b2756d1e247f8314bb591700fb175d7346631keunyoungvoid init() 160b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 161b85b2756d1e247f8314bb591700fb175d7346631keunyoung GET_CONTEXT; 1627eb60a50b92d49249e8a64f1aae43daf0747c8c8Nicolas Capens ctx->m_glEGLImageTargetTexture2DOES_enc = ctx->glEGLImageTargetTexture2DOES; 1633afd44bdb52af3b26b2691e5f0164c16f2936e90David 'Digit' Turner ctx->glEGLImageTargetTexture2DOES = &glEGLImageTargetTexture2DOES; 1643afd44bdb52af3b26b2691e5f0164c16f2936e90David 'Digit' Turner ctx->glEGLImageTargetRenderbufferStorageOES = &glEGLImageTargetRenderbufferStorageOES; 1653afd44bdb52af3b26b2691e5f0164c16f2936e90David 'Digit' Turner ctx->glGetString = &my_glGetString; 166b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 167b85b2756d1e247f8314bb591700fb175d7346631keunyoung 168b85b2756d1e247f8314bb591700fb175d7346631keunyoungextern "C" { 169b85b2756d1e247f8314bb591700fb175d7346631keunyoungEGLClient_glesInterface * init_emul_gles(EGLClient_eglInterface *eglIface) 170b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 171b85b2756d1e247f8314bb591700fb175d7346631keunyoung s_egl = eglIface; 172b85b2756d1e247f8314bb591700fb175d7346631keunyoung 173b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (!s_gl) { 174b85b2756d1e247f8314bb591700fb175d7346631keunyoung s_gl = new EGLClient_glesInterface(); 175b85b2756d1e247f8314bb591700fb175d7346631keunyoung s_gl->getProcAddress = getProcAddress; 176b85b2756d1e247f8314bb591700fb175d7346631keunyoung s_gl->finish = finish; 177b85b2756d1e247f8314bb591700fb175d7346631keunyoung s_gl->init = init; 178e6556dcf96ef0b859fe04d8caf7c40fdd6d8d254Lingfeng Yang s_gl->getIntegerv = getIntegerv; 179b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 180b85b2756d1e247f8314bb591700fb175d7346631keunyoung 181b85b2756d1e247f8314bb591700fb175d7346631keunyoung return s_gl; 182b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 183b85b2756d1e247f8314bb591700fb175d7346631keunyoung} //extern 184b85b2756d1e247f8314bb591700fb175d7346631keunyoung 185b85b2756d1e247f8314bb591700fb175d7346631keunyoung 186