Support VK_KHR_get_surface_capabilities2

This extension makes vkGetPhysicalDeviceSurfaceCapabilitiesKHR and
vkGetPhysicalDeviceSurfaceFormatsKHR extensible by adding version 2 of
these functions that take structs with pNext.

Tests: dEQP-VK.wsi.*.surface.query_capabilities
Tests: dEQP-VK.wsi.*.surface.query_capabilities2
Tests: dEQP-VK.wsi.*.surface.query_formats
Tests: dEQP-VK.wsi.*.surface.query_formats2
Bug: b/255180903
Change-Id: Ia44936aed80569943185f235640228b49e85f9dd
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/69248
Presubmit-Ready: Shahbaz Youssefi <syoussefi@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@google.com>
Tested-by: Shahbaz Youssefi <syoussefi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index c34ffac..0a88948 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -113,6 +113,9 @@
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
+	// VK_KHR_get_surface_capabilities2
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR),
 #endif
 #ifdef VK_USE_PLATFORM_XCB_KHR
 	// VK_KHR_Xcb_surface
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index fac1931..da2c44d 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -286,6 +286,7 @@
 	{ { VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME, VK_EXT_HEADLESS_SURFACE_SPEC_VERSION } },
 #ifndef __ANDROID__
 	{ { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_SURFACE_SPEC_VERSION } },
+	{ { VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, VK_KHR_GET_SURFACE_CAPABILITIES_2_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(); } },
@@ -4606,7 +4607,15 @@
 	TRACE("(VkPhysicalDevice physicalDevice = %p, VkSurfaceKHR surface = %p, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities = %p)",
 	      physicalDevice, static_cast<void *>(surface), pSurfaceCapabilities);
 
-	return vk::Cast(surface)->getSurfaceCapabilities(pSurfaceCapabilities);
+	return vk::Cast(surface)->getSurfaceCapabilities(nullptr, pSurfaceCapabilities, nullptr);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
+{
+	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);
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats)
@@ -4616,11 +4625,41 @@
 
 	if(!pSurfaceFormats)
 	{
-		*pSurfaceFormatCount = vk::Cast(surface)->getSurfaceFormatsCount();
+		*pSurfaceFormatCount = vk::Cast(surface)->getSurfaceFormatsCount(nullptr);
 		return VK_SUCCESS;
 	}
 
-	return vk::Cast(surface)->getSurfaceFormats(pSurfaceFormatCount, pSurfaceFormats);
+	std::vector<VkSurfaceFormat2KHR> formats(*pSurfaceFormatCount);
+
+	VkResult result = vk::Cast(surface)->getSurfaceFormats(nullptr, pSurfaceFormatCount, formats.data());
+
+	if(result == VK_SUCCESS || result == VK_INCOMPLETE)
+	{
+		// The value returned in pSurfaceFormatCount is either capped at the original value,
+		// or is smaller because there aren't that many formats.
+		ASSERT(*pSurfaceFormatCount <= formats.size());
+
+		for(size_t i = 0; i < *pSurfaceFormatCount; ++i)
+		{
+			pSurfaceFormats[i] = formats[i].surfaceFormat;
+		}
+	}
+
+	return result;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats)
+{
+	TRACE("(VkPhysicalDevice physicalDevice = %p, VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo = %p. uint32_t* pSurfaceFormatCount = %p, VkSurfaceFormat2KHR* pSurfaceFormats = %p)",
+	      physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
+
+	if(!pSurfaceFormats)
+	{
+		*pSurfaceFormatCount = vk::Cast(pSurfaceInfo->surface)->getSurfaceFormatsCount(pSurfaceInfo->pNext);
+		return VK_SUCCESS;
+	}
+
+	return vk::Cast(pSurfaceInfo->surface)->getSurfaceFormats(pSurfaceInfo->pNext, pSurfaceFormatCount, pSurfaceFormats);
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes)
diff --git a/src/Vulkan/vk_swiftshader.def b/src/Vulkan/vk_swiftshader.def
index 300cf29..640a9f5 100644
--- a/src/Vulkan/vk_swiftshader.def
+++ b/src/Vulkan/vk_swiftshader.def
@@ -148,8 +148,8 @@
 	vkGetPhysicalDeviceSurfaceFormatsKHR

 

 	; VK_KHR_get_surface_capabilities2

-	;vkGetPhysicalDeviceSurfaceCapabilities2KHR

-	;vkGetPhysicalDeviceSurfaceFormats2KHR

+	vkGetPhysicalDeviceSurfaceCapabilities2KHR

+	vkGetPhysicalDeviceSurfaceFormats2KHR

 

 	; VK_KHR_surface

 	vkGetPhysicalDeviceSurfacePresentModesKHR

@@ -268,4 +268,4 @@
 	vkGetPhysicalDeviceToolProperties

 	vkGetPrivateData

 	vkQueueSubmit2

-	vkSetPrivateData
\ No newline at end of file
+	vkSetPrivateData

diff --git a/src/Vulkan/vk_swiftshader.lds b/src/Vulkan/vk_swiftshader.lds
index 4b965c7..8652471 100644
--- a/src/Vulkan/vk_swiftshader.lds
+++ b/src/Vulkan/vk_swiftshader.lds
@@ -148,8 +148,8 @@
 	vkGetPhysicalDeviceSurfaceFormatsKHR;
 
 	# VK_KHR_get_surface_capabilities2
-	#vkGetPhysicalDeviceSurfaceCapabilities2KHR;
-	#vkGetPhysicalDeviceSurfaceFormats2KHR;
+	vkGetPhysicalDeviceSurfaceCapabilities2KHR;
+	vkGetPhysicalDeviceSurfaceFormats2KHR;
 
 	# VK_KHR_surface
 	vkGetPhysicalDeviceSurfacePresentModesKHR;
diff --git a/src/WSI/DirectFBSurfaceEXT.cpp b/src/WSI/DirectFBSurfaceEXT.cpp
index 788161c..c66d736 100644
--- a/src/WSI/DirectFBSurfaceEXT.cpp
+++ b/src/WSI/DirectFBSurfaceEXT.cpp
@@ -34,9 +34,9 @@
 	return 0;
 }
 
-VkResult DirectFBSurfaceEXT::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult DirectFBSurfaceEXT::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 
 	int width, height;
 	surface->GetSize(surface, &width, &height);
diff --git a/src/WSI/DirectFBSurfaceEXT.hpp b/src/WSI/DirectFBSurfaceEXT.hpp
index cceab0c..c83d6ff 100644
--- a/src/WSI/DirectFBSurfaceEXT.hpp
+++ b/src/WSI/DirectFBSurfaceEXT.hpp
@@ -34,7 +34,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const VkDirectFBSurfaceCreateInfoEXT *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void attachImage(PresentImage *image) override;
 	virtual void detachImage(PresentImage *image) override;
diff --git a/src/WSI/DisplaySurfaceKHR.cpp b/src/WSI/DisplaySurfaceKHR.cpp
index b54563d..8d05bc1 100644
--- a/src/WSI/DisplaySurfaceKHR.cpp
+++ b/src/WSI/DisplaySurfaceKHR.cpp
@@ -274,9 +274,9 @@
 	return 0;
 }
 
-VkResult DisplaySurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult DisplaySurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 
 	VkExtent2D extent = { width, height };
 
diff --git a/src/WSI/DisplaySurfaceKHR.hpp b/src/WSI/DisplaySurfaceKHR.hpp
index 05a25eb..f007b9d 100644
--- a/src/WSI/DisplaySurfaceKHR.hpp
+++ b/src/WSI/DisplaySurfaceKHR.hpp
@@ -37,7 +37,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const VkDisplaySurfaceCreateInfoKHR *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void attachImage(PresentImage *image) override;
 	virtual void detachImage(PresentImage *image) override;
diff --git a/src/WSI/HeadlessSurfaceKHR.cpp b/src/WSI/HeadlessSurfaceKHR.cpp
index 57e488f..9de6c96 100644
--- a/src/WSI/HeadlessSurfaceKHR.cpp
+++ b/src/WSI/HeadlessSurfaceKHR.cpp
@@ -29,9 +29,9 @@
 {
 }
 
-VkResult HeadlessSurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult HeadlessSurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 	pSurfaceCapabilities->currentExtent = { 1280, 720 };
 	pSurfaceCapabilities->minImageExtent = { 0, 0 };
 	pSurfaceCapabilities->maxImageExtent = { 3840, 2160 };
@@ -51,4 +51,4 @@
 	return VK_SUCCESS;
 }
 
-}  // namespace vk
\ No newline at end of file
+}  // namespace vk
diff --git a/src/WSI/HeadlessSurfaceKHR.hpp b/src/WSI/HeadlessSurfaceKHR.hpp
index 395b144..5232219 100644
--- a/src/WSI/HeadlessSurfaceKHR.hpp
+++ b/src/WSI/HeadlessSurfaceKHR.hpp
@@ -27,7 +27,7 @@
 	static size_t ComputeRequiredAllocationSize(const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo);
 
 	void destroySurface(const VkAllocationCallbacks *pAllocator) override;
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 	void attachImage(PresentImage *image) override;
 	void detachImage(PresentImage *image) override;
 	VkResult present(PresentImage *image) override;
diff --git a/src/WSI/MetalSurface.hpp b/src/WSI/MetalSurface.hpp
index 0e2229d..92d4ed4 100644
--- a/src/WSI/MetalSurface.hpp
+++ b/src/WSI/MetalSurface.hpp
@@ -38,7 +38,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const void *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void attachImage(PresentImage *image) override {}
 	virtual void detachImage(PresentImage *image) override {}
diff --git a/src/WSI/MetalSurface.mm b/src/WSI/MetalSurface.mm
index 563618c..5d65f9b 100644
--- a/src/WSI/MetalSurface.mm
+++ b/src/WSI/MetalSurface.mm
@@ -144,9 +144,13 @@
     return sizeof(MetalLayer);
 }
 
-VkResult MetalSurface::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const API_AVAILABLE(macosx(10.11))
+VkResult MetalSurface::getSurfaceCapabilities(const void *pSurfaceInfoPNext,
+                                              VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
+                                              void *pSurfaceCapabilitiesPNext) const
+    API_AVAILABLE(macosx(10.11))
 {
-    setCommonSurfaceCapabilities(pSurfaceCapabilities);
+    setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities,
+                                 pSurfaceCapabilitiesPNext);
 
     // The value of drawableSize in CAMetalLayer is set the first time a drawable is queried but after that it is the
     // (Metal) application's responsibility to resize the drawable when the window is resized. The best time for Swiftshader
diff --git a/src/WSI/VkSurfaceKHR.cpp b/src/WSI/VkSurfaceKHR.cpp
index 1df3d41..07fcdb6 100644
--- a/src/WSI/VkSurfaceKHR.cpp
+++ b/src/WSI/VkSurfaceKHR.cpp
@@ -94,19 +94,19 @@
 	return image ? static_cast<VkImage>(*image) : VkImage({ VK_NULL_HANDLE });
 }
 
-uint32_t SurfaceKHR::getSurfaceFormatsCount() const
+uint32_t SurfaceKHR::getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const
 {
 	return static_cast<uint32_t>(sizeof(surfaceFormats) / sizeof(surfaceFormats[0]));
 }
 
-VkResult SurfaceKHR::getSurfaceFormats(uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats) const
+VkResult SurfaceKHR::getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const
 {
-	uint32_t count = getSurfaceFormatsCount();
+	uint32_t count = getSurfaceFormatsCount(pSurfaceInfoPNext);
 
 	uint32_t i;
 	for(i = 0; i < std::min(*pSurfaceFormatCount, count); i++)
 	{
-		pSurfaceFormats[i] = surfaceFormats[i];
+		pSurfaceFormats[i].surfaceFormat = surfaceFormats[i];
 	}
 
 	*pSurfaceFormatCount = i;
@@ -173,7 +173,7 @@
 	}
 
 	VkSurfaceCapabilitiesKHR capabilities;
-	getSurfaceCapabilities(&capabilities);
+	getSurfaceCapabilities(nullptr, &capabilities, nullptr);
 
 	pRects[0].offset = { 0, 0 };
 	pRects[0].extent = capabilities.currentExtent;
@@ -182,7 +182,7 @@
 	return VK_SUCCESS;
 }
 
-void SurfaceKHR::setCommonSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
+void SurfaceKHR::setCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext)
 {
 	pSurfaceCapabilities->minImageCount = 1;
 	pSurfaceCapabilities->maxImageCount = 0;
@@ -201,4 +201,4 @@
 	    VK_IMAGE_USAGE_STORAGE_BIT;
 }
 
-}  // namespace vk
\ No newline at end of file
+}  // namespace vk
diff --git a/src/WSI/VkSurfaceKHR.hpp b/src/WSI/VkSurfaceKHR.hpp
index 204db71..a80de67 100644
--- a/src/WSI/VkSurfaceKHR.hpp
+++ b/src/WSI/VkSurfaceKHR.hpp
@@ -77,10 +77,10 @@
 
 	virtual void destroySurface(const VkAllocationCallbacks *pAllocator) = 0;
 
-	virtual VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const = 0;
+	virtual VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const = 0;
 
-	uint32_t getSurfaceFormatsCount() const;
-	VkResult getSurfaceFormats(uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats) const;
+	uint32_t getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const;
+	VkResult getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const;
 
 	uint32_t getPresentModeCount() const;
 	VkResult getPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) const;
@@ -98,7 +98,7 @@
 	bool hasAssociatedSwapchain();
 
 protected:
-	static void setCommonSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities);
+	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 9ecf2dc..ff3a373 100644
--- a/src/WSI/WaylandSurfaceKHR.cpp
+++ b/src/WSI/WaylandSurfaceKHR.cpp
@@ -62,9 +62,9 @@
 	return 0;
 }
 
-VkResult WaylandSurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult WaylandSurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 
 	pSurfaceCapabilities->currentExtent = { 0xFFFFFFFF, 0xFFFFFFFF };
 	pSurfaceCapabilities->minImageExtent = { 1, 1 };
diff --git a/src/WSI/WaylandSurfaceKHR.hpp b/src/WSI/WaylandSurfaceKHR.hpp
index 8c7c064..09119eb 100644
--- a/src/WSI/WaylandSurfaceKHR.hpp
+++ b/src/WSI/WaylandSurfaceKHR.hpp
@@ -41,7 +41,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const VkWaylandSurfaceCreateInfoKHR *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void attachImage(PresentImage *image) override;
 	virtual void detachImage(PresentImage *image) override;
diff --git a/src/WSI/Win32SurfaceKHR.cpp b/src/WSI/Win32SurfaceKHR.cpp
index 6c5a728..2a1c79a 100644
--- a/src/WSI/Win32SurfaceKHR.cpp
+++ b/src/WSI/Win32SurfaceKHR.cpp
@@ -55,9 +55,9 @@
 	return 0;
 }
 
-VkResult Win32SurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult Win32SurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 
 	VkExtent2D extent;
 	VkResult result = getWindowSize(hwnd, extent);
@@ -112,4 +112,4 @@
 	return VK_SUCCESS;
 }
 
-}  // namespace vk
\ No newline at end of file
+}  // namespace vk
diff --git a/src/WSI/Win32SurfaceKHR.hpp b/src/WSI/Win32SurfaceKHR.hpp
index 7d859b6..35b1b53 100644
--- a/src/WSI/Win32SurfaceKHR.hpp
+++ b/src/WSI/Win32SurfaceKHR.hpp
@@ -36,7 +36,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const VkWin32SurfaceCreateInfoKHR *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void attachImage(PresentImage *image) override;
 	virtual void detachImage(PresentImage *image) override;
diff --git a/src/WSI/XcbSurfaceKHR.cpp b/src/WSI/XcbSurfaceKHR.cpp
index 3af964b..6c2c9dc 100644
--- a/src/WSI/XcbSurfaceKHR.cpp
+++ b/src/WSI/XcbSurfaceKHR.cpp
@@ -87,14 +87,14 @@
 	return 0;
 }
 
-VkResult XcbSurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const
+VkResult XcbSurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
 {
 	if(surfaceLost)
 	{
 		return VK_ERROR_SURFACE_LOST_KHR;
 	}
 
-	setCommonSurfaceCapabilities(pSurfaceCapabilities);
+	setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
 
 	VkExtent2D extent;
 	int depth;
@@ -222,4 +222,4 @@
 	return VK_SUCCESS;
 }
 
-}  // namespace vk
\ No newline at end of file
+}  // namespace vk
diff --git a/src/WSI/XcbSurfaceKHR.hpp b/src/WSI/XcbSurfaceKHR.hpp
index eae9257..45e8f6f 100644
--- a/src/WSI/XcbSurfaceKHR.hpp
+++ b/src/WSI/XcbSurfaceKHR.hpp
@@ -37,7 +37,7 @@
 
 	static size_t ComputeRequiredAllocationSize(const VkXcbSurfaceCreateInfoKHR *pCreateInfo);
 
-	VkResult getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) const override;
+	VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const override;
 
 	virtual void *allocateImageMemory(PresentImage *image, const VkMemoryAllocateInfo &allocateInfo) override;
 	virtual void releaseImageMemory(PresentImage *image) override;