Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/mesa/main/shaderapi.c | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index d3677c8..3ce7ea4 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -57,6 +57,8 @@ #include "../glsl/ir.h" #include "../glsl/ir_uniform.h" #include "../glsl/program.h" +#include "../glsl/ir_cache.h" +#include "git_sha1.h" /** Define this to enable shader substitution (see below) */ #define SHADER_SUBST 0 @@ -212,7 +214,6 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader) struct gl_shader_program *shProg; struct gl_shader *sh; GLuint i, n; - const bool same_type_disallowed = _mesa_is_gles(ctx); shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader"); @@ -1597,8 +1598,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, MESA_GIT_SHA1); + + /* 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 @@ -1612,10 +1631,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_unserialize(shProg, binary, length, MESA_GIT_SHA1)) { + _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.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev