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:
committed by
Marge Bot
parent
8059f206da
commit
8471f7a5fa
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -2182,6 +2182,7 @@ struct gl_program
|
||||
*/
|
||||
GLenum16 ImageAccess[MAX_IMAGE_UNIFORMS];
|
||||
|
||||
GLuint NumUniformBlocks;
|
||||
struct gl_uniform_block **UniformBlocks;
|
||||
struct gl_uniform_block **ShaderStorageBlocks;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user