On Mon, Nov 14, 2016 at 5:41 PM, Kenneth Graunke <kenn...@whitecape.org> wrote:
> Signed-off-by: Kenneth Graunke <kenn...@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); > This seems a bit... over-designed? for (int s = MESA_SHADER_GEOMETRY; s >= 0; s--) { if (pipeline->shaders[s]) return (struct brw_vue_prog_data *)pipeline->shaders[s]->prog_data; } would work just as well. > + > + 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 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev