[Mesa-stable] [Mesa-dev] [PATCH] i965: Select pipeline and emit state base address in Gen8+ HiZ ops.
Kenneth Graunke
kenneth at whitecape.org
Wed Mar 8 10:17:59 UTC 2017
On Thursday, March 2, 2017 4:36:08 PM PST Nanley Chery wrote:
> On Mon, Feb 06, 2017 at 03:55:49PM -0800, Kenneth Graunke wrote:
> > If a HiZ op is the first thing in the batch, we should make sure
> > to select the render pipeline and emit state base address before
> > proceeding.
> >
> > I believe 3DSTATE_WM_HZ_OP creates 3DPRIMITIVEs internally, and
> > dispatching those on the GPGPU pipeline seems a bit sketchy. I'm
>
> Yes, it does seem like we currently allow HZ_OPs within a GPGPU
> pipeline. This patch should fix that problem.
>
> > not actually sure that STATE_BASE_ADDRESS is necessary, as the
> > depth related commands use graphics addresses, not ones relative
> > to the base address...but we're likely to set it as part of the
> > next operation anyway, so we should just do it right away.
> >
>
> I agree, re-emitting STATE_BASE_ADDRESS doesn't seem necessary. I think
> we should drop this part of the patch and add it back in later if we get
> some data that it's necessary. Leaving it there may be distracting to
> some readers and the BDW PRM warns that it's an expensive command:
>
> Execution of this command causes a full pipeline flush, thus its
> use should be minimized for higher performance.
I think it should be basically free, actually. We track a boolean,
brw->batch.state_base_address_emitted, to avoid emitting it multiple
times per batch.
Let's say the first thing in a fresh batch is a HiZ op, followed by
normal drawing. Previously, we'd do:
1. HiZ op commands
2. STATE_BASE_ADDRESS (triggered by normal rendering upload)
3. rest of normal drawing commands
Now we'd do:
1. STATE_BASE_ADDRESS (triggered by HiZ op)
2. HiZ op commands
3. normal drawing commands (second SBA is skipped)
In other words...we're just moving it a bit earlier. I suppose there
could be a batch containing only HiZ ops, at which point we'd pay for
a single STATE_BASE_ADDRESS...but that seems really unlikely.
> > Cc: "17.0" <mesa-stable at lists.freedesktop.org>
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> > src/mesa/drivers/dri/i965/gen8_depth_state.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/src/mesa/drivers/dri/i965/gen8_depth_state.c b/src/mesa/drivers/dri/i965/gen8_depth_state.c
> > index a7e61354fd5..620b32df8bb 100644
> > --- a/src/mesa/drivers/dri/i965/gen8_depth_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen8_depth_state.c
> > @@ -404,6 +404,9 @@ gen8_hiz_exec(struct brw_context *brw, struct intel_mipmap_tree *mt,
> > if (op == BLORP_HIZ_OP_NONE)
> > return;
> >
>
> It would be helpful if you included the rationale here as a code
> comment. Something like the first two sentences of your commit message
> should work.
I can do that.
> > + brw_select_pipeline(brw, BRW_RENDER_PIPELINE);
>
> According to Vol07 of the BDW+ PRMs,
>
> The previously active pipeline needs to be flushed via the
> MI_FLUSH command immediately before switching to a different
> pipeline via use of the PIPELINE_SELECT command.
>
> However it doesn't look like MI_FLUSH is present after HSW. So there
> shouldn't be any additional work to do here.
Flushes are definitely required when switching the pipeline, but I
believe that brw_emit_select_pipeline() does that work.
FWIW, MI_FLUSH was replaced by PIPE_CONTROL many generations ago.
I believe the validation team stopped testing MI_FLUSH on Sandybridge.
--Ken
-------------- 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-stable/attachments/20170308/bf1466a7/attachment.sig>
More information about the mesa-stable
mailing list