An attempt to support SpvExecutionModeStencilRefReplacingEXT's behavior also follows, with the interpretation to said mode being we prevent writes to the built-in FragStencilRefEXT variable when the execution mode isn't set. --- src/compiler/shader_info.h | 2 ++ src/compiler/spirv/spirv_to_nir.c | 4 ++++ src/compiler/spirv/vtn_variables.c | 4 ++++ src/intel/vulkan/anv_extensions.py | 2 ++ src/intel/vulkan/anv_pipeline.c | 1 + 5 files changed, 13 insertions(+)
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 6de707f672..f99cbc27a7 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -162,6 +162,8 @@ typedef struct shader_info { bool pixel_center_integer; + bool outputs_stencil; + /** gl_FragDepth layout for ARB_conservative_depth. */ enum gl_frag_depth_layout depth_layout; } fs; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index e00dcafa12..dcb8b31967 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3395,6 +3395,10 @@ vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point, case SpvExecutionModeContractionOff: break; /* OpenCL */ + case SpvExecutionModeStencilRefReplacingEXT: + b->shader->info.fs.outputs_stencil = true; + break; + default: vtn_fail("Unhandled execution mode"); } diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 36976798e9..42f915d434 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1373,6 +1373,10 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var, case SpvBuiltInFragCoord: nir_var->data.pixel_center_integer = b->pixel_center_integer; break; + case SpvBuiltInFragStencilRefEXT: + if (!b->shader->info.fs.outputs_stencil) + nir_var->data.read_only = true; + break; default: break; } diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 581921e62a..cd90c6ae52 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -86,6 +86,8 @@ EXTENSIONS = [ Extension('VK_KHX_multiview', 1, True), Extension('VK_EXT_debug_report', 8, True), Extension('VK_EXT_external_memory_dma_buf', 1, True), + Extension('VK_EXT_shader_stencil_export', 1, + 'device->info.gen >= 9'), ] class VkVersion: diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index e16a7a1994..ed63fa42cd 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -143,6 +143,7 @@ anv_shader_compile_to_nir(struct anv_pipeline *pipeline, .multiview = true, .variable_pointers = true, .storage_16bit = device->instance->physicalDevice.info.gen >= 8, + .stencil_export = device->instance->physicalDevice.info.gen >= 9, }, }; -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev