[Mesa-dev] [PATCH 09/14] anv: Set clip/cull distances fields in packets.

Kenneth Graunke kenneth at whitecape.org
Tue Nov 15 01:41:33 UTC 2016


Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/intel/vulkan/anv_private.h        | 18 ++++++++++++++++++
 src/intel/vulkan/gen8_pipeline.c      | 15 ++++++++-------
 src/intel/vulkan/genX_pipeline_util.h |  5 +++++
 3 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 30deb02..eef2926 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1445,6 +1445,24 @@ ANV_DECL_GET_PROG_DATA_FUNC(gs, MESA_SHADER_GEOMETRY)
 ANV_DECL_GET_PROG_DATA_FUNC(wm, MESA_SHADER_FRAGMENT)
 ANV_DECL_GET_PROG_DATA_FUNC(cs, MESA_SHADER_COMPUTE)
 
+/**
+ * Get the brw_vue_prog_data for the last stage which outputs VUEs.
+ */
+static inline struct brw_vue_prog_data *
+get_last_vue_prog_data(struct anv_pipeline *pipeline)
+{
+   const unsigned pre_clip_stages =
+      pipeline->active_stages & (VK_SHADER_STAGE_FRAGMENT_BIT - 1);
+   const unsigned last_bit = util_last_bit(pre_clip_stages);
+
+   if (last_bit == 0)
+      return NULL;
+
+   struct anv_shader_bin *bin = pipeline->shaders[last_bit - 1];
+
+   return (struct brw_vue_prog_data *) bin->prog_data;
+}
+
 VkResult
 anv_pipeline_init(struct anv_pipeline *pipeline, struct anv_device *device,
                   struct anv_pipeline_cache *cache,
diff --git a/src/intel/vulkan/gen8_pipeline.c b/src/intel/vulkan/gen8_pipeline.c
index 6cf55f5..4fad8cd 100644
--- a/src/intel/vulkan/gen8_pipeline.c
+++ b/src/intel/vulkan/gen8_pipeline.c
@@ -158,10 +158,10 @@ genX(graphics_pipeline_create)(
             gs_prog_data->static_vertex_count >= 0 ?
             gs_prog_data->static_vertex_count : 0;
 
-         /* FIXME: mesa sets this based on ctx->Transform.ClipPlanesEnabled:
-          * UserClipDistanceClipTestEnableBitmask_3DSTATE_GS(v)
-          * UserClipDistanceCullTestEnableBitmask(v)
-          */
+         gs.UserClipDistanceClipTestEnableBitmask =
+            gs_prog_data->base.clip_distance_mask;
+         gs.UserClipDistanceCullTestEnableBitmask =
+            gs_prog_data->base.cull_distance_mask;
 
          gs.VertexURBEntryOutputReadOffset = offset;
          gs.VertexURBEntryOutputLength = length;
@@ -224,9 +224,10 @@ genX(graphics_pipeline_create)(
          vs.VertexURBEntryOutputReadOffset = offset;
          vs.VertexURBEntryOutputLength    = length;
 
-         /* TODO */
-         vs.UserClipDistanceClipTestEnableBitmask = 0;
-         vs.UserClipDistanceCullTestEnableBitmask = 0;
+         vs.UserClipDistanceClipTestEnableBitmask =
+            vs_prog_data->base.clip_distance_mask;
+         vs.UserClipDistanceCullTestEnableBitmask =
+            vs_prog_data->base.cull_distance_mask;
       }
    }
 
diff --git a/src/intel/vulkan/genX_pipeline_util.h b/src/intel/vulkan/genX_pipeline_util.h
index 129ae94..5bee80c 100644
--- a/src/intel/vulkan/genX_pipeline_util.h
+++ b/src/intel/vulkan/genX_pipeline_util.h
@@ -940,6 +940,11 @@ emit_3dstate_clip(struct anv_pipeline *pipeline,
       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 = get_last_vue_prog_data(pipeline);
+      if (last) {
+         clip.UserClipDistanceClipTestEnableBitmask = last->clip_distance_mask;
+         clip.UserClipDistanceCullTestEnableBitmask = last->cull_distance_mask;
+      }
 #else
       clip.NonPerspectiveBarycentricEnable = wm_prog_data ?
          (wm_prog_data->barycentric_interp_modes & 0x38) != 0 : 0;
-- 
2.10.2



More information about the mesa-dev mailing list