[Mesa-dev] [PATCH 2/3] intel: Add a force_y_tiling parameter to intel_miptree_create().

Paul Berry stereotype441 at gmail.com
Tue Jan 8 14:27:01 PST 2013


This allows intel_miptree_alloc_mcs() to force Y tiling for the MCS
buffer.  Previously we accomplished this by the hack of passing
INTEL_MSAA_LAYOUT_CMS as the msaa_layout parameter, but that parameter
is going to be going away soon.
---
 src/mesa/drivers/dri/intel/intel_fbo.c          |  3 +-
 src/mesa/drivers/dri/intel/intel_mipmap_tree.c  | 48 +++++++++++++------------
 src/mesa/drivers/dri/intel/intel_mipmap_tree.h  |  3 +-
 src/mesa/drivers/dri/intel/intel_tex_image.c    |  3 +-
 src/mesa/drivers/dri/intel/intel_tex_validate.c |  3 +-
 5 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
index 6a66521..0597015 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -939,7 +939,8 @@ intel_renderbuffer_move_to_temp(struct intel_context *intel,
                                  width, height, depth,
                                  true,
                                  irb->mt->num_samples,
-                                 irb->mt->msaa_layout);
+                                 irb->mt->msaa_layout,
+                                 false /* force_y_tiling */);
 
    intel_miptree_copy_teximage(intel, intel_image, new_mt);
    intel_miptree_reference(&irb->mt, intel_image->mt);
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
index 2d564ea..12b77b6 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
@@ -187,7 +187,8 @@ intel_miptree_create_internal(struct intel_context *intel,
                                             mt->depth0,
                                             true,
                                             num_samples,
-                                            msaa_layout);
+                                            msaa_layout,
+                                            false /* force_y_tiling */);
       if (!mt->stencil_mt) {
 	 intel_miptree_release(&mt);
 	 return NULL;
@@ -235,7 +236,8 @@ intel_miptree_create(struct intel_context *intel,
 		     GLuint depth0,
 		     bool expect_accelerated_upload,
                      GLuint num_samples,
-                     enum intel_msaa_layout msaa_layout)
+                     enum intel_msaa_layout msaa_layout,
+                     bool force_y_tiling)
 {
    struct intel_mipmap_tree *mt;
    uint32_t tiling = I915_TILING_NONE;
@@ -280,24 +282,28 @@ 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 (msaa_layout != INTEL_MSAA_LAYOUT_NONE) {
+      /* 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 (msaa_layout != INTEL_MSAA_LAYOUT_NONE) {
-         /* 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.
-          */
+      else if (force_y_tiling) {
          tiling = I915_TILING_Y;
       } else if (width0 >= 64)
 	 tiling = I915_TILING_X;
@@ -500,7 +506,7 @@ intel_miptree_create_for_renderbuffer(struct intel_context *intel,
 
    mt = intel_miptree_create(intel, GL_TEXTURE_2D, format, 0, 0,
 			     width, height, depth, true, num_samples,
-                             msaa_layout);
+                             msaa_layout, false /* force_y_tiling */);
    if (!mt)
       goto fail;
 
@@ -823,10 +829,6 @@ intel_miptree_alloc_mcs(struct intel_context *intel,
    /* From the Ivy Bridge PRM, Vol4 Part1 p76, "MCS Base Address":
     *
     *     "The MCS surface must be stored as Tile Y."
-    *
-    * We set msaa_format to INTEL_MSAA_LAYOUT_CMS to force
-    * intel_miptree_create() to use Y tiling.  msaa_format is otherwise
-    * ignored for the MCS miptree.
     */
    mt->mcs_mt = intel_miptree_create(intel,
                                      mt->target,
@@ -838,7 +840,8 @@ intel_miptree_alloc_mcs(struct intel_context *intel,
                                      mt->depth0,
                                      true,
                                      0 /* num_samples */,
-                                     INTEL_MSAA_LAYOUT_CMS);
+                                     INTEL_MSAA_LAYOUT_NONE,
+                                     true /* force_y_tiling */);
 
    /* From the Ivy Bridge PRM, Vol 2 Part 1 p326:
     *
@@ -874,7 +877,8 @@ intel_miptree_alloc_hiz(struct intel_context *intel,
                                      mt->depth0,
                                      true,
                                      num_samples,
-                                     INTEL_MSAA_LAYOUT_IMS);
+                                     INTEL_MSAA_LAYOUT_IMS,
+                                     false /* force_y_tiling */);
 
    if (!mt->hiz_mt)
       return false;
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
index eb4ad7f..8e84bef 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
@@ -384,7 +384,8 @@ struct intel_mipmap_tree *intel_miptree_create(struct intel_context *intel,
                                                GLuint depth0,
 					       bool expect_accelerated_upload,
                                                GLuint num_samples,
-                                               enum intel_msaa_layout msaa_layout);
+                                               enum intel_msaa_layout msaa_layout,
+                                               bool force_y_tiling);
 
 struct intel_mipmap_tree *
 intel_miptree_create_for_region(struct intel_context *intel,
diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
index 7361e6a..f1ab07d 100644
--- a/src/mesa/drivers/dri/intel/intel_tex_image.c
+++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
@@ -101,7 +101,8 @@ intel_miptree_create_for_teximage(struct intel_context *intel,
 			       depth,
 			       expect_accelerated_upload,
                                0 /* num_samples */,
-                               INTEL_MSAA_LAYOUT_NONE);
+                               INTEL_MSAA_LAYOUT_NONE,
+                               false /* force_y_tiling */);
 }
 
 /* There are actually quite a few combinations this will work for,
diff --git a/src/mesa/drivers/dri/intel/intel_tex_validate.c b/src/mesa/drivers/dri/intel/intel_tex_validate.c
index fee5842..eb19774 100644
--- a/src/mesa/drivers/dri/intel/intel_tex_validate.c
+++ b/src/mesa/drivers/dri/intel/intel_tex_validate.c
@@ -106,7 +106,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
                                           depth,
 					  true,
                                           0 /* num_samples */,
-                                          INTEL_MSAA_LAYOUT_NONE);
+                                          INTEL_MSAA_LAYOUT_NONE,
+                                          false /* force_y_tiling */);
       if (!intelObj->mt)
          return false;
    }
-- 
1.8.1



More information about the mesa-dev mailing list