[Mesa-dev] [PATCH 1/5] anv: Disable stencil writes when both write masks are zero
Jason Ekstrand
jason at jlekstrand.net
Tue Feb 7 20:25:18 UTC 2017
On Tue, Feb 7, 2017 at 12:13 PM, Nanley Chery <nanleychery at gmail.com> wrote:
> On Wed, Feb 01, 2017 at 08:07:22PM -0800, Jason Ekstrand wrote:
> > The only mechanism Vulkan provides for disabling stencil writes is to set
>
> This isn't the only mechanism for explicitly disabling stencil writes.
> Stencil writes can also be disabled by disabling stencil testing (as can
> be seen in this patch).
>
I guess that is technically true. I meant "it doesn't have a
disableStencilWrites like it does for depth". Maybe something like:
Vulkan doesn't have a stencilWriteEnable bit like it does for depth.
Instead, you have a stencil mask. Since the stencil mask is...
> > the stencil write mask to 0. Since that is dynamic state, we have to
> move
> ^
> extra word?
>
> Users can actually set the write masks at pipeline creation time. For
> that reason, I think it's clearer to say that it "may be" dynamic state
> instead of saying that it "is" dynamic state.
>
Maybe? I guess it depends on whether you take "dynamic state" to mean
"state the client set at runtime vs. set in the pipeline" or if you just
consider it to mean the bucket of states that *may* be set at runtime.
> > handle it late during command buffer builder. This helps Dota2 by a
> couple
> > percent because it allows the hardware to move the depth and stencil
> writes
> > to early in more cases.
>
> I was only able to reproduce a 0.1% performance improvement with this
> patch. Could show me how you're measuring the performance changes (on or
> offline)?
>
For one thing, it was on my BDW gt3 desktop. Maybe SKL is impacted less?
> -Nanley
>
> >
> > v2 (Jason Ekstrand): Always initialize the new pipeline variable
> > ---
> > src/intel/vulkan/anv_private.h | 1 +
> > src/intel/vulkan/gen7_cmd_buffer.c | 4 ++++
> > src/intel/vulkan/gen8_cmd_buffer.c | 8 ++++++++
> > src/intel/vulkan/genX_pipeline.c | 4 +++-
> > 4 files changed, 16 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> > index a0cb35c..4fe3ebc 100644
> > --- a/src/intel/vulkan/anv_private.h
> > +++ b/src/intel/vulkan/anv_private.h
> > @@ -1465,6 +1465,7 @@ struct anv_pipeline {
> >
> > uint32_t cs_right_mask;
> >
> > + bool writes_stencil;
> > bool depth_clamp_enable;
> >
> > struct {
> > diff --git a/src/intel/vulkan/gen7_cmd_buffer.c
> b/src/intel/vulkan/gen7_cmd_buffer.c
> > index 8d68aba..013ed87 100644
> > --- a/src/intel/vulkan/gen7_cmd_buffer.c
> > +++ b/src/intel/vulkan/gen7_cmd_buffer.c
> > @@ -212,6 +212,10 @@ genX(cmd_buffer_flush_dynamic_state)(struct
> anv_cmd_buffer *cmd_buffer)
> >
> > .BackfaceStencilTestMask = d->stencil_compare_mask.back & 0xff,
> > .BackfaceStencilWriteMask = d->stencil_write_mask.back & 0xff,
> > +
> > + .StencilBufferWriteEnable =
> > + (d->stencil_write_mask.front || d->stencil_write_mask.back)
> &&
> > + pipeline->writes_stencil,
> > };
> > GENX(DEPTH_STENCIL_STATE_pack)(NULL, depth_stencil_dw,
> &depth_stencil);
> >
> > diff --git a/src/intel/vulkan/gen8_cmd_buffer.c
> b/src/intel/vulkan/gen8_cmd_buffer.c
> > index ab68872..8c8de62 100644
> > --- a/src/intel/vulkan/gen8_cmd_buffer.c
> > +++ b/src/intel/vulkan/gen8_cmd_buffer.c
> > @@ -224,6 +224,10 @@ genX(cmd_buffer_flush_dynamic_state)(struct
> anv_cmd_buffer *cmd_buffer)
> >
> > .BackfaceStencilTestMask = d->stencil_compare_mask.back & 0xff,
> > .BackfaceStencilWriteMask = d->stencil_write_mask.back & 0xff,
> > +
> > + .StencilBufferWriteEnable =
> > + (d->stencil_write_mask.front || d->stencil_write_mask.back)
> &&
> > + pipeline->writes_stencil,
> > };
> > GENX(3DSTATE_WM_DEPTH_STENCIL_pack)(NULL, wm_depth_stencil_dw,
> > &wm_depth_stencil);
> > @@ -271,6 +275,10 @@ genX(cmd_buffer_flush_dynamic_state)(struct
> anv_cmd_buffer *cmd_buffer)
> >
> > .StencilReferenceValue = d->stencil_reference.front & 0xff,
> > .BackfaceStencilReferenceValue = d->stencil_reference.back &
> 0xff,
> > +
> > + .StencilBufferWriteEnable =
> > + (d->stencil_write_mask.front || d->stencil_write_mask.back)
> &&
> > + pipeline->writes_stencil,
> > };
> > GEN9_3DSTATE_WM_DEPTH_STENCIL_pack(NULL, dwords,
> &wm_depth_stencil);
> >
> > diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_
> pipeline.c
> > index 9d28466..18fe48c 100644
> > --- a/src/intel/vulkan/genX_pipeline.c
> > +++ b/src/intel/vulkan/genX_pipeline.c
> > @@ -652,12 +652,15 @@ emit_ds_state(struct anv_pipeline *pipeline,
> > /* We're going to OR this together with the dynamic state. We
> need
> > * to make sure it's initialized to something useful.
> > */
> > + pipeline->writes_stencil = false;
> > memset(depth_stencil_dw, 0, sizeof(depth_stencil_dw));
> > return;
> > }
> >
> > /* VkBool32 depthBoundsTestEnable; // optional (depth_bounds_test) */
> >
> > + pipeline->writes_stencil = info->stencilTestEnable;
> > +
> > #if GEN_GEN <= 7
> > struct GENX(DEPTH_STENCIL_STATE) depth_stencil = {
> > #else
> > @@ -669,7 +672,6 @@ emit_ds_state(struct anv_pipeline *pipeline,
> > .DoubleSidedStencilEnable = true,
> >
> > .StencilTestEnable = info->stencilTestEnable,
> > - .StencilBufferWriteEnable = info->stencilTestEnable,
> > .StencilFailOp = vk_to_gen_stencil_op[info->front.failOp],
> > .StencilPassDepthPassOp = vk_to_gen_stencil_op[info->
> front.passOp],
> > .StencilPassDepthFailOp = vk_to_gen_stencil_op[info->
> front.depthFailOp],
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170207/a7be5ccf/attachment.html>
More information about the mesa-dev
mailing list