[Mesa-dev] [v2 6/6] mesa: OES_get_program_binary functionality
Erik Faye-Lund
kusmabite at gmail.com
Fri Nov 1 03:21:14 PDT 2013
On Fri, Nov 1, 2013 at 10:16 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
> 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)) {
Won't using the git-sha1 as a compatibility-criteria cause issues for
developers with local changes? I'm not so worried about this for
OES_get_program_binary itself, but once the shader-cache is in place
it sounds like a potential source of difficult to track down
misbehavior...
More information about the mesa-dev
mailing list