Add missing vkGetPhysicalDevicePresentRectanglesKHR function

This wasn't ever called by previous versions of deqp.

Test: dEQP-VK.wsi.xlib.surface.query_devgroup_present_modes
Bug: b/140182247
Change-Id: Id77bdc726681922b99f3fa8d098cad7853293d29
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/35648
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index c8e5ace..06a8cc9 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -87,6 +87,7 @@
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
+	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
 #endif
 #ifdef VK_USE_PLATFORM_XLIB_KHR
 	// VK_KHR_xlib_surface
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 4a71cc5..e4d7698 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -2852,6 +2852,15 @@
 	return VK_SUCCESS;
 }
 
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects)
+{
+	TRACE("(VkPhysicalDevice physicalDevice = %p, VkSurfaceKHR surface = %p, uint32_t* pRectCount = %p, VkRect2D* pRects = %p)",
+			physicalDevice, static_cast<void*>(surface), pRectCount, pRects);
+
+	return vk::Cast(surface)->getPresentRectangles(pRectCount, pRects);
+}
+
+
 #endif    // ! __ANDROID__
 
 #ifdef __ANDROID__
diff --git a/src/WSI/VkSurfaceKHR.cpp b/src/WSI/VkSurfaceKHR.cpp
index 18447ac..a9d2bd9 100644
--- a/src/WSI/VkSurfaceKHR.cpp
+++ b/src/WSI/VkSurfaceKHR.cpp
@@ -186,4 +186,27 @@
 	return (associatedSwapchain != nullptr);
 }
 
+VkResult SurfaceKHR::getPresentRectangles(uint32_t *pRectCount, VkRect2D *pRects) const
+{
+	if (!pRects)
+	{
+		*pRectCount = 1;
+		return VK_SUCCESS;
+	}
+
+	if (*pRectCount < 1)
+	{
+		return VK_INCOMPLETE;
+	}
+
+	VkSurfaceCapabilitiesKHR capabilities;
+	getSurfaceCapabilities(&capabilities);
+
+	pRects[0].offset = {0,0};
+	pRects[0].extent = capabilities.currentExtent;
+	*pRectCount = 1;
+
+	return VK_SUCCESS;
+}
+
 }
\ No newline at end of file
diff --git a/src/WSI/VkSurfaceKHR.hpp b/src/WSI/VkSurfaceKHR.hpp
index 2badec7..48f25ce 100644
--- a/src/WSI/VkSurfaceKHR.hpp
+++ b/src/WSI/VkSurfaceKHR.hpp
@@ -86,6 +86,8 @@
 	uint32_t getPresentModeCount() const;
 	VkResult getPresentModes(uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes) const;
 
+	VkResult getPresentRectangles(uint32_t *pRectCount, VkRect2D *pRects) const;
+
 	virtual void attachImage(PresentImage* image) = 0;
 	virtual void detachImage(PresentImage* image) = 0;
 	virtual void present(PresentImage* image) = 0;