* commit '2f2f319d6811826b4a4a91b70e47dd98a4b8900a': opengles emulator: GLESv2: adding more params validation.
This commit is contained in:
@@ -171,9 +171,14 @@ GL_APICALL void GL_APIENTRY glAttachShader(GLuint program, GLuint shader){
|
|||||||
|
|
||||||
GL_APICALL void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){
|
GL_APICALL void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
|
SET_ERROR_IF(!GLESv2Validate::attribName(name),GL_INVALID_OPERATION);
|
||||||
|
SET_ERROR_IF(!GLESv2Validate::attribIndex(index),GL_INVALID_VALUE);
|
||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
|
|
||||||
ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name);
|
ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -343,6 +348,8 @@ GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
|
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
|
||||||
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glCompileShader(globalShaderName);
|
ctx->dispatcher().glCompileShader(globalShaderName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -394,6 +401,7 @@ GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){
|
|||||||
|
|
||||||
GL_APICALL GLuint GL_APIENTRY glCreateShader(GLenum type){
|
GL_APICALL GLuint GL_APIENTRY glCreateShader(GLenum type){
|
||||||
GET_CTX_V2_RET(0);
|
GET_CTX_V2_RET(0);
|
||||||
|
RET_AND_SET_ERROR_IF(!GLESv2Validate::shaderType(type),GL_INVALID_ENUM,0);
|
||||||
const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type);
|
const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type);
|
||||||
if(ctx->shareGroup().Ptr() && globalShaderName) {
|
if(ctx->shareGroup().Ptr() && globalShaderName) {
|
||||||
const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true);
|
const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true);
|
||||||
@@ -759,6 +767,8 @@ GL_APICALL void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLs
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name);
|
ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -768,6 +778,8 @@ GL_APICALL void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GL
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name);
|
ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -778,6 +790,8 @@ GL_APICALL void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcou
|
|||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders);
|
ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
GLint numShaders=0;
|
GLint numShaders=0;
|
||||||
ctx->dispatcher().glGetProgramiv(globalProgramName,GL_ATTACHED_SHADERS,&numShaders);
|
ctx->dispatcher().glGetProgramiv(globalProgramName,GL_ATTACHED_SHADERS,&numShaders);
|
||||||
for(int i=0 ; i < maxcount && i<numShaders ;i++){
|
for(int i=0 ; i < maxcount && i<numShaders ;i++){
|
||||||
@@ -791,6 +805,10 @@ GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* nam
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
|
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
|
||||||
|
ProgramData* pData = (ProgramData *)objData.Ptr();
|
||||||
|
RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
|
||||||
return ctx->dispatcher().glGetAttribLocation(globalProgramName,name);
|
return ctx->dispatcher().glGetAttribLocation(globalProgramName,name);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1097,6 +1115,7 @@ GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum
|
|||||||
|
|
||||||
GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){
|
GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
|
SET_ERROR_IF(!GLESv2Validate::programParam(pname),GL_INVALID_ENUM);
|
||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
@@ -1238,18 +1257,28 @@ GL_APICALL void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GL
|
|||||||
|
|
||||||
GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){
|
GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
|
SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
|
||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
|
ProgramData* pData = (ProgramData *)objData.Ptr();
|
||||||
|
SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glGetUniformfv(globalProgramName,location,params);
|
ctx->dispatcher().glGetUniformfv(globalProgramName,location,params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){
|
GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){
|
||||||
GET_CTX();
|
GET_CTX();
|
||||||
|
SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
|
||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
|
ProgramData* pData = (ProgramData *)objData.Ptr();
|
||||||
|
SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glGetUniformiv(globalProgramName,location,params);
|
ctx->dispatcher().glGetUniformiv(globalProgramName,location,params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1259,6 +1288,10 @@ GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* na
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
|
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
|
||||||
|
ProgramData* pData = (ProgramData *)objData.Ptr();
|
||||||
|
RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
|
||||||
return ctx->dispatcher().glGetUniformLocation(globalProgramName,name);
|
return ctx->dispatcher().glGetUniformLocation(globalProgramName,name);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1765,6 +1798,8 @@ GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE);
|
SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr() && (objData.Ptr()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glUseProgram(globalProgramName);
|
ctx->dispatcher().glUseProgram(globalProgramName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1774,6 +1809,8 @@ GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){
|
|||||||
if(ctx->shareGroup().Ptr()) {
|
if(ctx->shareGroup().Ptr()) {
|
||||||
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
|
||||||
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
|
||||||
|
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
|
||||||
|
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
|
||||||
ctx->dispatcher().glValidateProgram(globalProgramName);
|
ctx->dispatcher().glValidateProgram(globalProgramName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,3 +154,29 @@ bool GLESv2Validate::pixelFrmt(GLEScontext* ctx,GLenum format) {
|
|||||||
|
|
||||||
return GLESvalidate::pixelFrmt(ctx, format);
|
return GLESvalidate::pixelFrmt(ctx, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GLESv2Validate::attribName(const GLchar* name){
|
||||||
|
const GLchar* found = strstr(name,"gl_");
|
||||||
|
return (!found) ||
|
||||||
|
(found != name) ; // attrib name does not start with gl_
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GLESv2Validate::attribIndex(int index){
|
||||||
|
return index >=0 && index < GL_MAX_VERTEX_ATTRIBS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GLESv2Validate::programParam(GLenum pname){
|
||||||
|
switch(pname){
|
||||||
|
case GL_DELETE_STATUS:
|
||||||
|
case GL_LINK_STATUS:
|
||||||
|
case GL_VALIDATE_STATUS:
|
||||||
|
case GL_INFO_LOG_LENGTH:
|
||||||
|
case GL_ATTACHED_SHADERS:
|
||||||
|
case GL_ACTIVE_ATTRIBUTES:
|
||||||
|
case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
|
||||||
|
case GL_ACTIVE_UNIFORMS:
|
||||||
|
case GL_ACTIVE_UNIFORM_MAX_LENGTH:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ static bool precisionType(GLenum type);
|
|||||||
static bool arrayIndex(GLEScontext * ctx,GLuint index);
|
static bool arrayIndex(GLEScontext * ctx,GLuint index);
|
||||||
static bool pixelType(GLEScontext * ctx,GLenum type);
|
static bool pixelType(GLEScontext * ctx,GLenum type);
|
||||||
static bool pixelFrmt(GLEScontext* ctx,GLenum format);
|
static bool pixelFrmt(GLEScontext* ctx,GLenum format);
|
||||||
|
static bool attribName(const GLchar* name);
|
||||||
|
static bool attribIndex(int index);
|
||||||
|
static bool programParam(GLenum pname);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user