Reviewed-by: Iago Toral Quiroga <ito...@igalia.com>
On Tue, 2018-02-27 at 22:34 -0800, Gustavo Lima Chaves wrote: > v2: > 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. > > v3: > A more cautious reading of 1db44252d01bf7539452ccc2b5210c74b8dcd573 > led > me to a missing change that would stop (what I later discovered were) > GPU hangs on the CTS test written to exercize this. > > v4: > Turn FragStencilRefEXT decoration usage without > StencilRefReplacingEXT > mode into a warning, instead of trying to make the variable read- > only. > If we are to follow the originating extension on GL, the built-in > variable in question should never be readable anyway. > --- > src/compiler/shader_info.h | 2 ++ > src/compiler/spirv/spirv_to_nir.c | 4 ++++ > src/compiler/spirv/vtn_variables.c | 5 +++++ > src/intel/vulkan/anv_extensions.py | 2 ++ > src/intel/vulkan/anv_pipeline.c | 1 + > src/intel/vulkan/genX_pipeline.c | 1 + > 6 files changed, 15 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 66a5fba6b7..3af54ede66 100644 > --- a/src/compiler/spirv/vtn_variables.c > +++ b/src/compiler/spirv/vtn_variables.c > @@ -1382,6 +1382,11 @@ 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) > + vtn_warn("The StencilRefReplacingEXT mode should be > declared when" > + " the decoration FragStencilRefEXT is used on > a variable"); > + 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, > }, > }; > > diff --git a/src/intel/vulkan/genX_pipeline.c > b/src/intel/vulkan/genX_pipeline.c > index 89cbe293b8..683a4607e6 100644 > --- a/src/intel/vulkan/genX_pipeline.c > +++ b/src/intel/vulkan/genX_pipeline.c > @@ -1600,6 +1600,7 @@ emit_3dstate_ps_extra(struct anv_pipeline > *pipeline, > ps.PixelShaderHasUAV = true; > > #if GEN_GEN >= 9 > + ps.PixelShaderComputesStencil = wm_prog_data- > >computed_stencil; > ps.PixelShaderPullsBary = wm_prog_data->pulls_bary; > ps.InputCoverageMaskState = wm_prog_data->uses_sample_mask ? > ICMS_INNER_CONSERVATIVE : > ICMS_NONE; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev