From: Marek Olšák Date: Wed, 3 Apr 2019 18:22:16 +0000 (-0400) Subject: glsl: remember which SSBOs are not read-only and pass it to gallium X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e1e8f684bf57df90afd60b460d65d9c09ab0d08;p=mesa.git glsl: remember which SSBOs are not read-only and pass it to gallium Reviewed-by: Timothy Arceri --- diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index 8ca140dcaa8..ef124111991 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -504,6 +504,7 @@ public: this->next_bindless_image = 0; free(this->bindless_access); this->bindless_access = NULL; + this->shader_storage_blocks_write_access = 0; } void set_and_process(ir_variable *var) @@ -542,6 +543,10 @@ public: } assert(buffer_block_index != -1); + if (var->is_in_shader_storage_block() && + !var->data.memory_read_only) + shader_storage_blocks_write_access |= 1 << buffer_block_index; + /* Uniform blocks that were specified with an instance name must be * handled a little bit differently. The name of the variable is the * name used to reference the uniform block instead of being the name @@ -1021,6 +1026,10 @@ public: */ GLenum *bindless_access; + /** + * Bitmask of shader storage blocks not declared as read-only. + */ + unsigned shader_storage_blocks_write_access; }; static bool @@ -1382,6 +1391,8 @@ link_assign_uniform_storage(struct gl_context *ctx, shader->Program->SamplersUsed = parcel.shader_samplers_used; shader->shadow_samplers = parcel.shader_shadow_samplers; + shader->Program->sh.ShaderStorageBlocksWriteAccess = + parcel.shader_storage_blocks_write_access; if (parcel.num_bindless_samplers > 0) { shader->Program->sh.NumBindlessSamplers = parcel.num_bindless_samplers; diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index ad258f8bcb1..47e535842fa 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -1065,6 +1065,7 @@ write_shader_metadata(struct blob *metadata, gl_linked_shader *shader) sizeof(glprog->sh.SamplerTargets)); blob_write_uint32(metadata, glprog->ShadowSamplers); blob_write_uint32(metadata, glprog->ExternalSamplersUsed); + blob_write_uint32(metadata, glprog->sh.ShaderStorageBlocksWriteAccess); blob_write_bytes(metadata, glprog->sh.ImageAccess, sizeof(glprog->sh.ImageAccess)); @@ -1119,6 +1120,7 @@ read_shader_metadata(struct blob_reader *metadata, sizeof(glprog->sh.SamplerTargets)); glprog->ShadowSamplers = blob_read_uint32(metadata); glprog->ExternalSamplersUsed = blob_read_uint32(metadata); + glprog->sh.ShaderStorageBlocksWriteAccess = blob_read_uint32(metadata); blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageAccess, sizeof(glprog->sh.ImageAccess)); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index c1dc52b2ec4..1f70f048bd3 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2169,6 +2169,11 @@ struct gl_program struct gl_uniform_block **UniformBlocks; struct gl_uniform_block **ShaderStorageBlocks; + /** + * Bitmask of shader storage blocks not declared as read-only. + */ + unsigned ShaderStorageBlocksWriteAccess; + /** Which texture target is being sampled * (TEXTURE_1D/2D/3D/etc_INDEX) */ diff --git a/src/mesa/state_tracker/st_atom_storagebuf.c b/src/mesa/state_tracker/st_atom_storagebuf.c index a7f3856d298..5ec3175f2c9 100644 --- a/src/mesa/state_tracker/st_atom_storagebuf.c +++ b/src/mesa/state_tracker/st_atom_storagebuf.c @@ -82,7 +82,8 @@ st_bind_ssbos(struct st_context *st, struct gl_program *prog, } } st->pipe->set_shader_buffers(st->pipe, shader_type, buffer_base, - prog->info.num_ssbos, buffers, ~0); + prog->info.num_ssbos, buffers, + prog->sh.ShaderStorageBlocksWriteAccess); /* clear out any stale shader buffers */ if (prog->info.num_ssbos < c->MaxShaderStorageBlocks) st->pipe->set_shader_buffers(