radeonsi/nir: Use uniform location when calculating const_file_max.
authorTimur Kristóf <timur.kristof@gmail.com>
Tue, 19 Feb 2019 13:19:59 +0000 (14:19 +0100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 19 Feb 2019 23:37:47 +0000 (10:37 +1100)
The nine state tracker can produce NIR uniform variables
whose location is explicitly set. radeonsi did not take that
into account when calculating const_file_max, resulting in
rendering glitches. This patch fixes that.

Signed-Off-By: Timur Kristóf <timur.kristof@gmail.com>
Tested-by: Andre Heider <a.heider@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/gallium/drivers/radeonsi/si_shader_nir.c

index 7554f5b..4c5e124 100644 (file)
@@ -669,6 +669,9 @@ void si_nir_scan_shader(const struct nir_shader *nir,
                enum glsl_base_type base_type =
                        glsl_get_base_type(glsl_without_array(type));
                unsigned aoa_size = MAX2(1, glsl_get_aoa_size(type));
+               unsigned loc = variable->data.location;
+               int slot_count = glsl_count_attribute_slots(type, false);
+               int max_slot = MAX2(info->const_file_max[0], (int) loc) + slot_count;
 
                /* Gather buffers declared bitmasks. Note: radeonsi doesn't
                 * really use the mask (other than ubo_idx == 1 for regular
@@ -716,8 +719,7 @@ void si_nir_scan_shader(const struct nir_shader *nir,
                if (base_type == GLSL_TYPE_SAMPLER) {
                        if (variable->data.bindless) {
                                info->const_buffers_declared |= 1;
-                               info->const_file_max[0] +=
-                                       glsl_count_attribute_slots(type, false);
+                               info->const_file_max[0] = max_slot;
                        } else {
                                info->samplers_declared |=
                                        u_bit_consecutive(variable->data.binding, aoa_size);
@@ -725,8 +727,7 @@ void si_nir_scan_shader(const struct nir_shader *nir,
                } else if (base_type == GLSL_TYPE_IMAGE) {
                        if (variable->data.bindless) {
                                info->const_buffers_declared |= 1;
-                               info->const_file_max[0] +=
-                                       glsl_count_attribute_slots(type, false);
+                               info->const_file_max[0] = max_slot;
                        } else {
                                info->images_declared |=
                                        u_bit_consecutive(variable->data.binding, aoa_size);
@@ -741,8 +742,7 @@ void si_nir_scan_shader(const struct nir_shader *nir,
                                        u_bit_consecutive(0, SI_NUM_CONST_BUFFERS);
                        } else {
                                info->const_buffers_declared |= 1;
-                               info->const_file_max[0] +=
-                                       glsl_count_attribute_slots(type, false);
+                               info->const_file_max[0] = max_slot;
                        }
                }
        }