spirv: add support for AMD_shader_early_and_late_fragment_tests

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19738>
This commit is contained in:
Samuel Pitoiset
2022-11-15 08:29:00 +01:00
committed by Marge Bot
parent ac8131b564
commit 877c10efd1
3 changed files with 54 additions and 0 deletions
+12
View File
@@ -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
*/
+7
View File
@@ -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 {
+35
View File
@@ -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),