glsl: don't reprocess or clear UBOs on cache fallback
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:

committed by
Timothy Arceri

parent
01d1e5a7ad
commit
cad1a9bfde
@@ -2252,32 +2252,34 @@ link_intrastage_shaders(void *mem_ctx,
|
|||||||
v.run(linked->ir);
|
v.run(linked->ir);
|
||||||
v.fixup_unnamed_interface_types();
|
v.fixup_unnamed_interface_types();
|
||||||
|
|
||||||
/* Link up uniform blocks defined within this stage. */
|
if (!prog->data->cache_fallback) {
|
||||||
link_uniform_blocks(mem_ctx, ctx, prog, linked, &ubo_blocks,
|
/* Link up uniform blocks defined within this stage. */
|
||||||
&num_ubo_blocks, &ssbo_blocks, &num_ssbo_blocks);
|
link_uniform_blocks(mem_ctx, ctx, prog, linked, &ubo_blocks,
|
||||||
|
&num_ubo_blocks, &ssbo_blocks, &num_ssbo_blocks);
|
||||||
|
|
||||||
if (!prog->data->LinkStatus) {
|
if (!prog->data->LinkStatus) {
|
||||||
_mesa_delete_linked_shader(ctx, linked);
|
_mesa_delete_linked_shader(ctx, linked);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy ubo blocks to linked shader list */
|
/* Copy ubo blocks to linked shader list */
|
||||||
linked->Program->sh.UniformBlocks =
|
linked->Program->sh.UniformBlocks =
|
||||||
ralloc_array(linked, gl_uniform_block *, num_ubo_blocks);
|
ralloc_array(linked, gl_uniform_block *, num_ubo_blocks);
|
||||||
ralloc_steal(linked, ubo_blocks);
|
ralloc_steal(linked, ubo_blocks);
|
||||||
for (unsigned i = 0; i < num_ubo_blocks; i++) {
|
for (unsigned i = 0; i < num_ubo_blocks; i++) {
|
||||||
linked->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
|
linked->Program->sh.UniformBlocks[i] = &ubo_blocks[i];
|
||||||
}
|
}
|
||||||
linked->Program->info.num_ubos = num_ubo_blocks;
|
linked->Program->info.num_ubos = num_ubo_blocks;
|
||||||
|
|
||||||
/* Copy ssbo blocks to linked shader list */
|
/* Copy ssbo blocks to linked shader list */
|
||||||
linked->Program->sh.ShaderStorageBlocks =
|
linked->Program->sh.ShaderStorageBlocks =
|
||||||
ralloc_array(linked, gl_uniform_block *, num_ssbo_blocks);
|
ralloc_array(linked, gl_uniform_block *, num_ssbo_blocks);
|
||||||
ralloc_steal(linked, ssbo_blocks);
|
ralloc_steal(linked, ssbo_blocks);
|
||||||
for (unsigned i = 0; i < num_ssbo_blocks; i++) {
|
for (unsigned i = 0; i < num_ssbo_blocks; i++) {
|
||||||
linked->Program->sh.ShaderStorageBlocks[i] = &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
|
/* At this point linked should contain all of the linked IR, so
|
||||||
* validate it to make sure nothing went wrong.
|
* 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)
|
if (prog->SeparateShader)
|
||||||
disable_varying_optimizations_for_sso(prog);
|
disable_varying_optimizations_for_sso(prog);
|
||||||
|
|
||||||
/* Process UBOs */
|
if (!prog->data->cache_fallback) {
|
||||||
if (!interstage_cross_validate_uniform_blocks(prog, false))
|
/* Process UBOs */
|
||||||
goto done;
|
if (!interstage_cross_validate_uniform_blocks(prog, false))
|
||||||
|
goto done;
|
||||||
|
|
||||||
/* Process SSBOs */
|
/* Process SSBOs */
|
||||||
if (!interstage_cross_validate_uniform_blocks(prog, true))
|
if (!interstage_cross_validate_uniform_blocks(prog, true))
|
||||||
goto done;
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Do common optimization before assigning storage for attributes,
|
/* Do common optimization before assigning storage for attributes,
|
||||||
* uniforms, and varyings. Later optimization could possibly make
|
* uniforms, and varyings. Later optimization could possibly make
|
||||||
|
@@ -351,13 +351,15 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
|
|||||||
ralloc_free(shProg->data->InfoLog);
|
ralloc_free(shProg->data->InfoLog);
|
||||||
shProg->data->InfoLog = ralloc_strdup(shProg->data, "");
|
shProg->data->InfoLog = ralloc_strdup(shProg->data, "");
|
||||||
|
|
||||||
ralloc_free(shProg->data->UniformBlocks);
|
if (!shProg->data->cache_fallback) {
|
||||||
shProg->data->UniformBlocks = NULL;
|
ralloc_free(shProg->data->UniformBlocks);
|
||||||
shProg->data->NumUniformBlocks = 0;
|
shProg->data->UniformBlocks = NULL;
|
||||||
|
shProg->data->NumUniformBlocks = 0;
|
||||||
|
|
||||||
ralloc_free(shProg->data->ShaderStorageBlocks);
|
ralloc_free(shProg->data->ShaderStorageBlocks);
|
||||||
shProg->data->ShaderStorageBlocks = NULL;
|
shProg->data->ShaderStorageBlocks = NULL;
|
||||||
shProg->data->NumShaderStorageBlocks = 0;
|
shProg->data->NumShaderStorageBlocks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (shProg->data->AtomicBuffers && !shProg->data->cache_fallback) {
|
if (shProg->data->AtomicBuffers && !shProg->data->cache_fallback) {
|
||||||
ralloc_free(shProg->data->AtomicBuffers);
|
ralloc_free(shProg->data->AtomicBuffers);
|
||||||
|
Reference in New Issue
Block a user