v3d: don't emit point coordinates varyings if the FS doesn't read them

We still need to emit them in V3D 3.x since there there is no mechanism to
disable them.

Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Iago Toral Quiroga
2019-06-06 10:04:27 +02:00
parent 5e26e55e72
commit 9b96ae69bc
4 changed files with 27 additions and 5 deletions

View File

@@ -1462,6 +1462,17 @@ var_needs_point_coord(struct v3d_compile *c, nir_variable *var)
(1 << (var->data.location - VARYING_SLOT_VAR0))))); (1 << (var->data.location - VARYING_SLOT_VAR0)))));
} }
static bool
program_reads_point_coord(struct v3d_compile *c)
{
nir_foreach_variable(var, &c->s->inputs) {
if (var_needs_point_coord(c, var))
return true;
}
return false;
}
static void static void
ntq_setup_fs_inputs(struct v3d_compile *c) ntq_setup_fs_inputs(struct v3d_compile *c)
{ {
@@ -2300,15 +2311,17 @@ nir_to_vir(struct v3d_compile *c)
c->payload_w_centroid = vir_MOV(c, vir_reg(QFILE_REG, 1)); c->payload_w_centroid = vir_MOV(c, vir_reg(QFILE_REG, 1));
c->payload_z = vir_MOV(c, vir_reg(QFILE_REG, 2)); c->payload_z = vir_MOV(c, vir_reg(QFILE_REG, 2));
/* XXX perf: We could set the "disable implicit point/line /* V3D 4.x can disable implicit point coordinate varyings if
* varyings" field in the shader record and not emit these, if * they are not used.
* they're not going to be used.
*/ */
if (c->fs_key->is_points) { if (c->fs_key->is_points &&
(c->devinfo->ver < 40 || program_reads_point_coord(c))) {
c->point_x = emit_fragment_varying(c, NULL, 0, 0); c->point_x = emit_fragment_varying(c, NULL, 0, 0);
c->point_y = 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->uses_implicit_point_line_varyings = true;
} else if (c->fs_key->is_lines && c->devinfo->ver < 40) {
c->line_x = emit_fragment_varying(c, NULL, 0, 0); c->line_x = emit_fragment_varying(c, NULL, 0, 0);
c->uses_implicit_point_line_varyings = true;
} }
break; break;
case MESA_SHADER_COMPUTE: case MESA_SHADER_COMPUTE:

View File

@@ -513,6 +513,7 @@ struct v3d_compile {
bool uses_center_w; bool uses_center_w;
bool writes_z; bool writes_z;
bool uses_implicit_point_line_varyings;
/* State for whether we're executing on each channel currently. 0 if /* State for whether we're executing on each channel currently. 0 if
* yes, otherwise a block number + 1 that the channel jumped to. * yes, otherwise a block number + 1 that the channel jumped to.
@@ -689,6 +690,7 @@ struct v3d_fs_prog_data {
bool writes_z; bool writes_z;
bool disable_ez; bool disable_ez;
bool uses_center_w; bool uses_center_w;
bool uses_implicit_point_line_varyings;
}; };
struct v3d_compute_prog_data { struct v3d_compute_prog_data {

View File

@@ -688,6 +688,8 @@ v3d_fs_set_prog_data(struct v3d_compile *c,
prog_data->writes_z = c->writes_z; prog_data->writes_z = c->writes_z;
prog_data->disable_ez = !c->s->info.fs.early_fragment_tests; prog_data->disable_ez = !c->s->info.fs.early_fragment_tests;
prog_data->uses_center_w = c->uses_center_w; prog_data->uses_center_w = c->uses_center_w;
prog_data->uses_implicit_point_line_varyings =
c->uses_implicit_point_line_varyings;
} }
static void static void

View File

@@ -236,6 +236,11 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d,
shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 = shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
v3d->prog.fs->prog_data.fs->uses_center_w; v3d->prog.fs->prog_data.fs->uses_center_w;
#if V3D_VERSION >= 40
shader.disable_implicit_point_line_varyings =
!v3d->prog.fs->prog_data.fs->uses_implicit_point_line_varyings;
#endif
shader.number_of_varyings_in_fragment_shader = shader.number_of_varyings_in_fragment_shader =
v3d->prog.fs->prog_data.fs->num_inputs; v3d->prog.fs->prog_data.fs->num_inputs;