Mesa (main): zink: add fallback for linear modifier use

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 13 00:32:41 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Jun 22 08:33:04 2021 -0400

zink: add fallback for linear modifier use

Acked-by: Dave Airlie <airlied at redhat.com>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10782>

---

 src/gallium/drivers/zink/zink_resource.c | 36 +++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index cea0f815ebb..6076f4d9844 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -323,6 +323,18 @@ get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats
    return usage;
 }
 
+static VkFormatFeatureFlags
+find_modifier_feats(const struct zink_modifier_prop *prop, uint64_t modifier, uint64_t *mod)
+{
+   for (unsigned j = 0; j < prop->drmFormatModifierCount; j++) {
+      if (prop->pDrmFormatModifierProperties[j].drmFormatModifier == modifier) {
+         *mod = modifier;
+         return prop->pDrmFormatModifierProperties[j].drmFormatModifierTilingFeatures;
+      }
+   }
+   return 0;
+}
+
 static VkImageUsageFlags
 get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count, const uint64_t *modifiers, uint64_t *mod)
 {
@@ -330,19 +342,27 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct
 #ifdef ZINK_USE_DMABUF
    *mod = DRM_FORMAT_MOD_INVALID;
    if (modifiers_count) {
+      bool have_linear = false;
+      const struct zink_modifier_prop *prop = &screen->modifier_props[templ->format];
       assert(tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
       for (unsigned i = 0; i < modifiers_count; i++) {
-         if (modifiers[i] == DRM_FORMAT_MOD_LINEAR)
+         if (modifiers[i] == DRM_FORMAT_MOD_LINEAR) {
+            have_linear = true;
             continue;
-         VkFormatFeatureFlags feats = 0;
-         struct zink_modifier_prop *prop = &screen->modifier_props[templ->format];
-         for (unsigned j = 0; j < prop->drmFormatModifierCount; j++) {
-            if (prop->pDrmFormatModifierProperties[j].drmFormatModifier == modifiers[i]) {
-               feats = prop->pDrmFormatModifierProperties[j].drmFormatModifierTilingFeatures;
-               *mod = modifiers[i];
-               break;
+         }
+         VkFormatFeatureFlags feats = find_modifier_feats(prop, modifiers[i], mod);
+         if (feats) {
+            VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
+            if (usage) {
+               ici->usage = usage;
+               if (check_ici(screen, ici, *mod))
+                  return usage;
             }
          }
+      }
+      /* only try linear if no other options available */
+      if (have_linear) {
+         VkFormatFeatureFlags feats = find_modifier_feats(prop, DRM_FORMAT_MOD_LINEAR, mod);
          if (feats) {
             VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
             if (usage) {



More information about the mesa-commit mailing list