[Mesa-dev] [v2 6/6] mesa: OES_get_program_binary functionality

Tapani Pälli tapani.palli at intel.com
Fri Nov 1 02:16:27 PDT 2013


Signed-off-by: Tapani Pälli <tapani.palli at 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 7da860d..67aee6b 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");
@@ -1630,8 +1631,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
@@ -1645,10 +1664,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_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



More information about the mesa-dev mailing list