From ab2643e4b06f63c93a57624003679903442634a8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tapani=20P=C3=A4lli?= Date: Thu, 14 Jun 2018 11:10:20 +0300 Subject: [PATCH] glsl: serialize data from glTransformFeedbackVaryings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit While XFB has been enabled for cache, we did not serialize enough data for the whole API to work (such as glGetProgramiv). Fixes: 6d830940f7 "Allow shader cache usage with transform feedback" Signed-off-by: Tapani Pälli Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106907 Reviewed-by: Jordan Justen --- src/compiler/glsl/serialize.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index 727822633df..9c21453f91e 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -323,6 +323,14 @@ write_xfb(struct blob *metadata, struct gl_shader_program *shProg) blob_write_uint32(metadata, prog->info.stage); + /* Data set by glTransformFeedbackVaryings. */ + blob_write_uint32(metadata, shProg->TransformFeedback.BufferMode); + blob_write_bytes(metadata, shProg->TransformFeedback.BufferStride, + sizeof(shProg->TransformFeedback.BufferStride)); + blob_write_uint32(metadata, shProg->TransformFeedback.NumVarying); + for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying; i++) + blob_write_string(metadata, shProg->TransformFeedback.VaryingNames[i]); + blob_write_uint32(metadata, ltf->NumOutputs); blob_write_uint32(metadata, ltf->ActiveBuffers); blob_write_uint32(metadata, ltf->NumVarying); @@ -352,6 +360,18 @@ read_xfb(struct blob_reader *metadata, struct gl_shader_program *shProg) if (xfb_stage == ~0u) return; + /* Data set by glTransformFeedbackVaryings. */ + shProg->TransformFeedback.BufferMode = blob_read_uint32(metadata); + blob_copy_bytes(metadata, &shProg->TransformFeedback.BufferStride, + sizeof(shProg->TransformFeedback.BufferStride)); + shProg->TransformFeedback.NumVarying = blob_read_uint32(metadata); + shProg->TransformFeedback.VaryingNames = (char **) + malloc(shProg->TransformFeedback.NumVarying * sizeof(GLchar *)); + /* Note, malloc used with VaryingNames. */ + for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying; i++) + shProg->TransformFeedback.VaryingNames[i] = + strdup(blob_read_string(metadata)); + struct gl_program *prog = shProg->_LinkedShaders[xfb_stage]->Program; struct gl_transform_feedback_info *ltf = rzalloc(prog, struct gl_transform_feedback_info); -- 2.30.2