diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2017-05-11 17:43:19 +0200 |
---|---|---|
committer | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2017-05-12 10:30:37 +0200 |
commit | 4aa4e17f4e8ee0ed3bef7f1bea253781a2e5eb90 (patch) | |
tree | 2cce5d3bc8b3212ad573a631ea628bf4e65d59d1 | |
parent | f87416f62d0a6874300cde340a199926074b14d2 (diff) |
glsl: order indices for images inside a struct array
ARB_bindless_texture allows images to be declared inside
structures. This is similar to samplers.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
-rw-r--r-- | src/compiler/glsl/link_uniforms.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index 0d1e65cf31..c5db1d62cb 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -441,6 +441,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()) { @@ -501,6 +502,7 @@ public: process(var); } delete this->record_next_sampler; + delete this->record_next_image; } int buffer_block_index; @@ -593,27 +595,26 @@ 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; + if (!set_opaque_indices(base_type, uniform, name, this->next_image, + this->record_next_image)) + return; + /* 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; + } } } @@ -705,7 +706,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 @@ -852,6 +853,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; |