Mesa (main): turnip: fix drm modifier support with planar formats

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 29 23:05:53 UTC 2022


Module: Mesa
Branch: main
Commit: 53d87865caca949ce3e73f2a8ec04c17d5818754
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=53d87865caca949ce3e73f2a8ec04c17d5818754

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Mon Apr 25 21:45:50 2022 -0700

turnip: fix drm modifier support with planar formats

We need to advertise the results of tu6_plane_count and handle
VK_IMAGE_ASPECT_MEMORY_PLANE_*_BIT.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6374
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16169>

---

 src/freedreno/vulkan/tu_formats.c | 4 ++--
 src/freedreno/vulkan/tu_image.c   | 5 ++++-
 src/freedreno/vulkan/tu_private.h | 1 +
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/freedreno/vulkan/tu_formats.c b/src/freedreno/vulkan/tu_formats.c
index 429c898e5c0..600088835bc 100644
--- a/src/freedreno/vulkan/tu_formats.c
+++ b/src/freedreno/vulkan/tu_formats.c
@@ -329,7 +329,7 @@ tu_GetPhysicalDeviceFormatProperties2(
       if (pFormatProperties->formatProperties.linearTilingFeatures) {
          vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, mod_props) {
             mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR;
-            mod_props->drmFormatModifierPlaneCount = 1;
+            mod_props->drmFormatModifierPlaneCount = tu6_plane_count(format);
             mod_props->drmFormatModifierTilingFeatures =
                pFormatProperties->formatProperties.linearTilingFeatures;
          }
@@ -341,7 +341,7 @@ tu_GetPhysicalDeviceFormatProperties2(
           ubwc_possible(format, VK_IMAGE_TYPE_2D, 0, 0, physical_device->info, VK_SAMPLE_COUNT_1_BIT)) {
          vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, mod_props) {
             mod_props->drmFormatModifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
-            mod_props->drmFormatModifierPlaneCount = 1;
+            mod_props->drmFormatModifierPlaneCount = tu6_plane_count(format);
             mod_props->drmFormatModifierTilingFeatures =
                pFormatProperties->formatProperties.optimalTilingFeatures;
          }
diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c
index 4c214f265c1..ff011f9bc3a 100644
--- a/src/freedreno/vulkan/tu_image.c
+++ b/src/freedreno/vulkan/tu_image.c
@@ -37,7 +37,7 @@
 
 #include "tu_cs.h"
 
-static uint32_t
+uint32_t
 tu6_plane_count(VkFormat format)
 {
    switch (format) {
@@ -71,10 +71,13 @@ tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask)
 {
    switch (aspect_mask) {
    default:
+      assert(aspect_mask != VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT);
       return 0;
    case VK_IMAGE_ASPECT_PLANE_1_BIT:
+   case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
       return 1;
    case VK_IMAGE_ASPECT_PLANE_2_BIT:
+   case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
       return 2;
    case VK_IMAGE_ASPECT_STENCIL_BIT:
       return format == VK_FORMAT_D32_SFLOAT_S8_UINT;
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 00563280436..643040929c9 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -1675,6 +1675,7 @@ tu_get_levelCount(const struct tu_image *image,
              : range->levelCount;
 }
 
+uint32_t tu6_plane_count(VkFormat format);
 enum pipe_format tu6_plane_format(VkFormat format, uint32_t plane);
 
 uint32_t tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask);



More information about the mesa-commit mailing list