Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/mesa/main/shaderapi.c | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-)
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 57511e8..c07b226 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -57,6 +57,7 @@ #include "../glsl/ir.h" #include "../glsl/ir_uniform.h" #include "../glsl/program.h" +#include "../glsl/shader_cache.h" /** Define this to enable shader substitution (see below) */ #define SHADER_SUBST 0 @@ -1632,8 +1633,26 @@ _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, if (length != NULL) *length = 0; - (void) binaryFormat; - (void) binary; + size_t size = 0; + char *data = mesa_program_serialize(shProg, &size); + + /* we have more data that can fit to user given buffer */ + if (size > bufSize) { + _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__); + if (data) + free(data); + return; + } + + if (data) { + memcpy(binary, data, size); + free(data); + } + + if (length != NULL) + *length = size; + + *binaryFormat = 0; } void GLAPIENTRY @@ -1647,10 +1666,23 @@ _mesa_ProgramBinary(GLuint program, GLenum binaryFormat, if (!shProg) return; - (void) binaryFormat; - (void) binary; - (void) length; - _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__); + if (length <= 0) + return; + + /* free possible existing data and initialize structure */ + _mesa_free_shader_program_data(ctx, shProg); + _mesa_init_shader_program(ctx, shProg); + + /* fill structure from a binary blob */ + if (mesa_program_deserialize(shProg, binary, length)) { + _mesa_error(ctx, GL_INVALID_VALUE, "glProgramBinary(binary incompatible)"); + return; + } + + /* driver specific link, optimizations and what not */ + ctx->Driver.LinkShader(ctx, shProg); + + _mesa_ValidateProgram(program); } -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev