Просмотр исходного кода

Fixed Vulkan validation error when creating a swapchain on Android

Sam Lantinga 1 неделя назад
Родитель
Сommit
0628d5c603
1 измененных файлов с 18 добавлено и 0 удалено
  1. 18 0
      src/render/vulkan/SDL_render_vulkan.c

+ 18 - 0
src/render/vulkan/SDL_render_vulkan.c

@@ -2505,6 +2505,24 @@ static VkResult VULKAN_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
     swapchainCreateInfo.presentMode = presentMode;
     swapchainCreateInfo.clipped = VK_TRUE;
     swapchainCreateInfo.oldSwapchain = rendererData->swapchain;
+    if (!(renderer->window->flags & SDL_WINDOW_TRANSPARENT)) {
+        // Set the first supported swap chain composite mode
+        // Android doesn't support VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, for example
+        const VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[] = {
+            VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
+            VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR
+        };
+        for (uint32_t i = 0; i < SDL_arraysize(compositeAlphaFlags); ++i) {
+            if (rendererData->surfaceCapabilities.supportedCompositeAlpha & compositeAlphaFlags[i]) {
+                swapchainCreateInfo.compositeAlpha = compositeAlphaFlags[i];
+                break;
+            }
+        }
+        if (!swapchainCreateInfo.compositeAlpha) {
+            // Fall back to VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, unsupported but better than nothing
+            swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+        }
+    }
     result = vkCreateSwapchainKHR(rendererData->device, &swapchainCreateInfo, NULL, &rendererData->swapchain);
 
     if (swapchainCreateInfo.oldSwapchain != VK_NULL_HANDLE) {