mesa: Add tracking for GL_PROGRAM_BINARY_RETRIEVABLE_HINT state

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ian Romanick 2012-12-03 07:47:36 -08:00
parent 8e2e670007
commit fefd03e16c
2 changed files with 62 additions and 0 deletions

View file

@ -2313,6 +2313,11 @@ struct gl_shader_program
GLint RefCount; /**< Reference count */
GLboolean DeletePending;
/**
* Is the application intending to glGetProgramBinary this program?
*/
GLboolean BinaryRetreivableHint;
/**
* Flags that the linker should not reject the program if it lacks
* a vertex or fragment shader. GLES2 doesn't allow separate

View file

@ -583,6 +583,18 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param
*params = shProg->NumUniformBlocks;
return;
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
/* This enum isn't part of the OES extension for OpenGL ES 2.0. It is
* only available with desktop OpenGL 3.0+ with the
* GL_ARB_get_program_binary extension or OpenGL ES 3.0.
*
* On desktop, we ignore the 3.0+ requirement because it is silly.
*/
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
break;
*params = shProg->BinaryRetreivableHint;
return;
default:
break;
}
@ -1619,6 +1631,51 @@ _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
return;
}
return;
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
/* This enum isn't part of the OES extension for OpenGL ES 2.0, but it
* is part of OpenGL ES 3.0. For the ES2 case, this function shouldn't
* even be in the dispatch table, so we shouldn't need to expclicitly
* check here.
*
* On desktop, we ignore the 3.0+ requirement because it is silly.
*/
/* The ARB_get_program_binary extension spec says:
*
* "An INVALID_VALUE error is generated if the <value> argument to
* ProgramParameteri is not TRUE or FALSE."
*/
if (value != GL_TRUE && value != GL_FALSE) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glProgramParameteri(pname=%s, value=%d): "
"value must be 0 or 1.",
_mesa_lookup_enum_by_nr(pname),
value);
return;
}
/* No need to notify the driver. Any changes will actually take effect
* the next time the shader is linked.
*
* The ARB_get_program_binary extension spec says:
*
* "To indicate that a program binary is likely to be retrieved,
* ProgramParameteri should be called with <pname>
* PROGRAM_BINARY_RETRIEVABLE_HINT and <value> TRUE. This setting
* will not be in effect until the next time LinkProgram or
* ProgramBinary has been called successfully."
*
* The resloution of issue 9 in the extension spec also says:
*
* "The application may use the PROGRAM_BINARY_RETRIEVABLE_HINT hint
* to indicate to the GL implementation that this program will
* likely be saved with GetProgramBinary at some point. This will
* give the GL implementation the opportunity to track any state
* changes made to the program before being saved such that when it
* is loaded again a recompile can be avoided."
*/
shProg->BinaryRetreivableHint = value;
return;
default:
break;
}