On Fri, May 29, 2015 at 05:21:14PM -0700, Chad Versace wrote: > On Fri 29 May 2015, Chad Versace wrote: > > On Thu 28 May 2015, Ben Widawsky wrote: > > > This restriction was attempted in this commit: > > > commit 47053464630888f819ef8cc44278f1a1220159b9 > > > Author: Anuj Phogat <anuj.pho...@gmail.com> > > > Date: Fri Feb 13 11:21:21 2015 -0800 > > > > > > i965/gen8: Use HALIGN_16 if MCS is enabled for non-MSRT > > > > > > However, the commit itself doesn't achieve the desired goal as determined > > > by the > > > asserts which the next patch adds. mcs_mt is never a value because we're > > > in the > > > process of allocating the mcs_mt miptree when we get to this function. I > > > didn't > > > check, but perhaps this would work with blorp, however, meta clears > > > allocate the > > > miptree structure (which AFAICT needs the alignment also) way before it > > > allocates using meta clears where the renderbuffer is allocated way > > > before the > > > aux buffer. > > > > > > The restriction is referenced in a few places, but the most concise one > > > [IMO] > > > from the spec is for Gen9. Gen8 8 loosens the restriction in that it only > > > requires this for non-msrt surface. > > > > > > When Auxiliary Surface Mode is set to AUX_CCS_D or AUX_CCS_E, HALIGN > > > 16 must > > > be used. > > > > > > With the code before the miptree layout flag rework (patches preceding > > > this), > > > accomplishing this workaround is very difficult. > > > > > > Cc: Anuj Phogat <anuj.pho...@gmail.com> > > > Cc: Neil Roberts <n...@linux.intel.com> > > > Signed-off-by: Ben Widawsky <b...@bwidawsk.net> > > > --- > > > src/mesa/drivers/dri/i965/brw_tex_layout.c | 16 ++++++++++------ > > > src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 15 ++++++++++++--- > > > src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 4 +++- > > > 3 files changed, 25 insertions(+), 10 deletions(-) > > > > > > diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c > > > b/src/mesa/drivers/dri/i965/brw_tex_layout.c > > > index 72b02a2..b51c7c7 100644 > > > --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c > > > +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c > > > @@ -41,8 +41,13 @@ > > > > > > static unsigned int > > > intel_horizontal_texture_alignment_unit(struct brw_context *brw, > > > - struct intel_mipmap_tree *mt) > > > + struct intel_mipmap_tree *mt, > > > + uint32_t layout_flags) > > > { > > > + > > > + if (layout_flags & MIPTREE_LAYOUT_FORCE_HALIGN16) > > > + return 16; > > > + > > > > This snippet makes sense. If the force flag is set, then don't bother > > inspecting any other state. > > > > > /** > > > * From the "Alignment Unit Size" section of various specs, namely: > > > * - Gen3 Spec: "Memory Data Formats" Volume, Section 1.20.1.4 > > > @@ -91,9 +96,6 @@ intel_horizontal_texture_alignment_unit(struct > > > brw_context *brw, > > > if (brw->gen >= 7 && mt->format == MESA_FORMAT_Z_UNORM16) > > > return 8; > > > > > > - if (brw->gen == 8 && mt->mcs_mt && mt->num_samples <= 1) > > > - return 16; > > > - > > > return 4; > > > } > > > > > > @@ -459,7 +461,8 @@ brw_miptree_layout_texture_3d(struct brw_context *brw, > > > } > > > > > > void > > > -brw_miptree_layout(struct brw_context *brw, struct intel_mipmap_tree *mt) > > > +brw_miptree_layout(struct brw_context *brw, struct intel_mipmap_tree *mt, > > > + uint32_t layout_flags) > > > { > > > bool multisampled = mt->num_samples > 1; > > > bool gen6_hiz_or_stencil = false; > > > @@ -492,8 +495,9 @@ brw_miptree_layout(struct brw_context *brw, struct > > > intel_mipmap_tree *mt) > > > mt->align_w = 128 / mt->cpp; > > > mt->align_h = 32; > > > } > > > + assert((layout_flags & MIPTREE_LAYOUT_FORCE_HALIGN16) == 0); > > > > This assertion makes sense. > > > > > } else { > > > - mt->align_w = intel_horizontal_texture_alignment_unit(brw, mt); > > > + mt->align_w = intel_horizontal_texture_alignment_unit(brw, mt, > > > layout_flags); > > > mt->align_h = > > > intel_vertical_texture_alignment_unit(brw, mt->format, > > > multisampled); > > > } > > > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > > > b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > > > index 75ee19a..a1ac0cf 100644 > > > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > > > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c > > > @@ -475,7 +475,10 @@ intel_miptree_create_layout(struct brw_context *brw, > > > if (layout_flags & MIPTREE_LAYOUT_FORCE_ALL_SLICE_AT_LOD) > > > mt->array_layout = ALL_SLICES_AT_EACH_LOD; > > > > > > - brw_miptree_layout(brw, mt); > > > + if (intel_miptree_is_fast_clear_capable(brw, mt)) > > > + layout_flags |= MIPTREE_LAYOUT_FORCE_HALIGN16; > > > + > > > + brw_miptree_layout(brw, mt, layout_flags); > > > > This does not make sense to me. I though HALIGN16 didn't exist before > > Skylake, but here you're setting it on Ivybridge through Broadwell too. > > Am I misunderstanding something? > > I did some homewwork. HALIGN16 was introduced in Broadwell and does not > exist in Haswell. So this code still looks wrong to me.
Yeah, you are right. It's accidentally correct because the only buffers which need HALIGN8 are depth/stencil, which aren't fast clear capable. I'll fix this. (I was trying to figure out why I had no regressions with this bug). _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev