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

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Apr 27 09:33:32 2022 -0400

zink: add supported present modes to kopper displaytarget

for use later

Reviewed-by: Adam Jackson <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16193>

---

 src/gallium/drivers/zink/zink_kopper.c | 22 +++++++++++++++++++---
 src/gallium/drivers/zink/zink_kopper.h |  1 +
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_kopper.c 
b/src/gallium/drivers/zink/zink_kopper.c
index bc9d9e68be2..12156989653 100644
--- a/src/gallium/drivers/zink/zink_kopper.c
+++ b/src/gallium/drivers/zink/zink_kopper.c
@@ -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
diff --git a/src/gallium/drivers/zink/zink_kopper.h 
b/src/gallium/drivers/zink/zink_kopper.h
index 7c11d804040..61e0db96738 100644
--- a/src/gallium/drivers/zink/zink_kopper.h
+++ b/src/gallium/drivers/zink/zink_kopper.h
@@ -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;
 

Reply via email to