[Mesa-dev] [PATCH 02/12] spirv: Flip the tessellation winding order

Kenneth Graunke kenneth at whitecape.org
Wed Sep 20 21:28:59 UTC 2017


On Friday, September 15, 2017 9:01:41 AM PDT Jason Ekstrand wrote:
> It's not SPIR-V that's backwards from GLSL, it's Vulkan that's backwards
> from GL.  Let's make NIR consistent with the source language and do the
> flipping inside the Vulkan driver instead.
> 
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Dave Airlie <airlied at redhat.com>
> ---
>  src/compiler/spirv/spirv_to_nir.c |  9 ++-------
>  src/intel/vulkan/genX_pipeline.c  | 13 ++++++++++++-
>  2 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
> index 8653685..6ce9d1a 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -2951,17 +2951,12 @@ vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point,
>     case SpvExecutionModeVertexOrderCw:
>        assert(b->shader->stage == MESA_SHADER_TESS_CTRL ||
>               b->shader->stage == MESA_SHADER_TESS_EVAL);
> -      /* Vulkan's notion of CCW seems to match the hardware backends,
> -       * but be the opposite of OpenGL.  Currently NIR follows GL semantics,
> -       * so we set it backwards here.
> -       */
> -      b->shader->info.tess.ccw = true;
> +      b->shader->info.tess.ccw = false;
>        break;
>     case SpvExecutionModeVertexOrderCcw:
>        assert(b->shader->stage == MESA_SHADER_TESS_CTRL ||
>               b->shader->stage == MESA_SHADER_TESS_EVAL);
> -      /* Backwards; see above */
> -      b->shader->info.tess.ccw = false;
> +      b->shader->info.tess.ccw = true;
>        break;
>     case SpvExecutionModePointMode:
>        assert(b->shader->stage == MESA_SHADER_TESS_CTRL ||
> diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
> index 6dfa49b..844c118 100644
> --- a/src/intel/vulkan/genX_pipeline.c
> +++ b/src/intel/vulkan/genX_pipeline.c
> @@ -1217,7 +1217,18 @@ emit_3dstate_hs_te_ds(struct anv_pipeline *pipeline)
>  
>     anv_batch_emit(&pipeline->batch, GENX(3DSTATE_TE), te) {
>        te.Partitioning = tes_prog_data->partitioning;
> -      te.OutputTopology = tes_prog_data->output_topology;
> +
> +      /* Vulkan has its winding order backwards from GL so TRI_CCW becomes
> +       * TRI_CW and vice versa.
> +       */
> +      if (tes_prog_data->output_topology == OUTPUT_TRI_CCW) {
> +         te.OutputTopology = OUTPUT_TRI_CW;
> +      } else if (tes_prog_data->output_topology == OUTPUT_TRI_CW) {
> +         te.OutputTopology = OUTPUT_TRI_CCW;
> +      } else {
> +         te.OutputTopology = tes_prog_data->output_topology;
> +      }
> +
>        te.TEDomain = tes_prog_data->domain;
>        te.TEEnable = true;
>        te.MaximumTessellationFactorOdd = 63.0;
> 

This version is missing the radv hunk, which you have in your
wip/VK_KHR_maintenance2 branch:

+       tes_nir->info.tess.ccw = !tes_nir->info.tess.ccw;

assuming you have that, it looks fine, and both patches 2-3 are
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

I do think it would be less code to just whack the ccw boolean in anv
like Bas did for radv.  But I don't care too much.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170920/92aafd69/attachment.sig>


More information about the mesa-dev mailing list