zink: add supported present modes to kopper displaytarget
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 27 Apr 2022 13:33:32 +0000 (09:33 -0400)
committerMarge Bot <emma+marge@anholt.net>
Wed, 27 Apr 2022 16:52:25 +0000 (16:52 +0000)
for use later

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16193>

src/gallium/drivers/zink/zink_kopper.c
src/gallium/drivers/zink/zink_kopper.h

index bc9d9e6..1215698 100644 (file)
@@ -89,12 +89,28 @@ kopper_CreateSurface(struct zink_screen *screen, struct kopper_displaytarget *cd
 
     VkBool32 supported;
     error = VKSCR(GetPhysicalDeviceSurfaceSupportKHR)(screen->pdev, screen->gfx_queue, surface, &supported);
-    if (!zink_screen_handle_vkresult(screen, error) || !supported) {
-       VKSCR(DestroySurfaceKHR)(screen->instance, surface, NULL);
-       return VK_NULL_HANDLE;
+    if (!zink_screen_handle_vkresult(screen, error) || !supported)
+       goto fail;
+
+    unsigned count = 10;
+    VkPresentModeKHR modes[10];
+    error = VKSCR(GetPhysicalDeviceSurfacePresentModesKHR)(screen->pdev, surface, &count, modes);
+    if (!zink_screen_handle_vkresult(screen, error))
+       goto fail;
+
+    for (unsigned i = 0; i < count; i++) {
+       /* VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR and VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
+        * are not handled
+        */
+       assert(modes[i] <= VK_PRESENT_MODE_FIFO_RELAXED_KHR);
+       if (modes[i] <= VK_PRESENT_MODE_FIFO_RELAXED_KHR)
+          cdt->present_modes |= BITFIELD_BIT(modes[i]);
     }
 
     return surface;
+fail:
+   VKSCR(DestroySurfaceKHR)(screen->instance, surface, NULL);
+   return VK_NULL_HANDLE;
 }
 
 static void
index 7c11d80..61e0db9 100644 (file)
@@ -59,6 +59,7 @@ struct kopper_displaytarget
    void *loader_private;
 
    VkSurfaceKHR surface;
+   uint32_t present_modes; //VkPresentModeKHR bitmask
    struct kopper_swapchain *swapchain;
    struct kopper_swapchain *old_swapchain;