nir/gather_info: Look for uses of helper invocations

The one obvious omission here is gl_HelperInvocation itself.  However,
the spec doesn't require that we generate then when gl_HelperInvocation
is used, it merely mandates that we report them if they are there.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Jason Ekstrand
2019-06-07 18:07:46 -05:00
parent 41ab92a327
commit ae392d73c9
2 changed files with 27 additions and 0 deletions

View File

@@ -264,6 +264,14 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
(1ull << nir_system_value_from_intrinsic(instr->intrinsic)); (1ull << nir_system_value_from_intrinsic(instr->intrinsic));
break; break;
case nir_intrinsic_quad_broadcast:
case nir_intrinsic_quad_swap_horizontal:
case nir_intrinsic_quad_swap_vertical:
case nir_intrinsic_quad_swap_diagonal:
if (shader->info.stage == MESA_SHADER_FRAGMENT)
shader->info.fs.needs_helper_invocations = true;
break;
case nir_intrinsic_end_primitive: case nir_intrinsic_end_primitive:
case nir_intrinsic_end_primitive_with_counter: case nir_intrinsic_end_primitive_with_counter:
assert(shader->info.stage == MESA_SHADER_GEOMETRY); assert(shader->info.stage == MESA_SHADER_GEOMETRY);
@@ -284,6 +292,10 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
static void static void
gather_tex_info(nir_tex_instr *instr, nir_shader *shader) gather_tex_info(nir_tex_instr *instr, nir_shader *shader)
{ {
if (shader->info.stage == MESA_SHADER_FRAGMENT &&
nir_tex_instr_has_implicit_derivative(instr))
shader->info.fs.needs_helper_invocations = true;
switch (instr->op) { switch (instr->op) {
case nir_texop_tg4: case nir_texop_tg4:
shader->info.uses_texture_gather = true; shader->info.uses_texture_gather = true;
@@ -300,6 +312,13 @@ gather_alu_info(nir_alu_instr *instr, nir_shader *shader)
case nir_op_fddx: case nir_op_fddx:
case nir_op_fddy: case nir_op_fddy:
shader->info.uses_fddx_fddy = true; shader->info.uses_fddx_fddy = true;
/* Fall through */
case nir_op_fddx_fine:
case nir_op_fddy_fine:
case nir_op_fddx_coarse:
case nir_op_fddy_coarse:
if (shader->info.stage == MESA_SHADER_FRAGMENT)
shader->info.fs.needs_helper_invocations = true;
break; break;
default: default:
break; break;

View File

@@ -188,6 +188,14 @@ typedef struct shader_info {
struct { struct {
bool uses_discard; bool uses_discard;
/**
* True if this fragment shader requires helper invocations. This
* can be caused by the use of ALU derivative ops, texture
* instructions which do implicit derivatives, and the use of quad
* subgroup operations.
*/
bool needs_helper_invocations;
/** /**
* Whether any inputs are declared with the "sample" qualifier. * Whether any inputs are declared with the "sample" qualifier.
*/ */