[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