[Mesa-dev] [PATCH] i965: Correct constant buffer MOCS
Ben Widawsky
ben at bwidawsk.net
Tue Jun 2 23:41:56 PDT 2015
On Tue, 02 Jun 2015 20:32:13 -0700
Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Tuesday, June 02, 2015 08:07:50 PM Ben Widawsky wrote:
> > I'm very confused here. It seems pretty clear that since the
> > command has been introduced with support for MOCS, MOCS lives at
> > bit 8 of dword 0 for all constant buffers. The error has existed
> > since forever AFAICT.
> >
> > No piglit regressions or fixes:
> > http://otc-mesa-ci.jf.intel.com/view/dev/job/bwidawsk/143/
> >
> > I suspect the low bits are discarded by the hardware when using the
> > buffer offset (we were setting 1). I suppose it could potentially
> > impact perf, though I'd imagine the kernel is already doing the
> > right thing by default anyway. This would explain why the patch
> > doesn't really do anything behaviorally.
> >
> > NOTE: gen8+ should have no change at all since MOCS was always 0
> > anyway.
> >
> > Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> > ---
> > src/mesa/drivers/dri/i965/gen7_vs_state.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/gen7_vs_state.c
> > b/src/mesa/drivers/dri/i965/gen7_vs_state.c index 278b3ec..f60dcb1
> > 100644 --- a/src/mesa/drivers/dri/i965/gen7_vs_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen7_vs_state.c
> > @@ -42,13 +42,13 @@ gen7_upload_constant_state(struct brw_context
> > *brw,
> > int dwords = brw->gen >= 8 ? 11 : 7;
> > BEGIN_BATCH(dwords);
> > - OUT_BATCH(opcode << 16 | (dwords - 2));
> > + OUT_BATCH(opcode << 16 | (mocs << 8) | (dwords - 2));
> > OUT_BATCH(active ? stage_state->push_const_size : 0);
> > OUT_BATCH(0);
> > /* Pointer to the constant buffer. Covered by the set of state
> > flags
> > * from gen6_prepare_wm_contants
> > */
> > - OUT_BATCH(active ? (stage_state->push_const_offset | mocs) : 0);
> > + OUT_BATCH(active ? stage_state->push_const_offset : 0);
> > OUT_BATCH(0);
> > OUT_BATCH(0);
> > OUT_BATCH(0);
>
> Now I'm confused.
>
> On BDW, DW0 bits 14:8 are MOCS, but "must always be programmed to
> zero." On pre-BDW, DW0 bits 14:8 are clearly marked as "Reserved MBZ".
>
> The documentation for 3DSTATE_CONSTANT(Body) lists DWord 2 (of the
> body, aka DWord 3 of the 3DSTATE_CONSTANT_VS packet as a whole) bits
> 4:0 as "Constant Buffer Object Control State", for all pre-DevBDW
> platforms, which is MOCS for all four buffers.
>
> So the code seems correct as it was, based on the versions of
> documentation I've read. You must be looking at something different
> than I am...
>
It did seem really strange to me. Everything I looked at for internal
docs seems to suggest DW0 was always MOCS (I am not looking at it now,
this is just from memory). Do me a favor if you haven't already... go
look at internal docs. If you don't have time I can check again
tomorrow, but clearly my eyes must not be trustworthy. I've had been
looking at 3DSTATE_CONSTANT_PS. Earlier when I went to verify and
try to figure out how this could be wrong, I [foolishly] checked SNB
(see below). Anyway, here is everything I found from the PRMs which
suggest you're mostly right (though we agree the code is wrong for
BDW?).
PRE-SNB - Don't care
SNB DW0 (I didn't think SNB had MOCS...):
https://01.org/sites/default/files/documentation/snb_ihd_os_vol2_part1.pdf#page=286
IVB (MBZ)
https://01.org/sites/default/files/documentation/ivb_ihd_os_vol2_part1.pdf#page=291
HSW (MBZ)
https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-hsw-commandrefrence-instructions_0.pdf#page=771
BYT (MBZ)
https://01.org/sites/default/files/documentation/intel_os_gfx_prm_vol2_-_cmd_ref_instructions.pdf#page=35
BDW (DW0 as you mentioned)
More information about the mesa-dev
mailing list