[Mesa-dev] [PATCH] i965: Reduce code duplication in handling of depth, stencil, and HiZ.
Paul Berry
stereotype441 at gmail.com
Thu Mar 28 13:57:31 PDT 2013
On 27 March 2013 20:43, Chad Versace <chad.versace at linux.intel.com> wrote:
> I like this patch. The final result feels cleaner than the present code.
> Comments below.
>
>
> On Tue, Mar 26, 2013 at 09:54:18PM -0700, Paul Berry wrote:
> > This patch consolidates duplicate code in the brw_depthbuffer and
> > gen7_depthbuffer state atoms. Previously, these state atoms contained
> > 5 chunks of code for emitting the _3DSTATE_DEPTH_BUFFER packet (3 for
> > Gen4-6 and 2 for Gen7). Also a lot of logic for determining the
> > appropriate buffer setup was duplicated between the Gen4-6 and Gen7
> > functions.
> >
> > This refactor splits the code into three separate functions:
> > brw_emit_depthbuffer(), which determines the appropriate buffer setup
> > in a mostly generation-independent way, brw_emit_depth_stencil_hiz(),
> > which emits the appropriate state packets for Gen4-6, and
> > gen7_emit_depth_stencil_hiz(), which emits the appropriate state
> > packets for Gen7.
> >
> > Tested using Piglit on Gen5-7 (no regressions).
> > ---
> > src/mesa/drivers/dri/i965/brw_context.h | 23 ++++
> > src/mesa/drivers/dri/i965/brw_misc_state.c | 189
> +++++++++++++++-------------
> > src/mesa/drivers/dri/i965/brw_vtbl.c | 2 +
> > src/mesa/drivers/dri/i965/gen7_misc_state.c | 93 +++++---------
> > src/mesa/drivers/dri/intel/intel_context.h | 16 +++
> > 5 files changed, 171 insertions(+), 152 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
> > index 8ff70c9..1ea038f 100644
> > --- a/src/mesa/drivers/dri/i965/brw_context.h
> > +++ b/src/mesa/drivers/dri/i965/brw_context.h
> > @@ -1347,6 +1347,29 @@ struct opcode_desc {
> >
> > extern const struct opcode_desc opcode_descs[128];
> >
> > +void
> > +brw_emit_depthbuffer(struct brw_context *brw);
> > +
> > +void
> > +brw_emit_depth_stencil_hiz(struct brw_context *brw,
> > + struct intel_mipmap_tree *depth_mt,
> > + uint32_t depth_offset, uint32_t
> depthbuffer_format,
> > + uint32_t depth_surface_type,
> > + struct intel_mipmap_tree *stencil_mt,
> > + struct intel_mipmap_tree *hiz_mt,
> > + bool separate_stencil, uint32_t width,
> > + uint32_t height, uint32_t tile_x, uint32_t
> tile_y);
> > +
> > +void
> > +gen7_emit_depth_stencil_hiz(struct brw_context *brw,
> > + struct intel_mipmap_tree *depth_mt,
> > + uint32_t depth_offset, uint32_t
> depthbuffer_format,
> > + uint32_t depth_surface_type,
> > + struct intel_mipmap_tree *stencil_mt,
> > + struct intel_mipmap_tree *hiz_mt,
> > + bool separate_stencil, uint32_t width,
> > + uint32_t height, uint32_t tile_x, uint32_t
> tile_y);
> > +
> > #ifdef __cplusplus
> > }
> > #endif
> > diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c
> b/src/mesa/drivers/dri/i965/brw_misc_state.c
> > index d6bd86c..3821eda 100644
> > --- a/src/mesa/drivers/dri/i965/brw_misc_state.c
> > +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c
> > @@ -561,7 +561,8 @@ brw_workaround_depthstencil_alignment(struct
> brw_context *brw,
> > }
> > }
> >
> > -static void emit_depthbuffer(struct brw_context *brw)
> > +void
> > +brw_emit_depthbuffer(struct brw_context *brw)
> > {
> > struct intel_context *intel = &brw->intel;
> > struct gl_context *ctx = &intel->ctx;
> > @@ -574,20 +575,23 @@ static void emit_depthbuffer(struct brw_context
> *brw)
> > struct intel_mipmap_tree *hiz_mt = brw->depthstencil.hiz_mt;
> > uint32_t tile_x = brw->depthstencil.tile_x;
> > uint32_t tile_y = brw->depthstencil.tile_y;
> > - unsigned int len;
> > bool separate_stencil = false;
> > + uint32_t depth_surface_type = BRW_SURFACE_NULL;
> > + uint32_t depthbuffer_format = BRW_DEPTHFORMAT_D32_FLOAT;
> > + uint32_t depth_offset = 0;
> > + uint32_t width = 1, height = 1;
> >
> > - if (stencil_mt && stencil_mt->format == MESA_FORMAT_S8)
> > - separate_stencil = true;
> > + if (stencil_mt) {
> > + separate_stencil = stencil_mt->format == MESA_FORMAT_S8;
> >
> > - /* 3DSTATE_DEPTH_BUFFER, 3DSTATE_STENCIL_BUFFER are both
> > - * non-pipelined state that will need the PIPE_CONTROL workaround.
> > - */
> > - if (intel->gen == 6) {
> > - intel_emit_post_sync_nonzero_flush(intel);
> > - intel_emit_depth_stall_flushes(intel);
> > + /* Gen7 only supports separate stencil */
>
> The order of words here confuse me. The "only" is adjacent to "Gen7", not
> "separate stencil", so I read it as "Only Gen7 supports separate stencil."
> Please move "only" to be adjacent to "separate stencil".
>
Wow, that interpretation really surprises me. I wonder if this is a
difference between our dialects. "Gen7 supports only separate stencil"
seems a little more awkward to me, but it still carries my intended
meaning, so I'm fine with the change.
>
> > + assert(separate_stencil || intel->gen < 7);
> > }
> >
> > + /* Gen7 only supports separate stencil */
> > + assert(intel->gen < 6 || !depth_mt ||
> > + !_mesa_is_format_packed_depth_stencil(depth_mt->format));
> > +
>
> I don't understand the comment for the above the assertion. The comment
> mentions only gen7, but the assertion applies to gen >= 6.
>
> Also, the assertion is incorrect. It will fail on gen6 if hiz is disabled.
>
You're right--I meant to type "intel->gen <= 6".
>
> How about moving this assertion into the `if (depth_irb)` branch below and
> doing something like this:
>
> /* When 3DSTATE_DEPTH_BUFFER.Separate_Stencil_Enable is set, then
> * 3DSTATE_DEPTH_BUFFER.Surface_Format is not permitted to be a packed
> * depthstencil format.
> *
> * Gens prior to 7 require that HiZ_Enable and Separate_Stencil_Enable
> be
> * set to the same value. Gens after 7 implicitly always set
> * Separate_Stencil_Enable; software cannot disable it.
> */
> if ((intel->gen < 7 && depth_mt->hiz_mt) || intel->gen >= 7) {
> assert(!_mesa_is_format_packed_depth_stencil(depth_mt->format));
> }
>
I think I'm ok with this but I'll want to give it another piglit run on
Gen6 just to be sure. In particular, the assertion you propose is more
stringent--it prohibits the following combination of circumstances, which
my patch allowed:
- intel->gen == 6
- depth_mt is non-null
- depth_mt->hiz_mt is non-null
- _mesa_is_format_packed_depth_stencil(depth_mt->format)
I'm pretty sure that is fine--this combination of conditions should never
occur. I'll follow up if piglit finds an exception.
>
> > /* If there's a packed depth/stencil bound to stencil only, we need
> to
> > * emit the packed depth/stencil buffer packet.
> > */
> > @@ -596,31 +600,21 @@ static void emit_depthbuffer(struct brw_context
> *brw)
> > depth_mt = stencil_mt;
> > }
> >
> > - if (intel->gen >= 6)
> > - len = 7;
> > - else if (intel->is_g4x || intel->gen == 5)
> > - len = 6;
> > - else
> > - len = 5;
> > -
> > - if (!depth_irb && !separate_stencil) {
> > - BEGIN_BATCH(len);
> > - OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (len - 2));
> > - OUT_BATCH((BRW_DEPTHFORMAT_D32_FLOAT << 18) |
> > - (BRW_SURFACE_NULL << 29));
> > - OUT_BATCH(0);
> > - OUT_BATCH(0);
> > - OUT_BATCH(0);
> > -
> > - if (intel->is_g4x || intel->gen >= 5)
> > - OUT_BATCH(0);
> > + if (depth_irb) {
> > + struct intel_region *region = depth_mt->region;
> >
> > - if (intel->gen >= 6)
> > - OUT_BATCH(0);
> > + /* Prior to Gen7, if using separate stencil, hiz must be enabled.
> */
> > + assert(intel->gen >= 7 || !separate_stencil || hiz_mt);
> >
> > - ADVANCE_BATCH();
> > + assert(intel->gen < 6 || region->tiling == I915_TILING_Y);
> > + assert(!hiz_mt || region->tiling == I915_TILING_Y);
> >
> > - } else if (!depth_irb && separate_stencil) {
> > + depthbuffer_format = brw_depthbuffer_format(brw);
> > + depth_surface_type = BRW_SURFACE_2D;
> > + depth_offset = brw->depthstencil.depth_offset;
> > + width = depth_irb->Base.Base.Width;
> > + height = depth_irb->Base.Base.Height;
> > + } else if (separate_stencil) {
> > /*
> > * There exists a separate stencil buffer but no depth buffer.
> > *
> > @@ -628,80 +622,95 @@ static void emit_depthbuffer(struct brw_context
> *brw)
> > * 3DSTATE_DEPTH_BUFFER: namely the tile walk, surface type,
> width, and
> > * height.
> > *
> > - * Enable the hiz bit because it and the separate stencil bit
> must have
> > - * the same value. From Section 2.11.5.6.1.1
> 3DSTATE_DEPTH_BUFFER, Bit
> > - * 1.21 "Separate Stencil Enable":
> > - * [DevIL]: If this field is enabled, Hierarchical Depth
> Buffer
> > - * Enable must also be enabled.
> > - *
> > - * [DevGT]: This field must be set to the same value (enabled
> or
> > - * disabled) as Hierarchical Depth Buffer Enable
> > - *
> > * The tiled bit must be set. From the Sandybridge PRM, Volume 2,
> Part 1,
> > * Section 7.5.5.1.1 3DSTATE_DEPTH_BUFFER, Bit 1.27 Tiled Surface:
> > * [DevGT+]: This field must be set to TRUE.
> > */
> > assert(intel->has_separate_stencil);
> >
> > - BEGIN_BATCH(len);
> > - OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (len - 2));
> > - OUT_BATCH((BRW_DEPTHFORMAT_D32_FLOAT << 18) |
> > - (1 << 21) | /* separate stencil enable */
> > - (1 << 22) | /* hiz enable */
> > - (BRW_TILEWALK_YMAJOR << 26) |
> > - (1 << 27) | /* tiled surface */
> > - (BRW_SURFACE_2D << 29));
> > - OUT_BATCH(0);
> > - OUT_BATCH(((stencil_irb->Base.Base.Width + tile_x - 1) << 6) |
> > - (stencil_irb->Base.Base.Height + tile_y - 1) << 19);
> > - OUT_BATCH(0);
> > + depth_surface_type = BRW_SURFACE_2D;
> > + width = stencil_irb->Base.Base.Width;
> > + height = stencil_irb->Base.Base.Height;
> > + }
> >
> > - if (intel->is_g4x || intel->gen >= 5)
> > - OUT_BATCH(tile_x | (tile_y << 16));
> > - else
> > - assert(tile_x == 0 && tile_y == 0);
> > + intel->vtbl.emit_depth_stencil_hiz(brw, depth_mt, depth_offset,
> > + depthbuffer_format,
> depth_surface_type,
> > + stencil_mt, hiz_mt,
> separate_stencil,
> > + width, height, tile_x, tile_y);
> > +}
> >
> > - if (intel->gen >= 6)
> > - OUT_BATCH(0);
> > +void
> > +brw_emit_depth_stencil_hiz(struct brw_context *brw,
> > + struct intel_mipmap_tree *depth_mt,
> > + uint32_t depth_offset, uint32_t
> depthbuffer_format,
> > + uint32_t depth_surface_type,
> > + struct intel_mipmap_tree *stencil_mt,
> > + struct intel_mipmap_tree *hiz_mt,
> > + bool separate_stencil, uint32_t width,
> > + uint32_t height, uint32_t tile_x, uint32_t
> tile_y)
> > +{
> > + struct intel_context *intel = &brw->intel;
> >
> > - ADVANCE_BATCH();
> > + /* Enable the hiz bit if we're doing separate stencil, because it
> and the
> > + * separate stencil bit must have the same value. From Section
> 2.11.5.6.1.1
> > + * 3DSTATE_DEPTH_BUFFER, Bit 1.21 "Separate Stencil Enable":
> > + * [DevIL]: If this field is enabled, Hierarchical Depth Buffer
> > + * Enable must also be enabled.
> > + *
> > + * [DevGT]: This field must be set to the same value (enabled or
> > + * disabled) as Hierarchical Depth Buffer Enable
> > + */
> > + bool enable_hiz_ss = hiz_mt || separate_stencil;
> >
> > - } else {
> > - struct intel_region *region = depth_mt->region;
> >
> > - /* If using separate stencil, hiz must be enabled. */
> > - assert(!separate_stencil || hiz_mt);
> > + /* 3DSTATE_DEPTH_BUFFER, 3DSTATE_STENCIL_BUFFER are both
> > + * non-pipelined state that will need the PIPE_CONTROL workaround.
> > + */
> > + if (intel->gen == 6) {
> > + intel_emit_post_sync_nonzero_flush(intel);
> > + intel_emit_depth_stall_flushes(intel);
> > + }
> >
> > - assert(intel->gen < 6 || region->tiling == I915_TILING_Y);
> > - assert(!hiz_mt || region->tiling == I915_TILING_Y);
> > + unsigned int len;
> > + if (intel->gen >= 6)
> > + len = 7;
> > + else if (intel->is_g4x || intel->gen == 5)
> > + len = 6;
> > + else
> > + len = 5;
> >
> > - BEGIN_BATCH(len);
> > - OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (len - 2));
> > - OUT_BATCH((region->pitch - 1) |
> > - (brw_depthbuffer_format(brw) << 18) |
> > - ((hiz_mt ? 1 : 0) << 21) | /* separate stencil enable */
> > - ((hiz_mt ? 1 : 0) << 22) | /* hiz enable */
> > - (BRW_TILEWALK_YMAJOR << 26) |
> > - ((region->tiling != I915_TILING_NONE) << 27) |
> > - (BRW_SURFACE_2D << 29));
> > - OUT_RELOC(region->bo,
> > + BEGIN_BATCH(len);
> > + OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (len - 2));
> > + OUT_BATCH((depth_mt ? depth_mt->region->pitch - 1 : 0) |
> > + (depthbuffer_format << 18) |
> > + ((enable_hiz_ss ? 1 : 0) << 21) | /* separate stencil
> enable */
> > + ((enable_hiz_ss ? 1 : 0) << 22) | /* hiz enable */
> > + (BRW_TILEWALK_YMAJOR << 26) |
> > + ((depth_mt ? depth_mt->region->tiling != I915_TILING_NONE
> : 1)
> > + << 27) |
> > + (depth_surface_type << 29));
>
>
> Indentation quirkiness above.
>
This looks correctly indented to me. What seems quirky to you?
>
>
> > +
> > + if (depth_mt) {
> > + OUT_RELOC(depth_mt->region->bo,
> > I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
> > - brw->depthstencil.depth_offset);
> > - OUT_BATCH((BRW_SURFACE_MIPMAPLAYOUT_BELOW << 1) |
> > - (((depth_irb->Base.Base.Width + tile_x) - 1) << 6) |
> > - (((depth_irb->Base.Base.Height + tile_y) - 1) << 19));
> > + depth_offset);
> > + } else {
> > OUT_BATCH(0);
> > + }
> >
> > - if (intel->is_g4x || intel->gen >= 5)
> > - OUT_BATCH(tile_x | (tile_y << 16));
> > - else
> > - assert(tile_x == 0 && tile_y == 0);
> > + OUT_BATCH(((width + tile_x - 1) << 6) |
> > + ((height + tile_y - 1) << 19));
> > + OUT_BATCH(0);
>
>
> Did you intend to delete setting the mipmap layout? I suspect that the
> deletion caused no regressions because the enum is defined as 0.
>
The old code was inconsistent about it--it left it out of the "else if
(!depth_irb && separate_stencil)" block but included it in the final else
block. It was a rather arbitrary choice since as you mention the enum is
0. I'd be happy to put it back in if you think it's clearer.
>
>
> >
> > - if (intel->gen >= 6)
> > - OUT_BATCH(0);
> > + if (intel->is_g4x || intel->gen >= 5)
> > + OUT_BATCH(tile_x | (tile_y << 16));
> > + else
> > + assert(tile_x == 0 && tile_y == 0);
> >
> > - ADVANCE_BATCH();
> > - }
> > + if (intel->gen >= 6)
> > + OUT_BATCH(0);
> > +
> > + ADVANCE_BATCH();
> >
> > if (hiz_mt || separate_stencil) {
> > /*
> > @@ -770,7 +779,7 @@ static void emit_depthbuffer(struct brw_context *brw)
> > OUT_BATCH(_3DSTATE_CLEAR_PARAMS << 16 |
> > GEN5_DEPTH_CLEAR_VALID |
> > (2 - 2));
> > - OUT_BATCH(depth_irb ? depth_irb->mt->depth_clear_value : 0);
> > + OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
> > ADVANCE_BATCH();
> > }
> > }
> > @@ -781,7 +790,7 @@ const struct brw_tracked_state brw_depthbuffer = {
> > .brw = BRW_NEW_BATCH,
> > .cache = 0,
> > },
> > - .emit = emit_depthbuffer,
> > + .emit = brw_emit_depthbuffer,
> > };
> >
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_vtbl.c
> b/src/mesa/drivers/dri/i965/brw_vtbl.c
> > index cb25be9..4ca83e4 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vtbl.c
> > +++ b/src/mesa/drivers/dri/i965/brw_vtbl.c
> > @@ -267,7 +267,9 @@ void brwInitVtbl( struct brw_context *brw )
> > assert(brw->intel.gen >= 4);
> > if (brw->intel.gen >= 7) {
> > gen7_init_vtable_surface_functions(brw);
> > + brw->intel.vtbl.emit_depth_stencil_hiz =
> gen7_emit_depth_stencil_hiz;
> > } else if (brw->intel.gen >= 4) {
> > gen4_init_vtable_surface_functions(brw);
> > + brw->intel.vtbl.emit_depth_stencil_hiz =
> brw_emit_depth_stencil_hiz;
> > }
> > }
> > diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c
> b/src/mesa/drivers/dri/i965/gen7_misc_state.c
> > index 7e46398..2009070 100644
> > --- a/src/mesa/drivers/dri/i965/gen7_misc_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c
> > @@ -29,77 +29,46 @@
> > #include "brw_state.h"
> > #include "brw_defines.h"
> >
> > -static void emit_depthbuffer(struct brw_context *brw)
> > +void
> > +gen7_emit_depth_stencil_hiz(struct brw_context *brw,
> > + struct intel_mipmap_tree *depth_mt,
> > + uint32_t depth_offset, uint32_t
> depthbuffer_format,
> > + uint32_t depth_surface_type,
> > + struct intel_mipmap_tree *stencil_mt,
> > + struct intel_mipmap_tree *hiz_mt,
> > + bool separate_stencil, uint32_t width,
> > + uint32_t height, uint32_t tile_x, uint32_t
> tile_y)
> > {
> > struct intel_context *intel = &brw->intel;
> > struct gl_context *ctx = &intel->ctx;
> > - struct gl_framebuffer *fb = ctx->DrawBuffer;
> > -
> > - /* _NEW_BUFFERS */
> > - struct intel_renderbuffer *drb = intel_get_renderbuffer(fb,
> BUFFER_DEPTH);
> > - struct intel_renderbuffer *srb = intel_get_renderbuffer(fb,
> BUFFER_STENCIL);
> > - struct intel_mipmap_tree *depth_mt = brw->depthstencil.depth_mt;
> > - struct intel_mipmap_tree *stencil_mt = brw->depthstencil.stencil_mt;
> > - struct intel_mipmap_tree *hiz_mt = brw->depthstencil.hiz_mt;
> > - uint32_t tile_x = brw->depthstencil.tile_x;
> > - uint32_t tile_y = brw->depthstencil.tile_y;
> > -
> > - /* Gen7 only supports separate stencil */
> > - assert(!stencil_mt || stencil_mt->format == MESA_FORMAT_S8);
> > - assert(!depth_mt ||
> !_mesa_is_format_packed_depth_stencil(depth_mt->format));
> >
> > intel_emit_depth_stall_flushes(intel);
> >
> > - if (depth_mt == NULL) {
> > - uint32_t dw1 = BRW_DEPTHFORMAT_D32_FLOAT << 18;
> > - uint32_t dw3 = 0;
> > -
> > - if (stencil_mt == NULL) {
> > - dw1 |= (BRW_SURFACE_NULL << 29);
> > - } else {
> > - /* _NEW_STENCIL: enable stencil buffer writes */
> > - dw1 |= ((ctx->Stencil.WriteMask != 0) << 27);
> > -
> > - /* 3DSTATE_STENCIL_BUFFER inherits surface type and dimensions. */
> > - dw1 |= (BRW_SURFACE_2D << 29);
> > - dw3 = ((srb->Base.Base.Width + tile_x - 1) << 4) |
> > - ((srb->Base.Base.Height + tile_y - 1) << 18);
> > - }
> > -
> > - BEGIN_BATCH(7);
> > - OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2));
> > - OUT_BATCH(dw1);
> > - OUT_BATCH(0);
> > - OUT_BATCH(dw3);
> > - OUT_BATCH(0);
> > - OUT_BATCH(tile_x | (tile_y << 16));
> > - OUT_BATCH(0);
> > - ADVANCE_BATCH();
> > - } else {
> > - struct intel_region *region = depth_mt->region;
> > -
> > - assert(region->tiling == I915_TILING_Y);
> > -
> > - /* _NEW_DEPTH, _NEW_STENCIL */
> > - BEGIN_BATCH(7);
> > - OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2));
> > - OUT_BATCH((region->pitch - 1) |
> > - (brw_depthbuffer_format(brw) << 18) |
> > - ((hiz_mt ? 1 : 0) << 22) | /* hiz enable */
> > - ((stencil_mt != NULL && ctx->Stencil.WriteMask != 0) <<
> 27) |
> > - ((ctx->Depth.Mask != 0) << 28) |
> > - (BRW_SURFACE_2D << 29));
> > - OUT_RELOC(region->bo,
> > + /* _NEW_DEPTH, _NEW_STENCIL */
> > + BEGIN_BATCH(7);
> > + OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2));
> > + OUT_BATCH((depth_mt ? depth_mt->region->pitch - 1 : 0) |
> > + (depthbuffer_format << 18) |
> > + ((hiz_mt ? 1 : 0) << 22) |
> > + ((stencil_mt != NULL && ctx->Stencil.WriteMask != 0) <<
> 27) |
> > + ((ctx->Depth.Mask != 0) << 28) |
> > + (depth_surface_type << 29));
> > +
> > + if (depth_mt) {
> > + OUT_RELOC(depth_mt->region->bo,
> > I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
> > - brw->depthstencil.depth_offset);
> > - OUT_BATCH((((drb->Base.Base.Width + tile_x) - 1) << 4) |
> > - (((drb->Base.Base.Height + tile_y) - 1) << 18));
> > - OUT_BATCH(0);
> > - OUT_BATCH(tile_x | (tile_y << 16));
> > + depth_offset);
> > + } else {
> > OUT_BATCH(0);
> > - ADVANCE_BATCH();
> > }
> >
> > + OUT_BATCH(((width + tile_x - 1) << 4) |
> > + ((height + tile_y - 1) << 18));
> > + OUT_BATCH(0);
> > + OUT_BATCH(tile_x | (tile_y << 16));
> > + OUT_BATCH(0);
> > + ADVANCE_BATCH();
> > +
> > if (hiz_mt == NULL) {
> > BEGIN_BATCH(3);
> > OUT_BATCH(GEN7_3DSTATE_HIER_DEPTH_BUFFER << 16 | (3 - 2));
> > @@ -166,5 +135,5 @@ const struct brw_tracked_state gen7_depthbuffer = {
> > .brw = BRW_NEW_BATCH,
> > .cache = 0,
> > },
> > - .emit = emit_depthbuffer,
> > + .emit = brw_emit_depthbuffer,
> > };
> > diff --git a/src/mesa/drivers/dri/intel/intel_context.h
> b/src/mesa/drivers/dri/intel/intel_context.h
> > index 59cf197..1605c30 100644
> > --- a/src/mesa/drivers/dri/intel/intel_context.h
> > +++ b/src/mesa/drivers/dri/intel/intel_context.h
> > @@ -205,6 +205,22 @@ struct intel_context
> > int width,
> > uint32_t *out_offset);
> > /** \} */
> > +
> > + /**
> > + * Sent the appropriate state packets to configure depth,
> stencil, and
> ^^^^
> Send
>
Oops, thanks :)
>
>
> > + * HiZ buffers (i965+ only)
> > + */
> > + void (*emit_depth_stencil_hiz)(struct brw_context *brw,
> > + struct intel_mipmap_tree *depth_mt,
> > + uint32_t depth_offset,
> > + uint32_t depthbuffer_format,
> > + uint32_t depth_surface_type,
> > + struct intel_mipmap_tree
> *stencil_mt,
> > + struct intel_mipmap_tree *hiz_mt,
> > + bool separate_stencil,
> > + uint32_t width, uint32_t height,
> > + uint32_t tile_x, uint32_t tile_y);
> > +
> > } vtbl;
> >
> > GLbitfield Fallback; /**< mask of INTEL_FALLBACK_x bits */
> > --
> > 1.8.2
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130328/8a98fae0/attachment-0001.html>
More information about the mesa-dev
mailing list