zink: avoid generating nonsensical code
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 25 Aug 2021 19:51:44 +0000 (21:51 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 27 Aug 2021 18:55:19 +0000 (18:55 +0000)
With this code, we end up generating code such as:

if (!strcmp(extensions[i].extensionName, "VK_KHR_maintenance1")) {
   if (VK_MAKE_VERSION(1,2,0) >= screen->vk_version) {
      info->have_KHR_maintenance1 = true;
   } else {
      info->have_KHR_maintenance1 = true;
   }
}

That's clearly nonsense, as it does the same thing in the true and false
case. So let's instead try to walk the Vulkan versions up to the one
we're using in a separate pass, and add all extensions that were made core
in that version.

CID: 1473289

Reviewed-by: Hoe Hao Cheng <haochengho12907@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12593>

src/gallium/drivers/zink/zink_device_info.py

index ba9d9f7..5494b9e 100644 (file)
@@ -329,31 +329,11 @@ zink_get_physical_device_info(struct zink_screen *screen)
          %for ext in extensions:
          <%helpers:guard ext="${ext}">
             if (!strcmp(extensions[i].extensionName, "${ext.name}")) {
-         %if ext.core_since:
-         %for version in versions:
-         %if ext.core_since.struct_version == version.struct_version:
-               if (${version.version()} >= screen->vk_version) {
-         %if not (ext.has_features or ext.has_properties):
-                  info->have_${ext.name_with_vendor()} = true;
-         %else:
-                  support_${ext.name_with_vendor()} = true;
-         %endif
-               } else {
-         %if not (ext.has_features or ext.has_properties):
-                  info->have_${ext.name_with_vendor()} = true;
-         %else:
-                  support_${ext.name_with_vendor()} = true;
-         %endif
-               }
-         %endif
-         %endfor
-         %else:
          %if not (ext.has_features or ext.has_properties):
                info->have_${ext.name_with_vendor()} = true;
          %else:
                support_${ext.name_with_vendor()} = true;
          %endif
-         %endif
             }
          </%helpers:guard>
          %endfor
@@ -363,6 +343,22 @@ zink_get_physical_device_info(struct zink_screen *screen)
       }
    }
 
+   %for version in versions:
+   if (${version.version()} <= screen->vk_version) {
+   %for ext in extensions:
+   %if ext.core_since and ext.core_since.struct_version == version.struct_version:
+   <%helpers:guard ext="${ext}">
+   %if not (ext.has_features or ext.has_properties):
+       info->have_${ext.name_with_vendor()} = true;
+   %else:
+       support_${ext.name_with_vendor()} = true;
+   %endif
+   </%helpers:guard>
+   %endif
+   %endfor
+   }
+   %endfor
+
    // get device features
    if (screen->vk.GetPhysicalDeviceFeatures2) {
       // check for device extension features