On Thu, 17 Nov 2011 19:59:05 -0800, Chad Versace <chad.vers...@linux.intel.com> wrote: > From: Kenneth Graunke <kenn...@whitecape.org> > > I implemented functions for horizontal/vertical alignment units separately > because I find it easier to read that way...especially with all the > corner-cases. > > [chad] Cherry picked from > commit 9babf8ae308223e70f7c867076a5d62f2cd70a32 > branch valign > git://git.freedesktop.org/~kayden/mesa.git > > [chad] Corrected the vertical alignment calculation by checking for > depthstencil formats. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Signed-off-by: Chad Versace <chad.vers...@linux.intel.com> > --- > src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 3 +- > src/mesa/drivers/dri/intel/intel_tex_layout.c | 101 > +++++++++++++++++++++++- > src/mesa/drivers/dri/intel/intel_tex_layout.h | 7 +- > 3 files changed, 105 insertions(+), 6 deletions(-) > > diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > index 17cf50e..af5d393 100644 > --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > @@ -89,7 +89,8 @@ intel_miptree_create_internal(struct intel_context *intel, > mt->compressed = compress_byte ? 1 : 0; > mt->refcount = 1; > > - intel_get_texture_alignment_unit(format, &mt->align_w, &mt->align_h); > + intel_get_texture_alignment_unit(intel, format, > + &mt->align_w, &mt->align_h); > > if (target == GL_TEXTURE_CUBE_MAP) { > assert(depth0 == 1); > diff --git a/src/mesa/drivers/dri/intel/intel_tex_layout.c > b/src/mesa/drivers/dri/intel/intel_tex_layout.c > index a428d56..8119d30 100644 > --- a/src/mesa/drivers/dri/intel/intel_tex_layout.c > +++ b/src/mesa/drivers/dri/intel/intel_tex_layout.c > @@ -33,10 +33,105 @@ > #include "intel_mipmap_tree.h" > #include "intel_tex_layout.h" > #include "intel_context.h" > + > +#include "main/image.h" > #include "main/macros.h" > > +static unsigned int > +intel_horizontal_texture_alignment_unit(struct intel_context *intel, > + gl_format format) > +{ > + /** > + * From the "Alignment Unit Size" section of various specs, namely: > + * - Gen3 Spec: "Memory Data Formats" Volume, Section 1.20.1.4 > + * - i965 and G45 PRMs: Volume 1, Section 6.17.3.4. > + * - Ironlake and Sandybridge PRMs: Volume 1, Part 1, Section 7.18.3.4 > + * - BSpec (for Ivybridge and slight variations in separate stencil) > + * > + * > +----------------------------------------------------------------------+ > + * | | alignment unit height ("i") > |
"width" > + * | Surface Property > |-----------------------------| > + * | | 915 | 965 | ILK | SNB | IVB > | > + * > +----------------------------------------------------------------------+ > + * | YUV 4:2:2 format | 8 | 4 | 4 | 4 | 4 > | > + * | BC1-5 compressed format (DXTn/S3TC) | 4 | 4 | 4 | 4 | 4 > | > + * | FXT1 compressed format | 8 | 8 | 8 | 8 | 8 > | > + * | Depth Buffer (16-bit) | 4 | 4 | 4 | 4 | 8 > | > + * | Depth Buffer (other) | 4 | 4 | 4 | 4 | 4 > | > + * | Separate Stencil Buffer | N/A | N/A | 8 | 8 | 8 > | > + * | All Others | 4 | 4 | 4 | 4 | 4 > | > + * > +----------------------------------------------------------------------+ > + * > + * On IVB+, non-special cases can be overridden by setting the > SURFACE_STATE > + * "Surface Horizontal Alignment" field to VALIGN_4 or VALIGN_8. > + */ "HALIGN" > + if (intel->gen >= 6 && > + (_mesa_is_depth_format(base_format) || > + _mesa_is_depthstencil_format(base_format))) { > + return 4; > + } If we're testing the base_format, we only need to check for GL_DEPTH_COMPONENT or GL_DEPTH_STENCIL. (those functions are for internalformats, which might have sizes). > + > + return 2; > +} > + > void > -intel_get_texture_alignment_unit(gl_format format, > +intel_get_texture_alignment_unit(struct intel_context *intel, > + gl_format format, > unsigned int *w, unsigned int *h) > { > if (_mesa_is_format_compressed(format)) { > @@ -45,8 +140,8 @@ intel_get_texture_alignment_unit(gl_format format, > */ > _mesa_get_format_block_size(format, w, h); > } else { > - *w = 4; > - *h = 2; > + *w = intel_horizontal_texture_alignment_unit(intel, format); > + *h = intel_vertical_texture_alignment_unit(intel, format); > } > } We have a test for _mesa_is_format_compressed here and in the (static, called-once) functions above. One of the two should probably be dropped.
pgpRgbaPUA7Qx.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev