Mesa (master): iris: Support I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 9 20:18:48 UTC 2020


Module: Mesa
Branch: master
Commit: 14b60ea302e18f37cff7741354c8966be84a2cba
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=14b60ea302e18f37cff7741354c8966be84a2cba

Author: Nanley Chery <nanley.g.chery at intel.com>
Date:   Mon Sep  9 16:01:13 2019 -0700

iris: Support I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6486>

---

 src/gallium/drivers/iris/iris_resolve.c  |  1 +
 src/gallium/drivers/iris/iris_resource.c | 34 ++++++++++++++++++++++++++++----
 2 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c
index 023389bb535..fba62e3ea35 100644
--- a/src/gallium/drivers/iris/iris_resolve.c
+++ b/src/gallium/drivers/iris/iris_resolve.c
@@ -838,6 +838,7 @@ iris_resource_texture_aux_usage(struct iris_context *ice,
    case ISL_AUX_USAGE_MCS:
    case ISL_AUX_USAGE_MCS_CCS:
    case ISL_AUX_USAGE_STC_CCS:
+   case ISL_AUX_USAGE_MC:
       return res->aux.usage;
 
    case ISL_AUX_USAGE_CCS_E:
diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
index 4cb96126522..c12a287307f 100644
--- a/src/gallium/drivers/iris/iris_resource.c
+++ b/src/gallium/drivers/iris/iris_resource.c
@@ -86,6 +86,7 @@ modifier_is_supported(const struct gen_device_info *devinfo,
          return false;
       break;
    case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
+   case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
       if (devinfo->gen != 12)
          return false;
       break;
@@ -96,6 +97,20 @@ modifier_is_supported(const struct gen_device_info *devinfo,
 
    /* Check remaining requirements. */
    switch (modifier) {
+   case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
+      if (pfmt != PIPE_FORMAT_BGRA8888_UNORM &&
+          pfmt != PIPE_FORMAT_RGBA8888_UNORM &&
+          pfmt != PIPE_FORMAT_BGRX8888_UNORM &&
+          pfmt != PIPE_FORMAT_RGBX8888_UNORM &&
+          pfmt != PIPE_FORMAT_NV12 &&
+          pfmt != PIPE_FORMAT_P010 &&
+          pfmt != PIPE_FORMAT_P012 &&
+          pfmt != PIPE_FORMAT_P016 &&
+          pfmt != PIPE_FORMAT_YUYV &&
+          pfmt != PIPE_FORMAT_UYVY) {
+         return false;
+      }
+      break;
    case I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
    case I915_FORMAT_MOD_Y_TILED_CCS: {
       if (unlikely(INTEL_DEBUG & DEBUG_NO_RBC))
@@ -192,6 +207,7 @@ iris_query_dmabuf_modifiers(struct pipe_screen *pscreen,
       I915_FORMAT_MOD_Y_TILED,
       I915_FORMAT_MOD_Y_TILED_CCS,
       I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS,
+      I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS,
    };
 
    int supported_mods = 0;
@@ -204,8 +220,17 @@ iris_query_dmabuf_modifiers(struct pipe_screen *pscreen,
          if (modifiers)
             modifiers[supported_mods] = all_modifiers[i];
 
-         if (external_only)
-            external_only[supported_mods] = util_format_is_yuv(pfmt);
+         if (external_only) {
+            /* Only allow external usage for the following cases: YUV formats
+             * and the media-compression modifier. The render engine lacks
+             * support for rendering to a media-compressed surface if the
+             * compression ratio is large enough. By requiring external usage
+             * of media-compressed surfaces, resolves are avoided.
+             */
+            external_only[supported_mods] =
+               util_format_is_yuv(pfmt) ||
+               all_modifiers[i] == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS;
+         }
       }
 
       supported_mods++;
@@ -559,7 +584,8 @@ iris_resource_configure_aux(struct iris_screen *screen,
    assert(!res->mod_info ||
           res->mod_info->aux_usage == ISL_AUX_USAGE_NONE ||
           res->mod_info->aux_usage == ISL_AUX_USAGE_CCS_E ||
-          res->mod_info->aux_usage == ISL_AUX_USAGE_GEN12_CCS_E);
+          res->mod_info->aux_usage == ISL_AUX_USAGE_GEN12_CCS_E ||
+          res->mod_info->aux_usage == ISL_AUX_USAGE_MC);
 
    const bool has_mcs = !res->mod_info &&
       isl_surf_get_mcs_surf(&screen->isl_dev, &res->surf, &res->aux.surf);
@@ -660,6 +686,7 @@ iris_resource_configure_aux(struct iris_screen *screen,
    case ISL_AUX_USAGE_CCS_E:
    case ISL_AUX_USAGE_GEN12_CCS_E:
    case ISL_AUX_USAGE_STC_CCS:
+   case ISL_AUX_USAGE_MC:
       /* When CCS_E is used, we need to ensure that the CCS starts off in
        * a valid state.  From the Sky Lake PRM, "MCS Buffer for Render
        * Target(s)":
@@ -681,7 +708,6 @@ iris_resource_configure_aux(struct iris_screen *screen,
          initial_state = ISL_AUX_STATE_PASS_THROUGH;
       }
       break;
-   case ISL_AUX_USAGE_MC:
    default:
       unreachable("Unsupported aux mode");
    }



More information about the mesa-commit mailing list