[Mesa-dev] [PATCH 21/32] glsl: don't reprocess or clear UBOs on cache fallback
Nicolai Hähnle
nhaehnle at gmail.com
Thu Feb 16 11:29:26 UTC 2017
Patches 16-21:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 14.02.2017 01:52, Timothy Arceri wrote:
> From: Timothy Arceri <timothy.arceri at collabora.com>
>
> ---
> src/compiler/glsl/linker.cpp | 62 +++++++++++++++++++++++---------------------
> src/mesa/main/shaderobj.c | 16 +++++++-----
> 2 files changed, 42 insertions(+), 36 deletions(-)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index c875e41..72fea65 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -2252,32 +2252,34 @@ link_intrastage_shaders(void *mem_ctx,
> v.run(linked->ir);
> v.fixup_unnamed_interface_types();
>
> - /* Link up uniform blocks defined within this stage. */
> - link_uniform_blocks(mem_ctx, ctx, prog, linked, &ubo_blocks,
> - &num_ubo_blocks, &ssbo_blocks, &num_ssbo_blocks);
> -
> - if (!prog->data->LinkStatus) {
> - _mesa_delete_linked_shader(ctx, linked);
> - return NULL;
> - }
> + if (!prog->data->cache_fallback) {
> + /* Link up uniform blocks defined within this stage. */
> + link_uniform_blocks(mem_ctx, ctx, prog, linked, &ubo_blocks,
> + &num_ubo_blocks, &ssbo_blocks, &num_ssbo_blocks);
>
> - /* Copy ubo blocks to linked shader list */
> - linked->Program->sh.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->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
> - }
> - linked->Program->info.num_ubos = num_ubo_blocks;
> + if (!prog->data->LinkStatus) {
> + _mesa_delete_linked_shader(ctx, linked);
> + return NULL;
> + }
>
> - /* Copy ssbo blocks to linked shader list */
> - linked->Program->sh.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->Program->sh.ShaderStorageBlocks[i] = &ssbo_blocks[i];
> + /* Copy ubo blocks to linked shader list */
> + linked->Program->sh.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->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
> + }
> + linked->Program->info.num_ubos = num_ubo_blocks;
> +
> + /* Copy ssbo blocks to linked shader list */
> + linked->Program->sh.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->Program->sh.ShaderStorageBlocks[i] = &ssbo_blocks[i];
> + }
> + linked->Program->info.num_ssbos = num_ssbo_blocks;
> }
> - linked->Program->info.num_ssbos = num_ssbo_blocks;
>
> /* At this point linked should contain all of the linked IR, so
> * validate it to make sure nothing went wrong.
> @@ -4870,13 +4872,15 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> if (prog->SeparateShader)
> disable_varying_optimizations_for_sso(prog);
>
> - /* Process UBOs */
> - if (!interstage_cross_validate_uniform_blocks(prog, false))
> - goto done;
> + if (!prog->data->cache_fallback) {
> + /* Process UBOs */
> + if (!interstage_cross_validate_uniform_blocks(prog, false))
> + goto done;
>
> - /* Process SSBOs */
> - if (!interstage_cross_validate_uniform_blocks(prog, true))
> - goto done;
> + /* Process SSBOs */
> + if (!interstage_cross_validate_uniform_blocks(prog, true))
> + goto done;
> + }
>
> /* Do common optimization before assigning storage for attributes,
> * uniforms, and varyings. Later optimization could possibly make
> diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
> index 1ed19a6..8a5fa5e 100644
> --- a/src/mesa/main/shaderobj.c
> +++ b/src/mesa/main/shaderobj.c
> @@ -351,13 +351,15 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
> ralloc_free(shProg->data->InfoLog);
> shProg->data->InfoLog = ralloc_strdup(shProg->data, "");
>
> - ralloc_free(shProg->data->UniformBlocks);
> - shProg->data->UniformBlocks = NULL;
> - shProg->data->NumUniformBlocks = 0;
> -
> - ralloc_free(shProg->data->ShaderStorageBlocks);
> - shProg->data->ShaderStorageBlocks = NULL;
> - shProg->data->NumShaderStorageBlocks = 0;
> + if (!shProg->data->cache_fallback) {
> + ralloc_free(shProg->data->UniformBlocks);
> + shProg->data->UniformBlocks = NULL;
> + shProg->data->NumUniformBlocks = 0;
> +
> + ralloc_free(shProg->data->ShaderStorageBlocks);
> + shProg->data->ShaderStorageBlocks = NULL;
> + shProg->data->NumShaderStorageBlocks = 0;
> + }
>
> if (shProg->data->AtomicBuffers && !shProg->data->cache_fallback) {
> ralloc_free(shProg->data->AtomicBuffers);
>
More information about the mesa-dev
mailing list