compiler/glsl: explicitly store NumUniformBlocks

It's not great to use shader_info for this information, because it
might have gone through lowering of uniforms to UBOs, which can change
the number of UBOs. So let's make sure we know the size of the
UniformBlocks array from when the shader was linked instead.

Reviewed-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4734>
This commit is contained in:
Erik Faye-Lund
2020-04-28 13:28:16 +02:00
committed by Marge Bot
parent 8059f206da
commit 8471f7a5fa
4 changed files with 11 additions and 6 deletions
@@ -302,8 +302,10 @@ nir_interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog,
if (block_type == BLOCK_SSBO)
prog->data->ShaderStorageBlocks = blks;
else
else {
prog->data->NumUniformBlocks = *num_blks;
prog->data->UniformBlocks = blks;
}
return true;
}
@@ -610,6 +612,7 @@ gl_nir_link_uniform_blocks(struct gl_context *ctx,
linked->Program->sh.UniformBlocks =
ralloc_array(linked, struct gl_uniform_block *, num_ubo_blocks);
ralloc_steal(linked, ubo_blocks);
linked->Program->sh.NumUniformBlocks = num_ubo_blocks;
for (unsigned i = 0; i < num_ubo_blocks; i++) {
linked->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
}
+1
View File
@@ -2568,6 +2568,7 @@ link_intrastage_shaders(void *mem_ctx,
for (unsigned i = 0; i < num_ubo_blocks; i++) {
linked->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
}
linked->Program->sh.NumUniformBlocks = num_ubo_blocks;
linked->Program->info.num_ubos = num_ubo_blocks;
/* Copy ssbo blocks to linked shader list */
+5 -5
View File
@@ -139,10 +139,10 @@ write_buffer_blocks(struct blob *metadata, struct gl_shader_program *prog)
struct gl_program *glprog = sh->Program;
blob_write_uint32(metadata, glprog->info.num_ubos);
blob_write_uint32(metadata, glprog->sh.NumUniformBlocks);
blob_write_uint32(metadata, glprog->info.num_ssbos);
for (unsigned j = 0; j < glprog->info.num_ubos; j++) {
for (unsigned j = 0; j < glprog->sh.NumUniformBlocks; j++) {
uint32_t offset =
glprog->sh.UniformBlocks[j] - prog->data->UniformBlocks;
blob_write_uint32(metadata, offset);
@@ -215,15 +215,15 @@ read_buffer_blocks(struct blob_reader *metadata,
struct gl_program *glprog = sh->Program;
glprog->info.num_ubos = blob_read_uint32(metadata);
glprog->sh.NumUniformBlocks = blob_read_uint32(metadata);
glprog->info.num_ssbos = blob_read_uint32(metadata);
glprog->sh.UniformBlocks =
rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ubos);
rzalloc_array(glprog, gl_uniform_block *, glprog->sh.NumUniformBlocks);
glprog->sh.ShaderStorageBlocks =
rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ssbos);
for (unsigned j = 0; j < glprog->info.num_ubos; j++) {
for (unsigned j = 0; j < glprog->sh.NumUniformBlocks; j++) {
uint32_t offset = blob_read_uint32(metadata);
glprog->sh.UniformBlocks[j] = prog->data->UniformBlocks + offset;
}
+1
View File
@@ -2182,6 +2182,7 @@ struct gl_program
*/
GLenum16 ImageAccess[MAX_IMAGE_UNIFORMS];
GLuint NumUniformBlocks;
struct gl_uniform_block **UniformBlocks;
struct gl_uniform_block **ShaderStorageBlocks;