am 98030a4f: Merge "2.0 translator: support ARB_ES2_compatibility stuff"

* commit '98030a4f20ec3ec7dbeda20d8cb7e27b0c433ca6':
  2.0 translator: support ARB_ES2_compatibility stuff
This commit is contained in:
David Turner
2011-07-13 18:16:45 -07:00
committed by Android Git Automerger
4 changed files with 126 additions and 11 deletions

View File

@@ -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]);

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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;
};