diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 21ea09f9017..ca80ac72927 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -945,6 +945,18 @@ enum gl_frag_depth_layout FRAG_DEPTH_LAYOUT_UNCHANGED }; +/** + * \brief Layout qualifiers for AMD_shader_early_and_late_fragment_tests. + */ +enum gl_frag_stencil_layout +{ + FRAG_STENCIL_LAYOUT_NONE, /**< No layout is specified. */ + FRAG_STENCIL_LAYOUT_ANY, + FRAG_STENCIL_LAYOUT_GREATER, + FRAG_STENCIL_LAYOUT_LESS, + FRAG_STENCIL_LAYOUT_UNCHANGED +}; + /** * \brief Buffer access qualifiers */ diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 0b5aa673d09..806f4bdc2d1 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -485,6 +485,13 @@ typedef struct shader_info { * shader. */ unsigned advanced_blend_modes; + + /** + * Defined by AMD_shader_early_and_late_fragment_tests. + */ + bool early_and_late_fragment_tests:1; + enum gl_frag_stencil_layout stencil_front_layout:3; + enum gl_frag_stencil_layout stencil_back_layout:3; } fs; struct { diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index b315e32d8d5..5a21f4d751d 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -5307,6 +5307,41 @@ vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point, "SpvExecutionModeSubgroupUniformControlFlowKHR not supported."); break; + case SpvExecutionModeEarlyAndLateFragmentTestsAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.early_and_late_fragment_tests = true; + break; + + case SpvExecutionModeStencilRefGreaterFrontAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_front_layout = FRAG_STENCIL_LAYOUT_GREATER; + break; + + case SpvExecutionModeStencilRefLessFrontAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_front_layout = FRAG_STENCIL_LAYOUT_LESS; + break; + + case SpvExecutionModeStencilRefUnchangedFrontAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_front_layout = FRAG_STENCIL_LAYOUT_UNCHANGED; + break; + + case SpvExecutionModeStencilRefGreaterBackAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_back_layout = FRAG_STENCIL_LAYOUT_GREATER; + break; + + case SpvExecutionModeStencilRefLessBackAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_back_layout = FRAG_STENCIL_LAYOUT_LESS; + break; + + case SpvExecutionModeStencilRefUnchangedBackAMD: + vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); + b->shader->info.fs.stencil_back_layout = FRAG_STENCIL_LAYOUT_UNCHANGED; + break; + default: vtn_fail("Unhandled execution mode: %s (%u)", spirv_executionmode_to_string(mode->exec_mode),