Mesa (master): glsl: remember which SSBOs are not read-only and pass it to gallium
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Apr 4 23:29:21 UTC 2019
Module: Mesa
Branch: master
Commit: 4e1e8f684bf57df90afd60b460d65d9c09ab0d08
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4e1e8f684bf57df90afd60b460d65d9c09ab0d08
Author: Marek Olšák <marek.olsak at amd.com>
Date: Wed Apr 3 14:22:16 2019 -0400
glsl: remember which SSBOs are not read-only and pass it to gallium
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
---
src/compiler/glsl/link_uniforms.cpp | 11 +++++++++++
src/compiler/glsl/serialize.cpp | 2 ++
src/mesa/main/mtypes.h | 5 +++++
src/mesa/state_tracker/st_atom_storagebuf.c | 3 ++-
4 files changed, 20 insertions(+), 1 deletion(-)
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(
More information about the mesa-commit
mailing list