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

Author: Chia-I Wu <[email protected]>
Date:   Mon Oct 30 14:39:13 2023 -0700

radv: fix VkDrmFormatModifierProperties2EXT for multi-planar formats

Do not report DCC modifiers for multi-planar formats.  We don't support
DCC for them and drmFormatModifierPlaneCount had incorrect values.

Fix vkGetImageSubresourceLayout for multi-planar images with modifiers.
In that case, memory planes and format planes are equivalent.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25964>

---

 src/amd/vulkan/radv_formats.c | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c
index 235af071ae1..103d982de0b 100644
--- a/src/amd/vulkan/radv_formats.c
+++ b/src/amd/vulkan/radv_formats.c
@@ -1091,6 +1091,10 @@ radv_get_modifier_flags(struct radv_physical_device 
*dev, VkFormat format, uint6
    features &= ~VK_FORMAT_FEATURE_2_DISJOINT_BIT;
 
    if (ac_modifier_has_dcc(modifier)) {
+      /* We don't enable DCC for multi-planar formats */
+      if (vk_format_get_plane_count(format) > 1)
+         return 0;
+
       /* Only disable support for STORAGE_IMAGE on modifiers that
        * do not support DCC image stores.
        */
@@ -1136,17 +1140,12 @@ radv_list_drm_format_modifiers(struct 
radv_physical_device *dev, VkFormat format
 
    for (unsigned i = 0; i < mod_count; ++i) {
       VkFormatFeatureFlags2 features = radv_get_modifier_flags(dev, format, 
mods[i], format_props);
-      unsigned planes = vk_format_get_plane_count(format);
-      if (planes == 1) {
-         if (ac_modifier_has_dcc_retile(mods[i]))
-            planes = 3;
-         else if (ac_modifier_has_dcc(mods[i]))
-            planes = 2;
-      }
-
       if (!features)
          continue;
 
+      unsigned planes =
+         vk_format_get_plane_count(format) + ac_modifier_has_dcc(mods[i]) + 
ac_modifier_has_dcc_retile(mods[i]);
+
       vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, 
out_props)
       {
          *out_props = (VkDrmFormatModifierPropertiesEXT){
@@ -1192,17 +1191,12 @@ radv_list_drm_format_modifiers_2(struct 
radv_physical_device *dev, VkFormat form
 
    for (unsigned i = 0; i < mod_count; ++i) {
       VkFormatFeatureFlags2 features = radv_get_modifier_flags(dev, format, 
mods[i], format_props);
-      unsigned planes = vk_format_get_plane_count(format);
-      if (planes == 1) {
-         if (ac_modifier_has_dcc_retile(mods[i]))
-            planes = 3;
-         else if (ac_modifier_has_dcc(mods[i]))
-            planes = 2;
-      }
-
       if (!features)
          continue;
 
+      unsigned planes =
+         vk_format_get_plane_count(format) + ac_modifier_has_dcc(mods[i]) + 
ac_modifier_has_dcc_retile(mods[i]);
+
       vk_outarray_append_typed(VkDrmFormatModifierProperties2EXT, &out, 
out_props)
       {
          *out_props = (VkDrmFormatModifierProperties2EXT){

Reply via email to