[Mesa-dev] [PATCH 2/2] glsl: order indices for images inside a struct array
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu May 11 13:34:27 UTC 2017
ARB_bindless_texture allows images to be declared inside
structures. This is similar to samplers.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/compiler/glsl/link_uniforms.cpp | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp
index 51edb759f2..36a36f178f 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -442,6 +442,7 @@ public:
current_var = var;
field_counter = 0;
this->record_next_sampler = new string_to_uint_map;
+ this->record_next_image = new string_to_uint_map;
buffer_block_index = -1;
if (var->is_in_buffer_block()) {
@@ -502,6 +503,7 @@ public:
process(var);
}
delete this->record_next_sampler;
+ delete this->record_next_image;
}
int buffer_block_index;
@@ -595,27 +597,25 @@ private:
}
void handle_images(const glsl_type *base_type,
- struct gl_uniform_storage *uniform)
+ struct gl_uniform_storage *uniform, const char *name)
{
if (base_type->is_image()) {
- uniform->opaque[shader_type].index = this->next_image;
uniform->opaque[shader_type].active = true;
+ count_indices(base_type, uniform, name, this->next_image,
+ this->record_next_image);
+
/* Set image access qualifiers */
const GLenum access =
(current_var->data.memory_read_only ? GL_READ_ONLY :
current_var->data.memory_write_only ? GL_WRITE_ONLY :
GL_READ_WRITE);
- const unsigned first = this->next_image;
-
- /* Increment the image index by 1 for non-arrays and by the
- * number of array elements for arrays.
- */
- this->next_image += MAX2(1, uniform->array_elements);
-
- for (unsigned i = first; i < MIN2(next_image, MAX_IMAGE_UNIFORMS); i++)
+ for (unsigned i = uniform->opaque[shader_type].index;
+ i < MIN2(this->next_image, MAX_IMAGE_UNIFORMS);
+ i++) {
prog->_LinkedShaders[shader_type]->Program->sh.ImageAccess[i] = access;
+ }
}
}
@@ -707,7 +707,7 @@ private:
/* This assigns uniform indices to sampler and image uniforms. */
handle_samplers(base_type, &this->uniforms[id], name);
- handle_images(base_type, &this->uniforms[id]);
+ handle_images(base_type, &this->uniforms[id], name);
handle_subroutines(base_type, &this->uniforms[id]);
/* For array of arrays or struct arrays the base location may have
@@ -855,6 +855,11 @@ private:
*/
struct string_to_uint_map *record_next_sampler;
+ /* Map for temporarily storing next imager index when handling images in
+ * struct arrays.
+ */
+ struct string_to_uint_map *record_next_image;
+
public:
union gl_constant_value *values;
--
2.12.2
More information about the mesa-dev
mailing list