[Mesa-dev] [RFC PATCH 13/16] i965: Support array_spacing_lod0 for multiple miplevels

Jordan Justen jljusten at gmail.com
Mon Jun 2 11:02:48 PDT 2014


On Mon, Jun 2, 2014 at 10:29 AM, Pohjolainen, Topi
<topi.pohjolainen at intel.com> wrote:
> On Mon, Jun 02, 2014 at 09:44:16AM -0700, Jordan Justen wrote:
>> On Mon, Jun 2, 2014 at 2:36 AM, Pohjolainen, Topi
>> <topi.pohjolainen at intel.com> wrote:
>> > On Thu, May 29, 2014 at 01:53:52PM -0700, Jordan Justen wrote:
>> >> Previously array spacing lod0 was only used with a single mip level.
>> >>
>> >> It indicated that no mip level spacing should be used between array
>> >> slices.
>> >>
>> >> gen6 stencil only support LOD0, so we need to allocate the miptree
>> >> similar to array spacing lod0, except we also need space for more
>> >> than just one mip level.
>> >>
>> >> So, the miptree is allocated with tightly packed array slice spacing,
>> >> but we still also pack the miplevels into the region similar to a
>> >> normal multi mip level packing.
>> >>
>> >> Essentially, the miptree is set up as if the texture slices formed
>> >> one tall 2D texture, rather than a 2D array.
>> >>
>> >> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
>> >> ---
>> >>  src/mesa/drivers/dri/i965/brw_tex_layout.c | 21 +++++++++++++++++++--
>> >>  1 file changed, 19 insertions(+), 2 deletions(-)
>> >>
>> >> diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c
>> >> index 76044b2..8a0912d 100644
>> >> --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c
>> >> +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c
>> >> @@ -203,6 +203,11 @@ brw_miptree_layout_2d(struct intel_mipmap_tree *mt)
>> >>        if (mt->compressed)
>> >>        img_height /= mt->align_h;
>> >>
>> >> +      if (mt->array_spacing_lod0) {
>> >> +         /* Compact arrays with separated miplevels */
>> >> +      img_height *= depth;
>> >
>> > I always thought arrays are only handled by brw_miptree_layout_texture_array().
>> > When do we end up here to setup an array?
>>
>> brw_miptree_layout_texture_array calls brw_miptree_layout_2d.
>
> Ah, right, it was too obvious, my bad.
>
>>
>> >> +      }
>> >> +
>> >>        /* Because the images are packed better, the final offset
>> >>         * might not be the maximal one:
>> >>         */
>> >> @@ -238,6 +243,7 @@ brw_miptree_layout_texture_array(struct brw_context *brw,
>> >>                                struct intel_mipmap_tree *mt)
>> >>  {
>> >>     int h0, h1;
>> >> +   unsigned height = mt->physical_height0;
>> >>
>> >>     h0 = ALIGN(mt->physical_height0, mt->align_h);
>> >>     h1 = ALIGN(minify(mt->physical_height0, 1), mt->align_h);
>> >> @@ -251,11 +257,22 @@ brw_miptree_layout_texture_array(struct brw_context *brw,
>> >>     brw_miptree_layout_2d(mt);
>> >>
>> >>     for (unsigned level = mt->first_level; level <= mt->last_level; level++) {
>> >> +      unsigned img_height;
>> >> +      img_height = ALIGN(height, mt->align_h);
>> >> +      if (mt->compressed)
>> >> +         img_height /= mt->align_h;
>> >
>> > This is confusing me also. You are introducing new layout for layered stencil
>> > only. Do we really allow compression of stencil buffers?
>>
>> I guess I was just trying to generically extend array_spacing_lod0 to
>> multiple miplevels. It does seem like array_spacing_lod0 is no longer
>> the correct name in this case. How about something like
>> compact_arrays_separate_lods?
>
> I guess I was looking something specific to stencil. In fact wouldn't
> intel_mipmap_tree::format be always MESA_FORMAT_S_UINT8 in this case? Couldn't
> we just use that and gen == 6 as the trigger for the special layout?
>
> Or are you thinking some other usecase besides stencil for this?

No, I don't have another use case in mind.

I did end up having to enable it for both the stencil and hiz
miptrees, so MESA_FORMAT_S_UINT8 is not quite enough.

-Jordan

>> This is definitely one of the RFC patches. :)
>>
>> -Jordan
>>
>> >
>> >> +
>> >>        for (int q = 0; q < mt->physical_depth0; q++) {
>> >> -      intel_miptree_set_image_offset(mt, level, q, 0, q * physical_qpitch);
>> >> +         if (mt->array_spacing_lod0) {
>> >> +            intel_miptree_set_image_offset(mt, level, q, 0, q * img_height);
>> >> +         } else {
>> >> +            intel_miptree_set_image_offset(mt, level, q, 0, q * physical_qpitch);
>> >> +         }
>> >>        }
>> >> +      height = minify(height, 1);
>> >>     }
>> >> -   mt->total_height = physical_qpitch * mt->physical_depth0;
>> >> +   if (!mt->array_spacing_lod0)
>> >> +      mt->total_height = physical_qpitch * mt->physical_depth0;
>> >>
>> >>     align_cube(mt);
>> >>  }
>> >> --
>> >> 2.0.0.rc4
>> >>
>> >> _______________________________________________
>> >> mesa-dev mailing list
>> >> mesa-dev at lists.freedesktop.org
>> >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>> > _______________________________________________
>> > mesa-dev mailing list
>> > mesa-dev at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list