mesa: Don't skip glGetProgramEnvParam4dvARB if there was already an error.

Fixes a bug caught by oglconform, and now piglit
ARB_vertex_program/getenv4d-with-error.  The wrapping of an existing
GL function made it so that we couldn't distinguish an error in
looking up our arguments from an existing error.  Instead, make a
helper function to choose the param, and use it from multiple callers.

v2: Move the success case line into the conditional, use COPY_4V more.
This commit is contained in:
Eric Anholt 2011-06-28 13:55:44 -07:00
parent b043409adf
commit e9d563e3ff

View file

@ -269,6 +269,33 @@ _mesa_IsProgramARB(GLuint id)
return GL_FALSE; return GL_FALSE;
} }
static GLboolean
get_env_param_pointer(struct gl_context *ctx, const char *func,
GLenum target, GLuint index, GLfloat **param)
{
if (target == GL_FRAGMENT_PROGRAM_ARB
&& ctx->Extensions.ARB_fragment_program) {
if (index >= ctx->Const.FragmentProgram.MaxEnvParams) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func);
return GL_FALSE;
}
*param = ctx->FragmentProgram.Parameters[index];
return GL_TRUE;
}
else if (target == GL_VERTEX_PROGRAM_ARB &&
(ctx->Extensions.ARB_vertex_program ||
ctx->Extensions.NV_vertex_program)) {
if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func);
return GL_FALSE;
}
*param = ctx->VertexProgram.Parameters[index];
return GL_TRUE;
} else {
_mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func);
return GL_FALSE;
}
}
void GLAPIENTRY void GLAPIENTRY
_mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len, _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
@ -383,30 +410,16 @@ void GLAPIENTRY
_mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index, _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,
GLfloat x, GLfloat y, GLfloat z, GLfloat w) GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{ {
GLfloat *param;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx);
FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS); FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
if (target == GL_FRAGMENT_PROGRAM_ARB if (get_env_param_pointer(ctx, "glProgramEnvParameter",
&& ctx->Extensions.ARB_fragment_program) { target, index, &param)) {
if (index >= ctx->Const.FragmentProgram.MaxEnvParams) { ASSIGN_4V(param, x, y, z, w);
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter(index)");
return;
}
ASSIGN_4V(ctx->FragmentProgram.Parameters[index], x, y, z, w);
}
else if (target == GL_VERTEX_PROGRAM_ARB /* == GL_VERTEX_PROGRAM_NV */
&& (ctx->Extensions.ARB_vertex_program || ctx->Extensions.NV_vertex_program)) {
if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter(index)");
return;
}
ASSIGN_4V(ctx->VertexProgram.Parameters[index], x, y, z, w);
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramEnvParameter(target)");
return;
} }
} }
@ -422,32 +435,16 @@ void GLAPIENTRY
_mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index, _mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index,
const GLfloat *params) const GLfloat *params)
{ {
GLfloat *param;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx);
FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS); FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
if (target == GL_FRAGMENT_PROGRAM_ARB if (get_env_param_pointer(ctx, "glProgramEnvParameter4fv",
&& ctx->Extensions.ARB_fragment_program) { target, index, &param)) {
if (index >= ctx->Const.FragmentProgram.MaxEnvParams) { memcpy(param, params, 4 * sizeof(GLfloat));
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter4fv(index)");
return;
}
memcpy(ctx->FragmentProgram.Parameters[index], params,
4 * sizeof(GLfloat));
}
else if (target == GL_VERTEX_PROGRAM_ARB /* == GL_VERTEX_PROGRAM_NV */
&& (ctx->Extensions.ARB_vertex_program || ctx->Extensions.NV_vertex_program)) {
if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter4fv(index)");
return;
}
memcpy(ctx->VertexProgram.Parameters[index], params,
4 * sizeof(GLfloat));
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramEnvParameter4fv(target)");
return;
} }
} }
@ -496,14 +493,11 @@ _mesa_GetProgramEnvParameterdvARB(GLenum target, GLuint index,
GLdouble *params) GLdouble *params)
{ {
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
GLfloat fparams[4]; GLfloat *fparam;
_mesa_GetProgramEnvParameterfvARB(target, index, fparams); if (get_env_param_pointer(ctx, "glGetProgramEnvParameterdv",
if (ctx->ErrorValue == GL_NO_ERROR) { target, index, &fparam)) {
params[0] = fparams[0]; COPY_4V(params, fparam);
params[1] = fparams[1];
params[2] = fparams[2];
params[3] = fparams[3];
} }
} }
@ -512,29 +506,15 @@ void GLAPIENTRY
_mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index, _mesa_GetProgramEnvParameterfvARB(GLenum target, GLuint index,
GLfloat *params) GLfloat *params)
{ {
GLfloat *param;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx);
if (target == GL_FRAGMENT_PROGRAM_ARB if (get_env_param_pointer(ctx, "glGetProgramEnvParameterfv",
&& ctx->Extensions.ARB_fragment_program) { target, index, &param)) {
if (index >= ctx->Const.FragmentProgram.MaxEnvParams) { COPY_4V(params, param);
_mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramEnvParameter(index)");
return;
}
COPY_4V(params, ctx->FragmentProgram.Parameters[index]);
}
else if (target == GL_VERTEX_PROGRAM_ARB
&& ctx->Extensions.ARB_vertex_program) {
if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramEnvParameter(index)");
return;
}
COPY_4V(params, ctx->VertexProgram.Parameters[index]);
}
else {
_mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramEnvParameter(target)");
return;
} }
} }