diff options
author | Ian Romanick <[email protected]> | 2012-12-03 07:47:36 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-01-11 18:13:53 -0800 |
commit | fefd03e16c162a56dd543ad9a840abb61cc6e649 (patch) | |
tree | 14c655d89c08838164c2919dccf15abf21a59745 /src/mesa | |
parent | 8e2e670007a31f2dcdf5f260bc2f902701ee6a0a (diff) |
mesa: Add tracking for GL_PROGRAM_BINARY_RETRIEVABLE_HINT state
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/mtypes.h | 5 | ||||
-rw-r--r-- | src/mesa/main/shaderapi.c | 57 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index f7b90cfcf17..8904b13d984 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2314,6 +2314,11 @@ struct gl_shader_program 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 * shader objects, and would reject them. However, we internally diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index b921be3b24e..e664650c88d 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -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; } |