tri/cube: Correct WSI swapChainPresentMode fallback is FIFO.
authorIan Elliott <ian@LunarG.com>
Mon, 27 Jul 2015 19:53:11 +0000 (13:53 -0600)
committerIan Elliott <ian@LunarG.com>
Mon, 27 Jul 2015 19:56:40 +0000 (13:56 -0600)
A copy and paste error from the spec made it seem that all ICDs will support
VK_PRESENT_MODE_IMMEDIATE_WSI (a.k.a. "immediate").  That's not true.  They all
need to support VK_PRESENT_MODE_FIFO_WSI.  Changed the comment and code so that
the preference of these demos is:

1) VK_PRESENT_MODE_MAILBOX_WSI
2) VK_PRESENT_MODE_IMMEDIATE_WSI
3) VK_PRESENT_MODE_FIFO_WSI

demos/cube.c
demos/tri.c

index d8038cfb12b20b1790b4ddd28e2e21532cf575b0..0c760c2b95246cec04429ad169cc88036211ca36 100644 (file)
@@ -670,15 +670,20 @@ static void demo_prepare_buffers(struct demo *demo)
     }
 
     // If mailbox mode is available, use it, as is the lowest-latency non-
-    // tearing mode.  If not, fall back to IMMEDIATE which should always be
-    // available.    
-    VkPresentModeWSI swapChainPresentMode = VK_PRESENT_MODE_IMMEDIATE_WSI;
+    // tearing mode.  If not, try IMMEDIATE which will usually be available,
+    // and is fastest (though it tears).  If not, fall back to FIFO which is
+    // always available.
+    VkPresentModeWSI swapChainPresentMode = VK_PRESENT_MODE_FIFO_WSI;
     size_t presentModeCount = presentModesSize / sizeof(VkSurfacePresentModePropertiesWSI);
     for (size_t i = 0; i < presentModeCount; i++) {
         if (presentModes[i].presentMode == VK_PRESENT_MODE_MAILBOX_WSI) {
             swapChainPresentMode = VK_PRESENT_MODE_MAILBOX_WSI;
             break;
         }
+        if ((swapChainPresentMode != VK_PRESENT_MODE_MAILBOX_WSI) &&
+            (presentModes[i].presentMode == VK_PRESENT_MODE_IMMEDIATE_WSI)) {
+            swapChainPresentMode = VK_PRESENT_MODE_IMMEDIATE_WSI;
+        }
     }
 
 #define WORK_AROUND_CODE
index 20720b8925ab697799c0e929881af0a41176b073..7580c9970445b925fe0e68f8b7d68f6b66088ad2 100644 (file)
@@ -489,15 +489,20 @@ static void demo_prepare_buffers(struct demo *demo)
     }
 
     // If mailbox mode is available, use it, as is the lowest-latency non-
-    // tearing mode.  If not, fall back to IMMEDIATE which should always be
-    // available.    
-    VkPresentModeWSI swapChainPresentMode = VK_PRESENT_MODE_IMMEDIATE_WSI;
+    // tearing mode.  If not, try IMMEDIATE which will usually be available,
+    // and is fastest (though it tears).  If not, fall back to FIFO which is
+    // always available.
+    VkPresentModeWSI swapChainPresentMode = VK_PRESENT_MODE_FIFO_WSI;
     size_t presentModeCount = presentModesSize / sizeof(VkSurfacePresentModePropertiesWSI);
     for (size_t i = 0; i < presentModeCount; i++) {
         if (presentModes[i].presentMode == VK_PRESENT_MODE_MAILBOX_WSI) {
             swapChainPresentMode = VK_PRESENT_MODE_MAILBOX_WSI;
             break;
         }
+        if ((swapChainPresentMode != VK_PRESENT_MODE_MAILBOX_WSI) &&
+            (presentModes[i].presentMode == VK_PRESENT_MODE_IMMEDIATE_WSI)) {
+            swapChainPresentMode = VK_PRESENT_MODE_IMMEDIATE_WSI;
+        }
     }
 
     // Determine the number of VkImage's to use in the swap chain (we desire to