From 79b1bad09ac0df4bd5ec93483f7fc8a983301327 Mon Sep 17 00:00:00 2001 From: Yochai Shefi Simchon Date: Tue, 12 Jul 2011 15:50:46 +0300 Subject: [PATCH] 2.0 translator: support ARB_ES2_compatibility stuff The ARB_ES2_compatibility extension supports several GLES 2.0 enums and functions on OpenGL 2.0. Seems it exists on nVidia drivers, but not on ATI's. So implement its functionality in case it doesn't exist on the host. Change-Id: Id96f0c8036a7a7d36fca0c85ab5f57bf4b1583aa --- .../libs/Translator/GLES_V2/GLESv2Imp.cpp | 124 +++++++++++++++++- .../libs/Translator/GLcommon/GLDispatch.cpp | 6 +- .../libs/Translator/GLcommon/GLEScontext.cpp | 3 + .../Translator/include/GLcommon/GLEScontext.h | 4 +- 4 files changed, 126 insertions(+), 11 deletions(-) diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp index fa8d21fe1..d1f6a99c7 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp @@ -639,8 +639,32 @@ GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* nam GL_APICALL void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params){ GET_CTX(); - if (!ctx->glGetBooleanv(pname,params)) { - ctx->dispatcher().glGetBooleanv(pname,params); + + if (ctx->glGetBooleanv(pname,params)) + { + return; + } + + switch(pname) + { + case GL_SHADER_COMPILER: + case GL_SHADER_BINARY_FORMATS: + case GL_NUM_SHADER_BINARY_FORMATS: + case GL_MAX_VERTEX_UNIFORM_VECTORS: + case GL_MAX_VARYING_VECTORS: + case GL_MAX_FRAGMENT_UNIFORM_VECTORS: + if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY) + ctx->dispatcher().glGetBooleanv(pname,params); + else + { + GLint iparam; + glGetIntegerv(pname,&iparam); + *params = (iparam != 0); + } + break; + + default: + ctx->dispatcher().glGetBooleanv(pname,params); } } @@ -672,10 +696,13 @@ GL_APICALL GLenum GL_APIENTRY glGetError(void){ GL_APICALL void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){ GET_CTX(); + if (ctx->glGetFloatv(pname,params)) { return; } + GLint i; + switch (pname) { case GL_CURRENT_PROGRAM: case GL_FRAMEBUFFER_BINDING: @@ -698,6 +725,21 @@ GL_APICALL void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){ } break; + case GL_SHADER_COMPILER: + case GL_SHADER_BINARY_FORMATS: + case GL_NUM_SHADER_BINARY_FORMATS: + case GL_MAX_VERTEX_UNIFORM_VECTORS: + case GL_MAX_VARYING_VECTORS: + case GL_MAX_FRAGMENT_UNIFORM_VECTORS: + if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY) + ctx->dispatcher().glGetFloatv(pname,params); + else + { + glGetIntegerv(pname,&i); + *params = (GLfloat)i; + } + break; + default: ctx->dispatcher().glGetFloatv(pname,params); } @@ -711,6 +753,7 @@ GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){ return; } + bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY; GLint i; switch (pname) { @@ -732,12 +775,54 @@ GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){ *params = thrd->shareGroup->getLocalName(RENDERBUFFER,i); } break; + case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = getCompressedFormats(NULL); break; case GL_COMPRESSED_TEXTURE_FORMATS: getCompressedFormats(params); break; + + case GL_SHADER_COMPILER: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + else + *params = 1; + break; + + case GL_SHADER_BINARY_FORMATS: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + break; + + case GL_NUM_SHADER_BINARY_FORMATS: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + else + *params = 0; + break; + + case GL_MAX_VERTEX_UNIFORM_VECTORS: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + else + *params = 128; + break; + + case GL_MAX_VARYING_VECTORS: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + else + *params = 8; + break; + + case GL_MAX_FRAGMENT_UNIFORM_VECTORS: + if(es2) + ctx->dispatcher().glGetIntegerv(pname,params); + else + *params = 16; + break; + default: ctx->dispatcher().glGetIntegerv(pname,params); } @@ -793,12 +878,30 @@ GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision){ GET_CTX_V2(); SET_ERROR_IF(!(GLESv2Validate::shaderType(shadertype) && GLESv2Validate::precisionType(precisiontype)),GL_INVALID_ENUM); - if(ctx->glslVersion() < Version(1,30,10)){ //version 1.30.10 is the first version of GLSL Language containing precision qualifiers - range[0] = range[1] = 0; - precision = 0; - } else { + + if(ctx->dispatcher().glGetShaderPrecisionFormat != NULL) + { ctx->dispatcher().glGetShaderPrecisionFormat(shadertype,precisiontype,range,precision); } + else + { + switch(precisiontype) + { + case GL_LOW_INT: + case GL_MEDIUM_INT: + case GL_HIGH_INT: + range[0] = range[1] = 16; + *precision = 0; + break; + + case GL_LOW_FLOAT: + case GL_MEDIUM_FLOAT: + case GL_HIGH_FLOAT: + range[0] = range[1] = 127; + *precision = 24; + break; + } + } } GL_APICALL void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){ @@ -1064,7 +1167,11 @@ GL_APICALL void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsiz GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void){ GET_CTX(); - ctx->dispatcher().glReleaseShaderCompiler(); + + if(ctx->dispatcher().glReleaseShaderCompiler != NULL) + { + ctx->dispatcher().glReleaseShaderCompiler(); + } } GL_APICALL void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){ @@ -1084,6 +1191,9 @@ GL_APICALL void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length){ GET_CTX(); + + SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION); + if(thrd->shareGroup.Ptr()){ for(int i=0; i < n ; i++){ const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shaders[i]); diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp index 9c7863053..e6634f4fd 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLDispatch.cpp @@ -521,13 +521,13 @@ void GLDispatch::dispatchFuncs(GLESVersion version){ LOAD_GL_FUNC(glGetProgramInfoLog); LOAD_GL_FUNC(glGetShaderiv); LOAD_GL_FUNC(glGetShaderInfoLog); - LOAD_GL_FUNC(glGetShaderPrecisionFormat); + LOAD_GLEXT_FUNC(glGetShaderPrecisionFormat); LOAD_GL_FUNC(glGetShaderSource); LOAD_GL_FUNC(glGetUniformfv); LOAD_GL_FUNC(glGetUniformiv); LOAD_GL_FUNC(glGetUniformLocation); - LOAD_GL_FUNC(glReleaseShaderCompiler); - LOAD_GL_FUNC(glShaderBinary); + LOAD_GLEXT_FUNC(glReleaseShaderCompiler); + LOAD_GLEXT_FUNC(glShaderBinary); LOAD_GL_FUNC(glShaderSource); LOAD_GL_FUNC(glStencilMaskSeparate); } diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp index a25c34eb5..fadb27547 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp @@ -511,6 +511,9 @@ void GLEScontext::initCapsLocked(const GLubyte * extensionString) if (strstr(cstring,"GL_SGIS_generate_mipmap ")!=NULL) s_glSupport.GL_SGIS_GENERATE_MIPMAP = true; + if (strstr(cstring,"GL_ARB_ES2_compatibility ")!=NULL) + s_glSupport.GL_ARB_ES2_COMPATIBILITY = true; + } bool GLEScontext::isTextureUnitEnabled(GLenum unit) { diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h index 406998bb3..746cca124 100644 --- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h +++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h @@ -41,7 +41,8 @@ struct GLSupport { GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \ GL_NV_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false), \ GL_ARB_HALF_FLOAT_PIXEL(false), GL_NV_HALF_FLOAT(false), \ - GL_ARB_HALF_FLOAT_VERTEX(false),GL_SGIS_GENERATE_MIPMAP(false) {} ; + GL_ARB_HALF_FLOAT_VERTEX(false),GL_SGIS_GENERATE_MIPMAP(false), + GL_ARB_ES2_COMPATIBILITY(false) {} ; int maxLights; int maxVertexAttribs; int maxClipPlane; @@ -59,6 +60,7 @@ struct GLSupport { bool GL_NV_HALF_FLOAT; bool GL_ARB_HALF_FLOAT_VERTEX; bool GL_SGIS_GENERATE_MIPMAP; + bool GL_ARB_ES2_COMPATIBILITY; };