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:
@@ -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;
|
||||||
|
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user