Browse Source

v3d: Add support for matrix inputs to the FS.

We've been relying on linking splitting up our varying matrices into
separate vectors, but with SSO that doesn't happen.  Supporting matrix
inputs isn't too hard, though.
tags/19.0-branchpoint
Eric Anholt 6 years ago
parent
commit
1a63227ea0
1 changed files with 14 additions and 13 deletions
  1. 14
    13
      src/broadcom/compiler/nir_to_vir.c

+ 14
- 13
src/broadcom/compiler/nir_to_vir.c View File

@@ -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);
}
}


Loading…
Cancel
Save