[Mesa-dev] [PATCH 08/12] intel: Refactor selection of miptree tiling
Ian Romanick
idr at freedesktop.org
Fri Mar 1 10:57:20 PST 2013
On 02/28/2013 03:45 PM, Chad Versace wrote:
> This patch (1) extracts from intel_miptree_create() the spaghetti logic
> that selects the tiling format, (2) rewrites that spaghetti into a lucid
> form, and (3) moves it to a new function, intel_miptree_choose_tiling().
> No behavioral change.
>
> As a bonus, it is now evident that the force_y_tiling parameter to
> intel_miptree_create() does not really force Y tiling.
This is a really nice refactor. It also seems like it would be a good
function for a unit test...
>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
> src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 90 +++++++++++++++-----------
> 1 file changed, 54 insertions(+), 36 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> index 0a90de2..ce07abf 100644
> --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> @@ -281,6 +281,57 @@ intel_miptree_create_layout(struct intel_context *intel,
> return mt;
> }
>
> +/**
> + * \brief Helper function for intel_miptree_create().
> + */
> +static uint32_t
> +intel_miptree_choose_tiling(struct intel_context *intel,
> + gl_format format,
> + uint32_t width0,
> + uint32_t num_samples,
> + bool force_y_tiling)
> +{
> +
> + if (format == MESA_FORMAT_S8) {
> + /* The stencil buffer is W tiled. However, we request from the kernel a
> + * non-tiled buffer because the GTT is incapable of W fencing.
> + */
> + return I915_TILING_NONE;
> + }
> +
> + if (!intel->use_texture_tiling || _mesa_is_format_compressed(format))
> + return I915_TILING_NONE;
> +
> + if (force_y_tiling)
> + return I915_TILING_Y;
> +
> + if (num_samples > 1) {
> + /* From p82 of the Sandy Bridge PRM, dw3[1] of SURFACE_STATE ("Tiled
> + * Surface"):
> + *
> + * [DevSNB+]: For multi-sample render targets, this field must be
> + * 1. MSRTs can only be tiled.
> + *
> + * Our usual reason for preferring X tiling (fast blits using the
> + * blitting engine) doesn't apply to MSAA, since we'll generally be
> + * downsampling or upsampling when blitting between the MSAA buffer
> + * and another buffer, and the blitting engine doesn't support that.
> + * So use Y tiling, since it makes better use of the cache.
> + */
> + return I915_TILING_Y;
> + }
> +
> + GLenum base_format = _mesa_get_format_base_format(format);
> + if (intel->gen >= 4 &&
> + (base_format == GL_DEPTH_COMPONENT ||
> + base_format == GL_DEPTH_STENCIL_EXT))
> + return I915_TILING_Y;
> +
> + if (width0 >= 64)
> + return I915_TILING_X;
> +
> + return I915_TILING_NONE;
> +}
>
> struct intel_mipmap_tree *
> intel_miptree_create(struct intel_context *intel,
> @@ -296,8 +347,6 @@ intel_miptree_create(struct intel_context *intel,
> bool force_y_tiling)
> {
> struct intel_mipmap_tree *mt;
> - uint32_t tiling = I915_TILING_NONE;
> - GLenum base_format;
> gl_format tex_format = format;
> gl_format etc_format = MESA_FORMAT_NONE;
> GLuint total_width, total_height;
> @@ -336,35 +385,6 @@ intel_miptree_create(struct intel_context *intel,
> }
>
> etc_format = (format != tex_format) ? tex_format : MESA_FORMAT_NONE;
> - base_format = _mesa_get_format_base_format(format);
> -
> - if (num_samples > 1) {
> - /* From p82 of the Sandy Bridge PRM, dw3[1] of SURFACE_STATE ("Tiled
> - * Surface"):
> - *
> - * [DevSNB+]: For multi-sample render targets, this field must be
> - * 1. MSRTs can only be tiled.
> - *
> - * Our usual reason for preferring X tiling (fast blits using the
> - * blitting engine) doesn't apply to MSAA, since we'll generally be
> - * downsampling or upsampling when blitting between the MSAA buffer
> - * and another buffer, and the blitting engine doesn't support that.
> - * So use Y tiling, since it makes better use of the cache.
> - */
> - force_y_tiling = true;
> - }
> -
> - if (intel->use_texture_tiling && !_mesa_is_format_compressed(format)) {
> - if (intel->gen >= 4 &&
> - (base_format == GL_DEPTH_COMPONENT ||
> - base_format == GL_DEPTH_STENCIL_EXT))
> - tiling = I915_TILING_Y;
> - else if (force_y_tiling) {
> - tiling = I915_TILING_Y;
> - } else if (width0 >= 64)
> - tiling = I915_TILING_X;
> - }
> -
> mt = intel_miptree_create_layout(intel, target, format,
> first_level, last_level, width0,
> height0, depth0,
> @@ -381,15 +401,13 @@ intel_miptree_create(struct intel_context *intel,
> total_height = mt->total_height;
>
> if (format == MESA_FORMAT_S8) {
> - /* The stencil buffer is W tiled. However, we request from the kernel a
> - * non-tiled buffer because the GTT is incapable of W fencing. So round
> - * up the width and height to match the size of W tiles (64x64).
> - */
> - tiling = I915_TILING_NONE;
> + /* Align to size of W tile, 64x64. */
> total_width = ALIGN(total_width, 64);
> total_height = ALIGN(total_height, 64);
> }
>
> + uint32_t tiling = intel_miptree_choose_tiling(intel, format, width0,
> + num_samples, force_y_tiling);
> mt->etc_format = etc_format;
> mt->region = intel_region_alloc(intel->intelScreen,
> tiling,
>
More information about the mesa-dev
mailing list