nir: Add demote and is_helper_invocation intrinsics

From SPV_EXT_demote_to_helper_invocation.  Demote will be implemented
as a variant of discard, so mark uses_discard if it is used.

v2: Add CAN_ELIMINATE flag to the new intrinsic.  (Jason)

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Caio Marcelo de Oliveira Filho
2019-06-07 17:29:05 -07:00
parent 9b116173b6
commit a42e8f0ed1
2 changed files with 11 additions and 0 deletions

View File

@@ -198,6 +198,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
void *dead_ctx)
{
switch (instr->intrinsic) {
case nir_intrinsic_demote:
case nir_intrinsic_discard:
case nir_intrinsic_discard_if:
assert(shader->info.stage == MESA_SHADER_FRAGMENT);

View File

@@ -190,6 +190,16 @@ def barrier(name):
barrier("barrier")
barrier("discard")
# Demote fragment shader invocation to a helper invocation. Any stores to
# memory after this instruction are suppressed and the fragment does not write
# outputs to the framebuffer. Unlike discard, demote needs to ensure that
# derivatives will still work for invocations that were not demoted.
#
# As specified by SPV_EXT_demote_to_helper_invocation.
barrier("demote")
intrinsic("is_helper_invocation", dest_comp=1, flags=[CAN_ELIMINATE])
# Memory barrier with semantics analogous to the memoryBarrier() GLSL
# intrinsic.
barrier("memory_barrier")