radeonsi/nir: Use uniform location when calculating const_file_max.

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>
This commit is contained in:
Timur Kristóf 2019-02-19 14:19:59 +01:00 committed by Timothy Arceri
parent afb15d14ca
commit 9429bcc4b0

View 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;
}
}
}