[Mesa-dev] [PATCH 4/6] glsl: fully split apart buffer block arrays
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Tue Apr 5 10:05:03 UTC 2016
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
In general, I don't see anything wrong with this series, just minor
things in this patch.
Once they are fixed and if piglit/dEQP don't complain, add my R-b to
this series:
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
On 03/04/16 13:16, Timothy Arceri wrote:
> With this chage we create the UBO and SSBO arrays separately from
> the
change
Just in case you want to keep this line after the squash.
> beginning rather than putting them into a combined array and
> splitting it apart later. ---
> src/compiler/glsl/link_uniform_blocks.cpp | 204
> +++++++++++++-----------
> src/compiler/glsl/link_uniform_initializers.cpp | 4 +-
> src/compiler/glsl/link_uniforms.cpp | 10 +-
> src/compiler/glsl/linker.cpp | 119
> +++++++++----- src/compiler/glsl/linker.h |
> 7 +- src/compiler/glsl/standalone_scaffolding.cpp | 4 -
> src/mesa/main/mtypes.h | 50 +-----
> src/mesa/main/shader_query.cpp | 4 +-
> src/mesa/main/shaderapi.c | 2 +-
> src/mesa/main/shaderobj.c | 10 +-
> src/mesa/main/uniforms.c | 8 +- 11 files
> changed, 224 insertions(+), 198 deletions(-)
>
> diff --git a/src/compiler/glsl/link_uniform_blocks.cpp
> b/src/compiler/glsl/link_uniform_blocks.cpp index c8fa181..3ef1633
> 100644 --- a/src/compiler/glsl/link_uniform_blocks.cpp +++
> b/src/compiler/glsl/link_uniform_blocks.cpp @@ -291,13 +291,105 @@
> resize_block_array(const glsl_type *type, } }
>
> -unsigned +static void +create_buffer_blocks(void *mem_ctx, struct
> gl_context *ctx, + struct gl_shader_program
> *prog, + struct gl_uniform_block **out_blks,
> unsigned num_blocks, + struct hash_table
> *block_hash, unsigned num_variables, + bool
> create_ubo_blocks) +{ + if (num_blocks == 0) { +
> assert(num_variables == 0); + return; + } + +
> assert(num_variables != 0); + + /* Allocate storage to hold all
> of the informatation related to uniform
information
> + * blocks that can be queried through the API. + */ +
> struct gl_uniform_block *blocks = ralloc_array(mem_ctx,
> gl_uniform_block, num_blocks); + gl_uniform_buffer_variable
> *variables = + ralloc_array(blocks,
> gl_uniform_buffer_variable, num_variables); + + /* Add each
> variable from each uniform block to the API tracking + *
> structures. + */ + ubo_visitor parcel(blocks, variables,
> num_variables); + +
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD140) +
> == unsigned(ubo_packing_std140)); +
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_SHARED) +
> == unsigned(ubo_packing_shared)); +
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_PACKED) +
> == unsigned(ubo_packing_packed)); +
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD430) +
> == unsigned(ubo_packing_std430)); + + unsigned i = 0; + struct
> hash_entry *entry; + hash_table_foreach (block_hash, entry) { +
> const struct link_uniform_block_active *const b = + (const
> struct link_uniform_block_active *) entry->data; + const
> glsl_type *block_type = b->type; + + if ((create_ubo_blocks &&
> !b->is_shader_storage) || + (!create_ubo_blocks &&
> b->is_shader_storage)) { + + if (b->array != NULL) { +
> unsigned binding_offset = 0; + char *name =
> ralloc_strdup(NULL, +
> block_type->without_array()->name); + size_t name_length
> = strlen(name); + + assert(b->has_instance_name); +
> process_block_array(b->array, &name, name_length, blocks, &parcel,
> + variables, b, &i, &binding_offset,
> ctx, prog); + ralloc_free(name); + } else { +
> blocks[i].Name = ralloc_strdup(blocks, block_type->name); +
> blocks[i].Uniforms = &variables[parcel.index]; +
> blocks[i].Binding = (b->has_binding) ? b->binding : 0; +
> blocks[i].UniformBufferSize = 0; + blocks[i]._Packing =
> +
> gl_uniform_block_packing(block_type->interface_packing); + +
> parcel.process(block_type, +
> b->has_instance_name ? block_type->name : ""); + +
> blocks[i].UniformBufferSize = parcel.buffer_size; + + /*
> Check SSBO size is lower than maximum supported size for SSBO +
> */ + if (b->is_shader_storage && +
> parcel.buffer_size > ctx->Const.MaxShaderStorageBlockSize) { +
> linker_error(prog, "shader storage block `%s' has size %d, " +
> "which is larger than than the maximum allowed (%d)", +
> block_type->name, parcel.buffer_size, +
> ctx->Const.MaxShaderStorageBlockSize); + } +
> blocks[i].NumUniforms = (unsigned)(ptrdiff_t) +
> (&variables[parcel.index] - blocks[i].Uniforms); + i++;
> + } + } + } + + *out_blks = blocks; + +
> assert(parcel.index == num_variables); +} + +void
> link_uniform_blocks(void *mem_ctx, struct gl_context *ctx, struct
> gl_shader_program *prog, struct gl_shader **shader_list, unsigned
> num_shaders, - struct gl_uniform_block
> **blocks_ret) + struct gl_uniform_block
> **ubo_blocks, + unsigned *num_ubo_blocks, +
> struct gl_uniform_block **ssbo_blocks, +
> unsigned *num_ssbo_blocks) { /* This hash table will track all of
> the uniform blocks that have been * encountered. Since blocks with
> the same block-name must be the same, @@ -310,7 +402,7 @@
> link_uniform_blocks(void *mem_ctx, if (block_hash == NULL) {
> _mesa_error_no_memory(__func__); linker_error(prog, "out of
> memory\n"); - return 0; + return; }
>
> /* Determine which uniform blocks are active. @@ -323,8 +415,8 @@
> link_uniform_blocks(void *mem_ctx, /* Count the number of active
> uniform blocks. Count the total number of * active slots in those
> uniform blocks. */ - unsigned num_blocks = 0; - unsigned
> num_variables = 0; + unsigned num_ubo_variables = 0; + unsigned
> num_ssbo_variables = 0; count_block_size block_size; struct
> hash_entry *entry;
>
> @@ -346,97 +438,31 @@ link_uniform_blocks(void *mem_ctx,
>
> if (b->array != NULL) { unsigned aoa_size =
> b->type->arrays_of_arrays_size(); - num_blocks +=
> aoa_size; - num_variables += aoa_size *
> block_size.num_active_uniforms; - } else { -
> num_blocks++; - num_variables +=
> block_size.num_active_uniforms; - } - - } - - if
> (num_blocks == 0) { - assert(num_variables == 0); -
> _mesa_hash_table_destroy(block_hash, NULL); - return 0; - }
> - - assert(num_variables != 0); - - /* Allocate storage to hold
> all of the informatation related to uniform - * blocks that can
> be queried through the API. - */ - gl_uniform_block *blocks =
> - ralloc_array(mem_ctx, gl_uniform_block, num_blocks); -
> gl_uniform_buffer_variable *variables = - ralloc_array(blocks,
> gl_uniform_buffer_variable, num_variables); - - /* Add each
> variable from each uniform block to the API tracking - *
> structures. - */ - unsigned i = 0; - ubo_visitor
> parcel(blocks, variables, num_variables); - -
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD140) -
> == unsigned(ubo_packing_std140)); -
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_SHARED) -
> == unsigned(ubo_packing_shared)); -
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_PACKED) -
> == unsigned(ubo_packing_packed)); -
> STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD430) -
> == unsigned(ubo_packing_std430)); - - hash_table_foreach
> (block_hash, entry) { - const struct link_uniform_block_active
> *const b = - (const struct link_uniform_block_active *)
> entry->data; - const glsl_type *block_type = b->type; - -
> if (b->array != NULL) { - unsigned binding_offset = 0; -
> char *name = ralloc_strdup(NULL,
> block_type->without_array()->name); - size_t name_length =
> strlen(name); - - assert(b->has_instance_name); -
> process_block_array(b->array, &name, name_length, blocks, &parcel,
> - variables, b, &i, &binding_offset,
> ctx, prog); - ralloc_free(name); + if
> (b->is_shader_storage) { + *num_ssbo_blocks +=
> aoa_size; + num_ssbo_variables += aoa_size *
> block_size.num_active_uniforms; + } else { +
> *num_ubo_blocks += aoa_size; + num_ubo_variables +=
> aoa_size * block_size.num_active_uniforms; + } } else { -
> blocks[i].Name = ralloc_strdup(blocks, block_type->name); -
> blocks[i].Uniforms = &variables[parcel.index]; -
> blocks[i].Binding = (b->has_binding) ? b->binding : 0; -
> blocks[i].UniformBufferSize = 0; - blocks[i]._Packing = -
> gl_uniform_block_packing(block_type->interface_packing); - -
> parcel.process(block_type, -
> b->has_instance_name ? block_type->name : ""); - -
> blocks[i].UniformBufferSize = parcel.buffer_size; - - /*
> Check SSBO size is lower than maximum supported size for SSBO */ -
> if (b->is_shader_storage && - parcel.buffer_size >
> ctx->Const.MaxShaderStorageBlockSize) { -
> linker_error(prog, "shader storage block `%s' has size %d, " -
> "which is larger than than the maximum allowed (%d)", -
> block_type->name, - parcel.buffer_size, -
> ctx->Const.MaxShaderStorageBlockSize); + if
> (b->is_shader_storage) { + (*num_ssbo_blocks)++; +
> num_ssbo_variables += block_size.num_active_uniforms; + }
> else { + (*num_ubo_blocks)++; +
> num_ubo_variables += block_size.num_active_uniforms; } -
> blocks[i].NumUniforms = -
> (unsigned)(ptrdiff_t)(&variables[parcel.index] -
> blocks[i].Uniforms); - - blocks[i].IsShaderStorage =
> b->is_shader_storage; - - i++; } + }
>
> - assert(parcel.index == num_variables); +
> create_buffer_blocks(mem_ctx, ctx, prog, ubo_blocks,
> *num_ubo_blocks, + block_hash,
> num_ubo_variables, true); + create_buffer_blocks(mem_ctx, ctx,
> prog, ssbo_blocks, *num_ssbo_blocks, +
> block_hash, num_ssbo_variables, false);
>
> _mesa_hash_table_destroy(block_hash, NULL); - - *blocks_ret =
> blocks; - return num_blocks; }
>
> bool diff --git a/src/compiler/glsl/link_uniform_initializers.cpp
> b/src/compiler/glsl/link_uniform_initializers.cpp index
> 15f9a2f..c6346d5 100644 ---
> a/src/compiler/glsl/link_uniform_initializers.cpp +++
> b/src/compiler/glsl/link_uniform_initializers.cpp @@ -159,12
> +159,12 @@ set_block_binding(gl_shader_program *prog, const char
> *block_name, { unsigned num_blocks = mode == ir_var_uniform ?
> prog->NumUniformBlocks : prog->NumShaderStorageBlocks; - struct
> gl_uniform_block **blks = mode == ir_var_uniform ? + struct
> gl_uniform_block *blks = mode == ir_var_uniform ?
> prog->UniformBlocks : prog->ShaderStorageBlocks;
>
> for (unsigned i = 0; i < num_blocks; i++) { if
> (!strcmp(blks[i].Name, block_name)) { - blks[i]->Binding =
> binding; + blks[i].Binding = binding; return; } } diff
> --git a/src/compiler/glsl/link_uniforms.cpp
> b/src/compiler/glsl/link_uniforms.cpp index 8e30c7b..8db60a3
> 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++
> b/src/compiler/glsl/link_uniforms.cpp @@ -462,7 +462,7 @@ public:
>
> buffer_block_index = -1; if (var->is_in_buffer_block()) { -
> struct gl_uniform_block **blks = var->is_in_shader_storage_block()
> ? + struct gl_uniform_block *blks =
> var->is_in_shader_storage_block() ? prog->ShaderStorageBlocks :
> prog->UniformBlocks; unsigned num_blks =
> var->is_in_shader_storage_block() ? prog->NumShaderStorageBlocks :
> prog->NumUniformBlocks; @@ -471,15 +471,15 @@ public: unsigned l =
> strlen(var->get_interface_type()->name);
>
> for (unsigned i = 0; i < num_blks; i++) { - if
> (strncmp(var->get_interface_type()->name, blks[i]->Name, l) -
> == 0 && blks[i]->Name[l] == '[') { + if
> (strncmp(var->get_interface_type()->name, blks[i].Name, l) +
> == 0 && blks[i].Name[l] == '[') { buffer_block_index = i; break; }
> } } else { for (unsigned i = 0; i < num_blks; i++) { -
> if (strcmp(var->get_interface_type()->name, blks[i]->Name) == +
> if (strcmp(var->get_interface_type()->name, blks[i].Name) == 0) {
> buffer_block_index = i; break; @@ -500,7 +500,7 @@ public:
> var->get_interface_type()->name); } else { const struct
> gl_uniform_block *const block = -
> blks[buffer_block_index]; +
> &blks[buffer_block_index];
>
> assert(var->data.location != -1);
>
> diff --git a/src/compiler/glsl/linker.cpp
> b/src/compiler/glsl/linker.cpp index 2f152d6..c071a1c 100644 ---
> a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp
> @@ -1165,39 +1165,58 @@ cross_validate_uniforms(struct
> gl_shader_program *prog) }
>
> /** - * Accumulates the array of prog->BufferInterfaceBlocks and
> checks that all - * definitons of blocks agree on their contents. +
> * Accumulates the array of buffer blocks and checks that all
> definitons of
definitions
> + * blocks agree on their contents. */ static bool
> -interstage_cross_validate_uniform_blocks(struct gl_shader_program
> *prog) +interstage_cross_validate_uniform_blocks(struct
> gl_shader_program *prog, +
> bool validate_ssbo) { int
> *InterfaceBlockStageIndex[MESA_SHADER_STAGES]; + struct
> gl_uniform_block *blks = NULL;
Why not assign prog->ShaderStorageBlocks or prog->UniformBlocks to blks
here and delete the last hunk of this function?
> + unsigned *num_blks = validate_ssbo ?
> &prog->NumShaderStorageBlocks : + &prog->NumUniformBlocks;
>
> - unsigned max_num_uniform_blocks = 0; + unsigned
> max_num_buffer_blocks = 0; for (unsigned i = 0; i <
> MESA_SHADER_STAGES; i++) { - if (prog->_LinkedShaders[i]) -
> max_num_uniform_blocks +=
> prog->_LinkedShaders[i]->NumBufferInterfaceBlocks; + if
> (prog->_LinkedShaders[i]) { + if (validate_ssbo) { +
> max_num_buffer_blocks += +
> prog->_LinkedShaders[i]->NumShaderStorageBlocks; + } else
> { + max_num_buffer_blocks += +
> prog->_LinkedShaders[i]->NumUniformBlocks; + } + } }
>
> for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { struct
> gl_shader *sh = prog->_LinkedShaders[i];
>
> - InterfaceBlockStageIndex[i] = new
> int[max_num_uniform_blocks]; - for (unsigned int j = 0; j <
> max_num_uniform_blocks; j++) + InterfaceBlockStageIndex[i] =
> new int[max_num_buffer_blocks]; + for (unsigned int j = 0; j <
> max_num_buffer_blocks; j++) InterfaceBlockStageIndex[i][j] = -1;
>
> if (sh == NULL) continue;
>
> - for (unsigned int j = 0; j < sh->NumBufferInterfaceBlocks;
> j++) { - int index = link_cross_validate_uniform_block(prog, -
> &prog->BufferInterfaceBlocks, -
> &prog->NumBufferInterfaceBlocks, -
> sh->BufferInterfaceBlocks[j]); + unsigned sh_num_blocks; +
> struct gl_uniform_block **sh_blks; + if (validate_ssbo) { +
> sh_num_blocks = prog->_LinkedShaders[i]->NumShaderStorageBlocks; +
> sh_blks = sh->ShaderStorageBlocks; + } else { +
> sh_num_blocks = prog->_LinkedShaders[i]->NumUniformBlocks; +
> sh_blks = sh->UniformBlocks; + } + + for (unsigned int j
> = 0; j < sh_num_blocks; j++) { + int index =
> link_cross_validate_uniform_block(prog, &blks, num_blks, +
> sh_blks[j]);
>
> if (index == -1) { - linker_error(prog, "uniform block
> `%s' has mismatching definitions\n", -
> sh->BufferInterfaceBlocks[j]->Name); +
> linker_error(prog, "buffer block `%s' has mismatching " +
> "definitions\n", sh_blks[j]->Name);
>
> for (unsigned k = 0; k <= i; k++) { delete[]
> InterfaceBlockStageIndex[k]; @@ -1213,16 +1232,18 @@
> interstage_cross_validate_uniform_blocks(struct gl_shader_program
> *prog) * FIXME: We should be able to free the per stage blocks
> here. */ for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { -
> for (unsigned j = 0; j < prog->NumBufferInterfaceBlocks; j++) { +
> for (unsigned j = 0; j < *num_blks; j++) { int stage_index =
> InterfaceBlockStageIndex[i][j];
>
> if (stage_index != -1) { struct gl_shader *sh =
> prog->_LinkedShaders[i];
>
> - prog->BufferInterfaceBlocks[j].stageref |= (1 << i); +
> blks[j].stageref |= (1 << i); + + struct
> gl_uniform_block **sh_blks = validate_ssbo ? +
> sh->ShaderStorageBlocks : sh->UniformBlocks;
>
> - sh->BufferInterfaceBlocks[stage_index] = -
> &prog->BufferInterfaceBlocks[j]; + sh_blks[stage_index]
> = &blks[j]; } } } @@ -1231,6 +1252,11 @@
> interstage_cross_validate_uniform_blocks(struct gl_shader_program
> *prog) delete[] InterfaceBlockStageIndex[i]; }
>
> + if (validate_ssbo) + prog->ShaderStorageBlocks = blks; +
> else + prog->UniformBlocks = blks; + return true; }
>
> @@ -2074,7 +2100,10 @@ link_intrastage_shaders(void *mem_ctx,
> struct gl_shader **shader_list, unsigned num_shaders) { - struct
> gl_uniform_block *uniform_blocks = NULL; + struct
> gl_uniform_block *ubo_blocks = NULL; + struct gl_uniform_block
> *ssbo_blocks = NULL; + unsigned num_ubo_blocks = 0; + unsigned
> num_ssbo_blocks = 0;
>
> /* Check that global variables defined in multiple shaders are
> consistent. */ @@ -2090,9 +2119,10 @@ link_intrastage_shaders(void
> *mem_ctx, return NULL;
>
> /* Link up uniform blocks defined within this stage. */ - const
> unsigned num_uniform_blocks = - link_uniform_blocks(mem_ctx,
> ctx, prog, shader_list, num_shaders, -
> &uniform_blocks); + link_uniform_blocks(mem_ctx, ctx, prog,
> shader_list, num_shaders, + &ubo_blocks,
> &num_ubo_blocks, &ssbo_blocks, +
> &num_ssbo_blocks); + if (!prog->LinkStatus) return NULL;
>
> @@ -2159,15 +2189,23 @@ link_intrastage_shaders(void *mem_ctx,
> linked->ir = new(linked) exec_list; clone_ir_list(mem_ctx,
> linked->ir, main->ir);
>
> - linked->BufferInterfaceBlocks = - ralloc_array(linked,
> gl_uniform_block *, num_uniform_blocks); - - ralloc_steal(linked,
> uniform_blocks); - for (unsigned i = 0; i < num_uniform_blocks;
> i++) { - linked->BufferInterfaceBlocks[i] =
> &uniform_blocks[i]; + /* Copy ubo blocks to linked shader list
> */ + linked->UniformBlocks = + ralloc_array(linked,
> gl_uniform_block *, num_ubo_blocks); + ralloc_steal(linked,
> ubo_blocks); + for (unsigned i = 0; i < num_ubo_blocks; i++) { +
> linked->UniformBlocks[i] = &ubo_blocks[i]; } +
> linked->NumUniformBlocks = num_ubo_blocks;
>
> - linked->NumBufferInterfaceBlocks = num_uniform_blocks; + /*
> Copy ssbo blocks to linked shader list */ +
> linked->ShaderStorageBlocks = + ralloc_array(linked,
> gl_uniform_block *, num_ssbo_blocks); + ralloc_steal(linked,
> ssbo_blocks); + for (unsigned i = 0; i < num_ssbo_blocks; i++) {
> + linked->ShaderStorageBlocks[i] = &ssbo_blocks[i]; + } +
> linked->NumShaderStorageBlocks = num_ssbo_blocks;
>
> link_fs_input_layout_qualifiers(prog, linked, shader_list,
> num_shaders); link_tcs_out_layout_qualifiers(prog, linked,
> shader_list, num_shaders); @@ -2974,7 +3012,7 @@
> check_resources(struct gl_context *ctx, struct gl_shader_program
> *prog) }
>
> for (unsigned i = 0; i < prog->NumUniformBlocks; i++) { - if
> (prog->UniformBlocks[i]->UniformBufferSize > + if
> (prog->UniformBlocks[i].UniformBufferSize >
> ctx->Const.MaxUniformBlockSize) { linker_error(prog, "Uniform block
> %s too big (%d/%d)\n", prog->UniformBlocks[i].Name, @@ -3806,8
> +3844,8 @@ calculate_array_size_and_stride(struct gl_shader_program
> *shProg, char *var_name = get_top_level_name(uni->name); char
> *interface_name = get_top_level_name(uni->is_shader_storage ? -
> shProg->ShaderStorageBlocks[block_index]->Name : -
> shProg->UniformBlocks[block_index]->Name); +
> shProg->ShaderStorageBlocks[block_index].Name : +
> shProg->UniformBlocks[block_index].Name);
>
> if (strcmp(var_name, interface_name) == 0) { /* Deal with instanced
> array of SSBOs */ @@ -3948,8 +3986,8 @@
> build_program_resource_list(struct gl_context *ctx, int block_index
> = shProg->UniformStorage[i].block_index; if (block_index != -1) {
> stageref |= is_shader_storage ? -
> shProg->ShaderStorageBlocks[block_index]->stageref : -
> shProg->UniformBlocks[block_index]->stageref; +
> shProg->ShaderStorageBlocks[block_index].stageref : +
> shProg->UniformBlocks[block_index].stageref; }
>
> GLenum type = is_shader_storage ? GL_BUFFER_VARIABLE : GL_UNIFORM;
> @@ -3969,14 +4007,14 @@ build_program_resource_list(struct
> gl_context *ctx, /* Add program uniform blocks. */ for (unsigned i
> = 0; i < shProg->NumUniformBlocks; i++) { if
> (!add_program_resource(shProg, GL_UNIFORM_BLOCK, -
> shProg->UniformBlocks[i], 0)) + &shProg->UniformBlocks[i],
> 0)) return; }
>
> /* Add program shader storage blocks. */ for (unsigned i = 0; i <
> shProg->NumShaderStorageBlocks; i++) { if
> (!add_program_resource(shProg, GL_SHADER_STORAGE_BLOCK, -
> shProg->ShaderStorageBlocks[i], 0)) +
> &shProg->ShaderStorageBlocks[i], 0)) return; }
>
> @@ -4461,7 +4499,12 @@ link_shaders(struct gl_context *ctx, struct
> gl_shader_program *prog) if (prog->SeparateShader)
> disable_varying_optimizations_for_sso(prog);
>
> - if (!interstage_cross_validate_uniform_blocks(prog)) + /*
> Process UBOs */ + if
> (!interstage_cross_validate_uniform_blocks(prog, false)) +
> goto done; + + /* Process SSBOs */ + if
> (!interstage_cross_validate_uniform_blocks(prog, true)) goto done;
>
> /* Do common optimization before assigning storage for attributes,
> diff --git a/src/compiler/glsl/linker.h
> b/src/compiler/glsl/linker.h index 97144df..3a0ec8b 100644 ---
> a/src/compiler/glsl/linker.h +++ b/src/compiler/glsl/linker.h @@
> -53,13 +53,16 @@ extern bool
> link_uniform_blocks_are_compatible(const gl_uniform_block *a, const
> gl_uniform_block *b);
>
> -extern unsigned +extern void link_uniform_blocks(void *mem_ctx,
> struct gl_context *ctx, struct gl_shader_program *prog, struct
> gl_shader **shader_list, unsigned num_shaders, -
> struct gl_uniform_block **blocks_ret); + struct
> gl_uniform_block **ubo_blocks, + unsigned
> *num_ubo_blocks, + struct gl_uniform_block
> **ssbo_blocks, + unsigned *num_ssbo_blocks);
>
> bool validate_intrastage_arrays(struct gl_shader_program *prog,
> diff --git a/src/compiler/glsl/standalone_scaffolding.cpp
> b/src/compiler/glsl/standalone_scaffolding.cpp index
> 49b4a26..09d7d6e 100644 ---
> a/src/compiler/glsl/standalone_scaffolding.cpp +++
> b/src/compiler/glsl/standalone_scaffolding.cpp @@ -105,10 +105,6 @@
> _mesa_clear_shader_program_data(struct gl_shader_program *shProg)
> ralloc_free(shProg->InfoLog); shProg->InfoLog =
> ralloc_strdup(shProg, "");
>
> - ralloc_free(shProg->BufferInterfaceBlocks); -
> shProg->BufferInterfaceBlocks = NULL; -
> shProg->NumBufferInterfaceBlocks = 0; -
> ralloc_free(shProg->UniformBlocks); shProg->UniformBlocks = NULL;
> shProg->NumUniformBlocks = 0; diff --git a/src/mesa/main/mtypes.h
> b/src/mesa/main/mtypes.h index e579794..7495f05 100644 ---
> a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2295,30
> +2295,6 @@ struct gl_shader */ unsigned
> num_combined_uniform_components;
>
> - /** - * This shader's uniform/ssbo block information. -
> * - * These fields are only set post-linking. - * - *
> BufferInterfaceBlocks is a list containing both UBOs and SSBOs.
> This is - * useful during the linking process so that we don't
> have to handle SSBOs - * specifically. - * - *
> UniformBlocks is a list of UBOs. This is useful for backends that
> need - * or prefer to see separate index spaces for UBOS and
> SSBOs like the GL - * API specifies. - * - *
> ShaderStorageBlocks is a list of SSBOs. This is useful for backends
> that - * need or prefer to see separate index spaces for UBOS
> and SSBOs like the - * GL API specifies. - * - *
> UniformBlocks and ShaderStorageBlocks only have pointers into -
> * BufferInterfaceBlocks so the actual resource information is not -
> * duplicated. - */ - unsigned NumBufferInterfaceBlocks; -
> struct gl_uniform_block **BufferInterfaceBlocks; - unsigned
> NumUniformBlocks; struct gl_uniform_block **UniformBlocks;
>
> @@ -2804,33 +2780,11 @@ struct gl_shader_program */ unsigned
> LastClipDistanceArraySize;
>
> - /** - * This shader's uniform/ssbo block information. -
> * - * BufferInterfaceBlocks is a list containing both UBOs and
> SSBOs. This is - * useful during the linking process so that we
> don't have to handle SSBOs - * specifically. - * - *
> UniformBlocks is a list of UBOs. This is useful for backends that
> need - * or prefer to see separate index spaces for UBOS and
> SSBOs like the GL - * API specifies. - * - *
> ShaderStorageBlocks is a list of SSBOs. This is useful for backends
> that - * need or prefer to see separate index spaces for UBOS
> and SSBOs like the - * GL API specifies. - * - *
> UniformBlocks and ShaderStorageBlocks only have pointers into -
> * BufferInterfaceBlocks so the actual resource information is not -
> * duplicated and are only set after linking. - */ - unsigned
> NumBufferInterfaceBlocks; - struct gl_uniform_block
> *BufferInterfaceBlocks; - unsigned NumUniformBlocks; - struct
> gl_uniform_block **UniformBlocks; + struct gl_uniform_block
> *UniformBlocks;
>
> unsigned NumShaderStorageBlocks; - struct gl_uniform_block
> **ShaderStorageBlocks; + struct gl_uniform_block
> *ShaderStorageBlocks;
>
> /** * Map of active uniform names to locations diff --git
> a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index 1f36dae..2c1a6ee 100644 --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp @@ -926,10 +926,10 @@
> is_resource_referenced(struct gl_shader_program *shProg, return
> RESOURCE_ATC(res)->StageReferences[stage];
>
> if (res->Type == GL_UNIFORM_BLOCK) - return
> shProg->UniformBlocks[index]->stageref & (1 << stage); +
> return shProg->UniformBlocks[index].stageref & (1 << stage);
>
> if (res->Type == GL_SHADER_STORAGE_BLOCK) - return
> shProg->ShaderStorageBlocks[index]->stageref & (1 << stage); +
> return shProg->ShaderStorageBlocks[index].stageref & (1 << stage);
>
> return res->StageReferences & (1 << stage); } diff --git
> a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index
> ba26072..b28b5ce 100644 --- a/src/mesa/main/shaderapi.c +++
> b/src/mesa/main/shaderapi.c @@ -727,7 +727,7 @@
> get_programiv(struct gl_context *ctx, GLuint program, GLenum
> pname, for (i = 0; i < shProg->NumUniformBlocks; i++) { /* Add one
> for the terminating NUL character. */ - const GLint len =
> strlen(shProg->UniformBlocks[i]->Name) + 1; + const GLint len =
> strlen(shProg->UniformBlocks[i].Name) + 1;
>
> if (len > max_len) max_len = len; diff --git
> a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index
> 8b9166c..274cb12 100644 --- a/src/mesa/main/shaderobj.c +++
> b/src/mesa/main/shaderobj.c @@ -292,9 +292,13 @@
> _mesa_clear_shader_program_data(struct gl_shader_program *shProg)
> ralloc_free(shProg->InfoLog); shProg->InfoLog =
> ralloc_strdup(shProg, "");
>
> - ralloc_free(shProg->BufferInterfaceBlocks); -
> shProg->BufferInterfaceBlocks = NULL; -
> shProg->NumBufferInterfaceBlocks = 0; +
> ralloc_free(shProg->UniformBlocks); + shProg->UniformBlocks =
> NULL; + shProg->NumUniformBlocks = 0; + +
> ralloc_free(shProg->ShaderStorageBlocks); +
> shProg->ShaderStorageBlocks = NULL; +
> shProg->NumShaderStorageBlocks = 0;
>
> ralloc_free(shProg->AtomicBuffers); shProg->AtomicBuffers = NULL;
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index 7dcbdcc..a9308d0 100644 --- a/src/mesa/main/uniforms.c +++
> b/src/mesa/main/uniforms.c @@ -1016,13 +1016,13 @@
> _mesa_UniformBlockBinding(GLuint program, return; }
>
> - if (shProg->UniformBlocks[uniformBlockIndex]->Binding != + if
> (shProg->UniformBlocks[uniformBlockIndex].Binding !=
> uniformBlockBinding) {
>
> FLUSH_VERTICES(ctx, 0); ctx->NewDriverState |=
> ctx->DriverFlags.NewUniformBuffer;
>
> - shProg->UniformBlocks[uniformBlockIndex]->Binding =
> uniformBlockBinding; +
> shProg->UniformBlocks[uniformBlockIndex].Binding =
> uniformBlockBinding; } }
>
> @@ -1059,13 +1059,13 @@ _mesa_ShaderStorageBlockBinding(GLuint
> program, return; }
>
> - if
> (shProg->ShaderStorageBlocks[shaderStorageBlockIndex]->Binding != +
> if (shProg->ShaderStorageBlocks[shaderStorageBlockIndex].Binding
> != shaderStorageBlockBinding) {
>
> FLUSH_VERTICES(ctx, 0); ctx->NewDriverState |=
> ctx->DriverFlags.NewShaderStorageBuffer;
>
> -
> shProg->ShaderStorageBlocks[shaderStorageBlockIndex]->Binding = +
> shProg->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
> shaderStorageBlockBinding; } }
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAEBCAAGBQJXA43PAAoJEH/0ujLxfcNDzIwP/Rql6474hp38ykXXUU/o9Rx2
MU4WBzk864/yPZMt2VdetxV85cTCjwWB7zRf2jU0yRRvbPJhV+jZ2EDMIWLsuno3
Mr2cnLTNbmRUamy1GQDp/lywf2MPlsiJ+MlHiy2L7IvpffTjxyN5DzGdekSq6an0
8U9FB+UiNVyy73ePjfy2s5bVrYePMmEGKXZWGTGwKlyr3Xqk5We6857Xi3HP8Tva
pctpanxAf4MxvfNe2sf3RS4sNSgfKS1OSMsQGOnPMEKTx323hQlxphjKJwt+VOKb
Ni8kGG2kyZi+b/qY4TtbMqBcuaiczzcxdzKGQFh2pP75/C2Zj/Lnj46CpzbWp+lc
2NKt+fMYebE/LK8gbUBDcWKBnLmFtjz4NmYxDtjm3E55DoVFsV3ETZHftD6+1g3E
bafPPizdBHuflx8zXZrmggJClYlhxyomJO4XFtElZRX//4F0IeAaNiYwNqghG3wc
bS1CPrp2cHp6o9c7j9GP4HXy3dxWOilpsjxv029n0JxbEkEdBF0KzQU04vRZAZrW
69BMlV1x59A+H4ub2eIT+IwhiYplOW98MO7U/bSXZ/S3fVGcs1sLuddxVu4mISEB
OyzYs4sDdF1MUM3bFrirhvRFn1xzWYUUVkTerosmpW9EPvwYYcZVI7mRom95po8C
MKDhPw+CZCKpe8gm1+7H
=hpi8
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list