mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 06:20:19 +01:00
v3d: Split out NIR input setup between FS and VPM.
They don't share much code, and I'm about to rewrite the remaining shared code for the VPM case.
This commit is contained in:
parent
8265dfaa87
commit
cc78676030
1 changed files with 78 additions and 45 deletions
|
|
@ -1274,7 +1274,7 @@ ntq_emit_vpm_read(struct v3d_compile *c,
|
|||
}
|
||||
|
||||
static void
|
||||
ntq_setup_inputs(struct v3d_compile *c)
|
||||
ntq_setup_vpm_inputs(struct v3d_compile *c)
|
||||
{
|
||||
unsigned num_entries = 0;
|
||||
unsigned num_components = 0;
|
||||
|
|
@ -1297,24 +1297,22 @@ ntq_setup_inputs(struct v3d_compile *c)
|
|||
qsort(&vars, num_entries, sizeof(*vars), driver_location_compare);
|
||||
|
||||
uint32_t vpm_components_queued = 0;
|
||||
if (c->s->info.stage == MESA_SHADER_VERTEX) {
|
||||
bool uses_iid = c->s->info.system_values_read &
|
||||
(1ull << SYSTEM_VALUE_INSTANCE_ID);
|
||||
bool uses_vid = c->s->info.system_values_read &
|
||||
(1ull << SYSTEM_VALUE_VERTEX_ID);
|
||||
bool uses_iid = c->s->info.system_values_read &
|
||||
(1ull << SYSTEM_VALUE_INSTANCE_ID);
|
||||
bool uses_vid = c->s->info.system_values_read &
|
||||
(1ull << SYSTEM_VALUE_VERTEX_ID);
|
||||
|
||||
num_components += uses_iid;
|
||||
num_components += uses_vid;
|
||||
num_components += uses_iid;
|
||||
num_components += uses_vid;
|
||||
|
||||
if (uses_iid) {
|
||||
c->iid = ntq_emit_vpm_read(c, &vpm_components_queued,
|
||||
&num_components, ~0);
|
||||
}
|
||||
if (uses_iid) {
|
||||
c->iid = ntq_emit_vpm_read(c, &vpm_components_queued,
|
||||
&num_components, ~0);
|
||||
}
|
||||
|
||||
if (uses_vid) {
|
||||
c->vid = ntq_emit_vpm_read(c, &vpm_components_queued,
|
||||
&num_components, ~0);
|
||||
}
|
||||
if (uses_vid) {
|
||||
c->vid = ntq_emit_vpm_read(c, &vpm_components_queued,
|
||||
&num_components, ~0);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < num_entries; i++) {
|
||||
|
|
@ -1327,40 +1325,71 @@ ntq_setup_inputs(struct v3d_compile *c)
|
|||
resize_qreg_array(c, &c->inputs, &c->inputs_array_size,
|
||||
(loc + 1) * 4);
|
||||
|
||||
if (c->s->info.stage == MESA_SHADER_FRAGMENT) {
|
||||
if (var->data.location == VARYING_SLOT_POS) {
|
||||
emit_fragcoord_input(c, loc);
|
||||
} else if (var->data.location == VARYING_SLOT_PNTC ||
|
||||
(var->data.location >= VARYING_SLOT_VAR0 &&
|
||||
(c->fs_key->point_sprite_mask &
|
||||
(1 << (var->data.location -
|
||||
VARYING_SLOT_VAR0))))) {
|
||||
c->inputs[loc * 4 + 0] = c->point_x;
|
||||
c->inputs[loc * 4 + 1] = c->point_y;
|
||||
} else {
|
||||
emit_fragment_input(c, loc, var);
|
||||
}
|
||||
} else {
|
||||
int var_components = glsl_get_components(var->type);
|
||||
int var_components = glsl_get_components(var->type);
|
||||
|
||||
for (int i = 0; i < var_components; i++) {
|
||||
c->inputs[loc * 4 + i] =
|
||||
ntq_emit_vpm_read(c,
|
||||
&vpm_components_queued,
|
||||
&num_components,
|
||||
loc * 4 + i);
|
||||
for (int i = 0; i < var_components; i++) {
|
||||
c->inputs[loc * 4 + i] =
|
||||
ntq_emit_vpm_read(c,
|
||||
&vpm_components_queued,
|
||||
&num_components,
|
||||
loc * 4 + i);
|
||||
|
||||
}
|
||||
c->vattr_sizes[loc] = var_components;
|
||||
}
|
||||
c->vattr_sizes[loc] = var_components;
|
||||
}
|
||||
|
||||
if (c->s->info.stage == MESA_SHADER_VERTEX) {
|
||||
if (c->devinfo->ver >= 40) {
|
||||
assert(vpm_components_queued == num_components);
|
||||
if (c->devinfo->ver >= 40) {
|
||||
assert(vpm_components_queued == num_components);
|
||||
} else {
|
||||
assert(vpm_components_queued == 0);
|
||||
assert(num_components == 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ntq_setup_fs_inputs(struct v3d_compile *c)
|
||||
{
|
||||
unsigned num_entries = 0;
|
||||
unsigned num_components = 0;
|
||||
nir_foreach_variable(var, &c->s->inputs) {
|
||||
num_entries++;
|
||||
num_components += glsl_get_components(var->type);
|
||||
}
|
||||
|
||||
nir_variable *vars[num_entries];
|
||||
|
||||
unsigned i = 0;
|
||||
nir_foreach_variable(var, &c->s->inputs)
|
||||
vars[i++] = var;
|
||||
|
||||
/* Sort the variables so that we emit the input setup in
|
||||
* driver_location order. This is required for VPM reads, whose data
|
||||
* is fetched into the VPM in driver_location (TGSI register index)
|
||||
* order.
|
||||
*/
|
||||
qsort(&vars, num_entries, sizeof(*vars), driver_location_compare);
|
||||
|
||||
for (unsigned i = 0; i < num_entries; i++) {
|
||||
nir_variable *var = vars[i];
|
||||
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);
|
||||
|
||||
if (var->data.location == VARYING_SLOT_POS) {
|
||||
emit_fragcoord_input(c, loc);
|
||||
} else if (var->data.location == VARYING_SLOT_PNTC ||
|
||||
(var->data.location >= VARYING_SLOT_VAR0 &&
|
||||
(c->fs_key->point_sprite_mask &
|
||||
(1 << (var->data.location -
|
||||
VARYING_SLOT_VAR0))))) {
|
||||
c->inputs[loc * 4 + 0] = c->point_x;
|
||||
c->inputs[loc * 4 + 1] = c->point_y;
|
||||
} else {
|
||||
assert(vpm_components_queued == 0);
|
||||
assert(num_components == 0);
|
||||
emit_fragment_input(c, loc, var);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1903,7 +1932,11 @@ nir_to_vir(struct v3d_compile *c)
|
|||
}
|
||||
}
|
||||
|
||||
ntq_setup_inputs(c);
|
||||
if (c->s->info.stage == MESA_SHADER_FRAGMENT)
|
||||
ntq_setup_fs_inputs(c);
|
||||
else
|
||||
ntq_setup_vpm_inputs(c);
|
||||
|
||||
ntq_setup_outputs(c);
|
||||
ntq_setup_uniforms(c);
|
||||
ntq_setup_registers(c, &c->s->registers);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue