Support VK_GOOGLE_surfaceless_query Test: dEQP-VK.wsi.*surfaceless* Change-Id: I81b3438c8299b169bb76d378e7983ec14a3e4607 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/74708 Commit-Queue: Shahbaz Youssefi <syoussefi@google.com> Tested-by: Shahbaz Youssefi <syoussefi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp index 84dc722..326fe75 100644 --- a/src/Vulkan/libVulkan.cpp +++ b/src/Vulkan/libVulkan.cpp
@@ -326,6 +326,8 @@ { { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_SURFACE_SPEC_VERSION } }, { { VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION } }, { { VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, VK_KHR_GET_SURFACE_CAPABILITIES_2_SPEC_VERSION } }, + // Used by ANGLE to properly advertise the supported list of EGL configs. + { { VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME, VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION } }, #endif #ifdef VK_USE_PLATFORM_XCB_KHR { { VK_KHR_XCB_SURFACE_EXTENSION_NAME, VK_KHR_XCB_SURFACE_SPEC_VERSION }, [] { return vk::XcbSurfaceKHR::isSupported(); } }, @@ -4738,7 +4740,15 @@ TRACE("(VkPhysicalDevice physicalDevice = %p, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo = %p, VkSurfaceCapabilities2KHR *pSurfaceCapabilities = %p)", physicalDevice, pSurfaceInfo, pSurfaceCapabilities); - return vk::Cast(pSurfaceInfo->surface)->getSurfaceCapabilities(pSurfaceInfo->pNext, &pSurfaceCapabilities->surfaceCapabilities, pSurfaceCapabilities->pNext); + if (pSurfaceInfo->surface != VK_NULL_HANDLE) + { + return vk::Cast(pSurfaceInfo->surface)->getSurfaceCapabilities(pSurfaceInfo->pNext, &pSurfaceCapabilities->surfaceCapabilities, pSurfaceCapabilities->pNext); + } + else + { + vk::SurfaceKHR::GetSurfacelessCapabilities(pSurfaceInfo->pNext, &pSurfaceCapabilities->surfaceCapabilities, pSurfaceCapabilities->pNext); + return VK_SUCCESS; + } } VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats) @@ -4748,13 +4758,13 @@ if(!pSurfaceFormats) { - *pSurfaceFormatCount = vk::Cast(surface)->getSurfaceFormatsCount(nullptr); + *pSurfaceFormatCount = vk::SurfaceKHR::GetSurfaceFormatsCount(nullptr); return VK_SUCCESS; } std::vector<VkSurfaceFormat2KHR> formats(*pSurfaceFormatCount); - VkResult result = vk::Cast(surface)->getSurfaceFormats(nullptr, pSurfaceFormatCount, formats.data()); + VkResult result = vk::SurfaceKHR::GetSurfaceFormats(nullptr, pSurfaceFormatCount, formats.data()); if(result == VK_SUCCESS || result == VK_INCOMPLETE) { @@ -4778,11 +4788,11 @@ if(!pSurfaceFormats) { - *pSurfaceFormatCount = vk::Cast(pSurfaceInfo->surface)->getSurfaceFormatsCount(pSurfaceInfo->pNext); + *pSurfaceFormatCount = vk::SurfaceKHR::GetSurfaceFormatsCount(pSurfaceInfo->pNext); return VK_SUCCESS; } - return vk::Cast(pSurfaceInfo->surface)->getSurfaceFormats(pSurfaceInfo->pNext, pSurfaceFormatCount, pSurfaceFormats); + return vk::SurfaceKHR::GetSurfaceFormats(pSurfaceInfo->pNext, pSurfaceFormatCount, pSurfaceFormats); } VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) @@ -4792,11 +4802,11 @@ if(!pPresentModes) { - *pPresentModeCount = vk::Cast(surface)->getPresentModeCount(); + *pPresentModeCount = vk::SurfaceKHR::GetPresentModeCount(); return VK_SUCCESS; } - return vk::Cast(surface)->getPresentModes(pPresentModeCount, pPresentModes); + return vk::SurfaceKHR::GetPresentModes(pPresentModeCount, pPresentModes); } VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain)
diff --git a/src/WSI/DirectFBSurfaceEXT.cpp b/src/WSI/DirectFBSurfaceEXT.cpp index 3f661a5..79bb386 100644 --- a/src/WSI/DirectFBSurfaceEXT.cpp +++ b/src/WSI/DirectFBSurfaceEXT.cpp
@@ -44,7 +44,7 @@ pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->maxImageExtent = extent; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/DisplaySurfaceKHR.cpp b/src/WSI/DisplaySurfaceKHR.cpp index 71d7f21..2bafa01 100644 --- a/src/WSI/DisplaySurfaceKHR.cpp +++ b/src/WSI/DisplaySurfaceKHR.cpp
@@ -282,7 +282,7 @@ pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->maxImageExtent = extent; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/HeadlessSurfaceKHR.cpp b/src/WSI/HeadlessSurfaceKHR.cpp index a3d46ea..e6ad705 100644 --- a/src/WSI/HeadlessSurfaceKHR.cpp +++ b/src/WSI/HeadlessSurfaceKHR.cpp
@@ -35,7 +35,7 @@ pSurfaceCapabilities->minImageExtent = { 0, 0 }; pSurfaceCapabilities->maxImageExtent = { 3840, 2160 }; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/MetalSurface.mm b/src/WSI/MetalSurface.mm index 83d3bf7..57a7b71 100644 --- a/src/WSI/MetalSurface.mm +++ b/src/WSI/MetalSurface.mm
@@ -158,7 +158,7 @@ pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->maxImageExtent = extent; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/VkSurfaceKHR.cpp b/src/WSI/VkSurfaceKHR.cpp index 09dac10..699845e 100644 --- a/src/WSI/VkSurfaceKHR.cpp +++ b/src/WSI/VkSurfaceKHR.cpp
@@ -95,14 +95,14 @@ return image ? static_cast<VkImage>(*image) : VkImage({ VK_NULL_HANDLE }); } -uint32_t SurfaceKHR::getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const +uint32_t SurfaceKHR::GetSurfaceFormatsCount(const void *pSurfaceInfoPNext) { return static_cast<uint32_t>(sizeof(surfaceFormats) / sizeof(surfaceFormats[0])); } -VkResult SurfaceKHR::getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const +VkResult SurfaceKHR::GetSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) { - uint32_t count = getSurfaceFormatsCount(pSurfaceInfoPNext); + uint32_t count = GetSurfaceFormatsCount(pSurfaceInfoPNext); uint32_t i; for(i = 0; i < std::min(*pSurfaceFormatCount, count); i++) @@ -120,14 +120,14 @@ return VK_SUCCESS; } -uint32_t SurfaceKHR::getPresentModeCount() const +uint32_t SurfaceKHR::GetPresentModeCount() { return static_cast<uint32_t>(sizeof(presentModes) / sizeof(presentModes[0])); } -VkResult SurfaceKHR::getPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) const +VkResult SurfaceKHR::GetPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) { - uint32_t count = getPresentModeCount(); + uint32_t count = GetPresentModeCount(); uint32_t i; for(i = 0; i < std::min(*pPresentModeCount, count); i++) @@ -183,7 +183,26 @@ return VK_SUCCESS; } -void SurfaceKHR::setCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) +void SurfaceKHR::GetSurfacelessCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) +{ + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + + // When the surface is VK_NULL_HANDLE (with VK_GOOGLE_surfaceless_query), the following + // cannot be calculated and must have assigned values as below. + pSurfaceCapabilities->minImageCount = 0xFFFFFFFF; + pSurfaceCapabilities->maxImageCount = 0xFFFFFFFF; + pSurfaceCapabilities->currentExtent = { 0xFFFFFFFF, 0xFFFFFFFF }; + pSurfaceCapabilities->currentTransform = VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR; + + // The following values depend on the surface as well, initialize them with something + // reasonable despite VK_GOOGLE_surfaceless_query not mentioning that they are not correct + // when surfaceless. This was missed when developing VK_GOOGLE_surfaceless_query because + // Android always sets the following min/max extents regardless of the surface. + pSurfaceCapabilities->minImageExtent = { 1, 1 }; + pSurfaceCapabilities->maxImageExtent = { 4096, 4096 }; +} + +void SurfaceKHR::SetCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) { pSurfaceCapabilities->minImageCount = 1; pSurfaceCapabilities->maxImageCount = 0;
diff --git a/src/WSI/VkSurfaceKHR.hpp b/src/WSI/VkSurfaceKHR.hpp index a80de67..e9d7480 100644 --- a/src/WSI/VkSurfaceKHR.hpp +++ b/src/WSI/VkSurfaceKHR.hpp
@@ -78,12 +78,13 @@ virtual void destroySurface(const VkAllocationCallbacks *pAllocator) = 0; virtual VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const = 0; + static void GetSurfacelessCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext); - uint32_t getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const; - VkResult getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const; + static uint32_t GetSurfaceFormatsCount(const void *pSurfaceInfoPNext); + static VkResult GetSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats); - uint32_t getPresentModeCount() const; - VkResult getPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) const; + static uint32_t GetPresentModeCount(); + static VkResult GetPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes); VkResult getPresentRectangles(uint32_t *pRectCount, VkRect2D *pRects) const; @@ -98,7 +99,7 @@ bool hasAssociatedSwapchain(); protected: - static void setCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext); + static void SetCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext); private: SwapchainKHR *associatedSwapchain = nullptr;
diff --git a/src/WSI/WaylandSurfaceKHR.cpp b/src/WSI/WaylandSurfaceKHR.cpp index 5a7e7c0..c2da3ae 100644 --- a/src/WSI/WaylandSurfaceKHR.cpp +++ b/src/WSI/WaylandSurfaceKHR.cpp
@@ -68,7 +68,7 @@ pSurfaceCapabilities->minImageExtent = { 1, 1 }; pSurfaceCapabilities->maxImageExtent = { 0xFFFFFFFF, 0xFFFFFFFF }; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/Win32SurfaceKHR.cpp b/src/WSI/Win32SurfaceKHR.cpp index f4537c8..33a5da2 100644 --- a/src/WSI/Win32SurfaceKHR.cpp +++ b/src/WSI/Win32SurfaceKHR.cpp
@@ -63,7 +63,7 @@ pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->maxImageExtent = extent; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }
diff --git a/src/WSI/XcbSurfaceKHR.cpp b/src/WSI/XcbSurfaceKHR.cpp index 37e23df..79120be 100644 --- a/src/WSI/XcbSurfaceKHR.cpp +++ b/src/WSI/XcbSurfaceKHR.cpp
@@ -106,7 +106,7 @@ pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->maxImageExtent = extent; - setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); + SetCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext); return VK_SUCCESS; }