glsl: serialize data from glTransformFeedbackVaryings
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 <tapani.palli@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106907
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
@@ -323,6 +323,14 @@ write_xfb(struct blob *metadata, struct gl_shader_program *shProg)
|
|||||||
|
|
||||||
blob_write_uint32(metadata, prog->info.stage);
|
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->NumOutputs);
|
||||||
blob_write_uint32(metadata, ltf->ActiveBuffers);
|
blob_write_uint32(metadata, ltf->ActiveBuffers);
|
||||||
blob_write_uint32(metadata, ltf->NumVarying);
|
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)
|
if (xfb_stage == ~0u)
|
||||||
return;
|
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_program *prog = shProg->_LinkedShaders[xfb_stage]->Program;
|
||||||
struct gl_transform_feedback_info *ltf =
|
struct gl_transform_feedback_info *ltf =
|
||||||
rzalloc(prog, struct gl_transform_feedback_info);
|
rzalloc(prog, struct gl_transform_feedback_info);
|
||||||
|
Reference in New Issue
Block a user