[Mesa-dev] [PATCH 38/41] i965: Implement the actual tables for texture alignment units.
Eric Anholt
eric at anholt.net
Fri Nov 18 17:53:41 PST 2011
On Thu, 17 Nov 2011 19:59:05 -0800, Chad Versace <chad.versace at linux.intel.com> wrote:
> From: Kenneth Graunke <kenneth at 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 <kenneth at whitecape.org>
> Signed-off-by: Chad Versace <chad.versace at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20111118/6ca83394/attachment.pgp>
More information about the mesa-dev
mailing list