Fixes 3 dEQP tests: * dEQP-GLES3.functional.negative_api.state.get_program_info_log * dEQP-GLES3.functional.negative_api.state.get_shader_info_log * dEQP-GLES3.functional.negative_api.state.get_programiv --- src/mesa/main/shaderapi.c | 92 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 6 deletions(-)
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 52eab46..01073ae 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -546,7 +546,24 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, || _mesa_is_gles3(ctx); if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramiv(program)"); + /* Section 6.1.12 Shader and Program Queries, page 234 of the + * OpenGL ES 3.0.4 spec states: + * + * "These commands will generate the error INVALID_VALUE if the + * provided name is not the name of either a shader or program object, + * and INVALID_OPERATION if the provided name identifies an object of + * the other type." + * + * Also, Section 7.13. SHADER, PROGRAM, AND PROGRAM PIPELINE QUERIES, + * page 161 of the OpenGL 4.5 spec states: + * + * "An INVALID_OPERATION error is generated if prgoram is the name of a + * shader object." + */ + if (_mesa_lookup_shader_err(ctx, program, "glGetProgramiv(program)")) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(shader " + "instead of program)"); + } return; } @@ -764,11 +781,42 @@ static void get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { - struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program); + struct gl_shader_program *shProg; + + /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and + * section 2.3.1 (Errors) of the OpenGL 4.5 spec say: + * + * "If a negative number is provided where an argument of type sizei or + * sizeiptr is specified, an INVALID_VALUE error is generated." + */ + if (bufSize < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(bufSize < 0)"); + return; + } + + shProg = _mesa_lookup_shader_program(ctx, program); if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(program)"); + /* Section 6.1.12 Shader and Program Queries, page 234 of the + * OpenGL ES 3.0.4 spec states: + * + * "These commands will generate the error INVALID_VALUE if the + * provided name is not the name of either a shader or program object, + * and INVALID_OPERATION if the provided name identifies an object of + * the other type." + * + * Also, Section 7.13. SHADER, PROGRAM, AND PROGRAM PIPELINE QUERIES, + * page 161 of the OpenGL 4.5 spec states: + * + * "An INVALID_OPERATION error is generated if prgoram is the name of a + * shader object." + */ + if (_mesa_lookup_shader_err(ctx, program, "glGetProgramiv(program)")) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(shader instead " + "of program)"); + } return; } + _mesa_copy_string(infoLog, bufSize, length, shProg->InfoLog); } @@ -777,11 +825,43 @@ static void get_shader_info_log(struct gl_context *ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { - struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); - if (!sh) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(shader)"); + struct gl_shader *sh; + + /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and + * section 2.3.1 (Errors) of the OpenGL 4.5 spec say: + * + * "If a negative number is provided where an argument of type sizei or + * sizeiptr is specified, an INVALID_VALUE error is generated." + */ + if (bufSize < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(bufSize < 0)"); return; } + + sh = _mesa_lookup_shader(ctx, shader); + if (!sh) { + /* Section 6.1.12 Shader and Program Queries, page 234 of the + * OpenGL ES 3.0.4 spec states: + * + * "These commands will generate the error INVALID_VALUE if the + * provided name is not the name of either a shader or program object, + * and INVALID_OPERATION if the provided name identifies an object of + * the other type." + * + * Also, Section 7.13. SHADER, PROGRAM, AND PROGRAM PIPELINE QUERIES, + * page 161 of the OpenGL 4.5 spec states: + * + * "An INVALID_OPERATION error is generated if shader is the name of a + * program object." + */ + if (_mesa_lookup_shader_program_err(ctx, shader, + "glGetShaderInfoLog(shader)")) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetShaderInfoLog(program " + "instead of shader)"); + } + return; + } + _mesa_copy_string(infoLog, bufSize, length, sh->InfoLog); } -- 2.1.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev