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:
@@ -198,6 +198,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
|
|||||||
void *dead_ctx)
|
void *dead_ctx)
|
||||||
{
|
{
|
||||||
switch (instr->intrinsic) {
|
switch (instr->intrinsic) {
|
||||||
|
case nir_intrinsic_demote:
|
||||||
case nir_intrinsic_discard:
|
case nir_intrinsic_discard:
|
||||||
case nir_intrinsic_discard_if:
|
case nir_intrinsic_discard_if:
|
||||||
assert(shader->info.stage == MESA_SHADER_FRAGMENT);
|
assert(shader->info.stage == MESA_SHADER_FRAGMENT);
|
||||||
|
@@ -190,6 +190,16 @@ def barrier(name):
|
|||||||
barrier("barrier")
|
barrier("barrier")
|
||||||
barrier("discard")
|
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
|
# Memory barrier with semantics analogous to the memoryBarrier() GLSL
|
||||||
# intrinsic.
|
# intrinsic.
|
||||||
barrier("memory_barrier")
|
barrier("memory_barrier")
|
||||||
|
Reference in New Issue
Block a user