Mesa (master): anv/pipeline: Properly handle unset gl_Layer and gl_ViewportIndex

Jason Ekstrand jekstrand at kemper.freedesktop.org
Wed Apr 5 01:34:56 UTC 2017


Module: Mesa
Branch: master
Commit: c6f69eea6ac549fc2ffa46944de4dd82c9b53329
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c6f69eea6ac549fc2ffa46944de4dd82c9b53329

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Mon Apr  3 12:25:15 2017 -0700

anv/pipeline: Properly handle unset gl_Layer and gl_ViewportIndex

When the shader does not set one of these values, they are supposed to
get a default value of 0.  We have hardware bits in 3DSTATE_CLIP for
this but haven't been setting them.  This fixes the intermittent failure
of dEQP-VK.geometry.layered.3d.render_to_default_layer.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Cc: "13.0 17.0" <mesa-stable at lists.freedesktop.org>

---

 src/intel/vulkan/genX_pipeline.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
index 85a9e4fd29..3fd1333e1e 100644
--- a/src/intel/vulkan/genX_pipeline.c
+++ b/src/intel/vulkan/genX_pipeline.c
@@ -1014,14 +1014,35 @@ emit_3dstate_clip(struct anv_pipeline *pipeline,
 
       clip.MinimumPointWidth = 0.125;
       clip.MaximumPointWidth = 255.875;
-      clip.MaximumVPIndex    = (vp_info ? vp_info->viewportCount : 1) - 1;
+
+      const struct brw_vue_prog_data *last =
+         anv_pipeline_get_last_vue_prog_data(pipeline);
+
+      /* From the Vulkan 1.0.45 spec:
+       *
+       *    "If the last active vertex processing stage shader entry point's
+       *    interface does not include a variable decorated with
+       *    ViewportIndex, then the first viewport is used."
+       */
+      if (vp_info && (last->vue_map.slots_valid & VARYING_BIT_VIEWPORT)) {
+         clip.MaximumVPIndex = vp_info->viewportCount - 1;
+      } else {
+         clip.MaximumVPIndex = 0;
+      }
+
+      /* From the Vulkan 1.0.45 spec:
+       *
+       *    "If the last active vertex processing stage shader entry point's
+       *    interface does not include a variable decorated with Layer, then
+       *    the first layer is used."
+       */
+      clip.ForceZeroRTAIndexEnable =
+         !(last->vue_map.slots_valid & VARYING_BIT_LAYER);
 
 #if GEN_GEN == 7
       clip.FrontWinding            = vk_to_gen_front_face[rs_info->frontFace];
       clip.CullMode                = vk_to_gen_cullmode[rs_info->cullMode];
       clip.ViewportZClipTestEnable = !pipeline->depth_clamp_enable;
-      const struct brw_vue_prog_data *last =
-         anv_pipeline_get_last_vue_prog_data(pipeline);
       if (last) {
          clip.UserClipDistanceClipTestEnableBitmask = last->clip_distance_mask;
          clip.UserClipDistanceCullTestEnableBitmask = last->cull_distance_mask;




More information about the mesa-commit mailing list