diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/shader/shader_api.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index c77d0c43973..eea44eb92a6 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -360,6 +360,22 @@ copy_string(GLchar *dst, GLsizei maxLength, GLsizei *length, const GLchar *src) } +static GLboolean +_mesa_is_program(GLcontext *ctx, GLuint name) +{ + struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name); + return shProg ? GL_TRUE : GL_FALSE; +} + + +static GLboolean +_mesa_is_shader(GLcontext *ctx, GLuint name) +{ + struct gl_shader *shader = _mesa_lookup_shader(ctx, name); + return shader ? GL_TRUE : GL_FALSE; +} + + /** * Called via ctx->Driver.AttachShader() */ @@ -372,12 +388,21 @@ _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader) GLuint n; GLuint i; - if (!shProg || !sh) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glAttachShader(bad program or shader name)"); + if (!shProg) { + GLenum err = _mesa_is_shader(ctx, program) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); + return; + } + + if (!sh) { + GLenum err = _mesa_is_program(ctx, shader) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glAttachShader(bad program or shader name)"); return; } + n = shProg->NumShaders; for (i = 0; i < n; i++) { @@ -445,7 +470,9 @@ _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index, GLint i, oldIndex; if (!shProg) { - _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(program)"); + GLenum err = _mesa_is_shader(ctx, program) + ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + _mesa_error(ctx, err, "glBindAttribLocation(program)"); return; } @@ -458,6 +485,11 @@ _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index, return; } + if (index >= ctx->Const.VertexProgram.MaxAttribs) { + _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(index)"); + return; + } + if (shProg->LinkStatus) { /* get current index/location for the attribute */ oldIndex = _mesa_get_attrib_location(ctx, program, name); @@ -946,22 +978,6 @@ _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name) } -static GLboolean -_mesa_is_program(GLcontext *ctx, GLuint name) -{ - struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name); - return shProg ? GL_TRUE : GL_FALSE; -} - - -static GLboolean -_mesa_is_shader(GLcontext *ctx, GLuint name) -{ - struct gl_shader *shader = _mesa_lookup_shader(ctx, name); - return shader ? GL_TRUE : GL_FALSE; -} - - /** * Called via ctx->Driver.ShaderSource() |