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;
}