[Mesa-dev] [PATCH 2/2] i965/tcs: support gl_PatchVerticesIn as a system value from SPIR-V
Jason Ekstrand
jason at jlekstrand.net
Sun Jan 7 05:07:44 UTC 2018
On Sat, Jan 6, 2018 at 5:12 PM, Kenneth Graunke <kenneth at whitecape.org>
wrote:
> On Wednesday, November 15, 2017 11:53:08 PM PST Iago Toral Quiroga wrote:
> > We currently handle this by lowering it to a uniform for gen8+ but
> > the SPIR-V path generates this as a system value, so handle that
> > case as well.
> > ---
> > src/mesa/drivers/dri/i965/brw_tcs.c | 9 ++++++++-
> > 1 file changed, 8 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c
> b/src/mesa/drivers/dri/i965/brw_tcs.c
> > index 4424efea4f0..b07b11f485d 100644
> > --- a/src/mesa/drivers/dri/i965/brw_tcs.c
> > +++ b/src/mesa/drivers/dri/i965/brw_tcs.c
> > @@ -296,7 +296,14 @@ brw_tcs_populate_key(struct brw_context *brw,
> > per_patch_slots |= prog->info.patch_outputs_written;
> > }
> >
> > - if (devinfo->gen < 8 || !tcp)
> > + /* For GLSL, gen8+ lowers gl_PatchVerticesIn to a uniform, however
> > + * the SPIR-V path always lowers it to a system value.
> > + */
> > + bool reads_patch_vertices_as_system_value =
> > + tcp && (tcp->program.nir->info.system_values_read &
> > + BITFIELD64_BIT(SYSTEM_VALUE_VERTICES_IN));
> > +
> > + if (devinfo->gen < 8 || !tcp || reads_patch_vertices_as_
> system_value)
> > key->input_vertices = brw->ctx.TessCtrlProgram.patch_vertices;
> > key->outputs_written = per_vertex_slots;
> > key->patch_outputs_written = per_patch_slots;
> >
>
> I guess this is okay, and it's better than nothing. I'd really rather
> see it converted to a uniform, like it is in the normal GLSL paths. If
> you're going to add recompiles based on the key like this, it might be
> nice to at least update the brw_tcs_precompile function to guess, so we
> at least attempt to avoid a recompile.
>
Ugh... I'm happy to give a stronger "I don't like this". In Vulkan, this
is part of the pipeline state so we just pass it in through the shader
key. With GL, ugh... Personally, I think I'd be ok with just making it
state based all the time but we already have the infrastructure to pass it
through as a uniform so we may as well. I think the better thing to do
would be to add a quick little pass that moves VERTICES_IN to a uniform and
call that on gen8+ brw_link.cpp. Then we can delete
LowerTESPatchVerticesIn as i965 is the only user. The "pass" would be
really easy:
void
brw_nir_lower_tcs_vertices_in_to_uniform(nir_shader *nir, const struct
gl_program *prog, brw_tcs_prog_data *prog_data)
{
int uniform = -1;
nir_foreach_var_safe(var, &nir->system_values) {
if (var->data.location != SYSTEM_VALUE_VERTICES_IN)
continue;
if (uniform < -1) {
gl_state_index tokens[5] = {
STATE_INTERNAL,
STATE_TESS_PATCH_VERTICES_IN,
};
int index = _mesa_add_state_reference(prog->Parameters, tokens);
uniform = prog_data->nr_params;
uint32_t *param =
brw_stage_prog_data_add_params(&prog_data->base->base, 1);
*param = BRW_PARAM_PARAMETER(index, SWIZZLE_XXXX);
}
var->mode = nir_var_uniform;
var->data.location = uniform;
exec_node_remove(&var->node);
exec_list_push_tail(&nir->uniforms, &var->node);
}
}
I may not have gotten my state referencing quite right there, but I think
it's close. I'd probably put the pas in brw_nir_uniforms.cpp if I was
writing it.
--Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180106/e8d88e1a/attachment-0001.html>
More information about the mesa-dev
mailing list