[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