summaryrefslogtreecommitdiffstats
path: root/src/broadcom
diff options
context:
space:
mode:
Diffstat (limited to 'src/broadcom')
-rw-r--r--src/broadcom/compiler/nir_to_vir.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index defddecc847..2e7b1e8e8a2 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -445,7 +445,7 @@ emit_fragcoord_input(struct v3d_compile *c, int attr)
static struct qreg
emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
- uint8_t swizzle)
+ uint8_t swizzle, int array_index)
{
struct qreg r3 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R3);
struct qreg r5 = vir_reg(QFILE_MAGIC, V3D_QPU_WADDR_R5);
@@ -470,8 +470,9 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
}
int i = c->num_inputs++;
- c->input_slots[i] = v3d_slot_from_slot_and_component(var->data.location,
- swizzle);
+ c->input_slots[i] =
+ v3d_slot_from_slot_and_component(var->data.location +
+ array_index, swizzle);
switch (var->data.interpolation) {
case INTERP_MODE_NONE:
@@ -479,7 +480,7 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
* qualifier, then if we're using glShadeModel(GL_FLAT) it
* needs to be flat shaded.
*/
- switch (var->data.location) {
+ switch (var->data.location + array_index) {
case VARYING_SLOT_COL0:
case VARYING_SLOT_COL1:
case VARYING_SLOT_BFC0:
@@ -517,12 +518,13 @@ emit_fragment_varying(struct v3d_compile *c, nir_variable *var,
}
static void
-emit_fragment_input(struct v3d_compile *c, int attr, nir_variable *var)
+emit_fragment_input(struct v3d_compile *c, int attr, nir_variable *var,
+ int array_index)
{
for (int i = 0; i < glsl_get_vector_elements(var->type); i++) {
int chan = var->data.location_frac + i;
c->inputs[attr * 4 + chan] =
- emit_fragment_varying(c, var, chan);
+ emit_fragment_varying(c, var, chan, array_index);
}
}
@@ -1469,10 +1471,8 @@ ntq_setup_fs_inputs(struct v3d_compile *c)
unsigned array_len = MAX2(glsl_get_length(var->type), 1);
unsigned loc = var->data.driver_location;
- assert(array_len == 1);
- (void)array_len;
resize_qreg_array(c, &c->inputs, &c->inputs_array_size,
- (loc + 1) * 4);
+ (loc + array_len) * 4);
if (var->data.location == VARYING_SLOT_POS) {
emit_fragcoord_input(c, loc);
@@ -1484,7 +1484,8 @@ ntq_setup_fs_inputs(struct v3d_compile *c)
c->inputs[loc * 4 + 0] = c->point_x;
c->inputs[loc * 4 + 1] = c->point_y;
} else {
- emit_fragment_input(c, loc, var);
+ for (int j = 0; j < array_len; j++)
+ emit_fragment_input(c, loc + j, var, j);
}
}
}
@@ -2093,10 +2094,10 @@ nir_to_vir(struct v3d_compile *c)
* they're not going to be used.
*/
if (c->fs_key->is_points) {
- c->point_x = emit_fragment_varying(c, NULL, 0);
- c->point_y = emit_fragment_varying(c, NULL, 0);
+ c->point_x = emit_fragment_varying(c, NULL, 0, 0);
+ c->point_y = emit_fragment_varying(c, NULL, 0, 0);
} else if (c->fs_key->is_lines) {
- c->line_x = emit_fragment_varying(c, NULL, 0);
+ c->line_x = emit_fragment_varying(c, NULL, 0, 0);
}
}