[Mesa-dev] [PATCH 04/11 v2] mesa: Add missing error checks to GetProgramInfoLog, GetShaderInfoLog and GetProgramiv
Ian Romanick
idr at freedesktop.org
Fri Feb 13 09:59:41 PST 2015
On 02/13/2015 02:21 AM, Eduardo Lima Mitev wrote:
> 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)");
You should go look at _mesa_lookup_shader_err. :) It already generates
the correct error. Places that need to generate the INVALID_VALUE /
INVALID_OPERATION for shader objects should use that instead of (ever)
using _mesa_lookup_shader.
See below...
> + }
> 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)");
> + }
The whole block above should just be:
shProg = _mesa_lookup_shader_err(ctx, program)
if (!shProg)
return;
> 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);
> }
>
>
More information about the mesa-dev
mailing list