vkGetImageMemoryRequirements2 dedicated allocation

Allow vkGetImageMemoryRequirements2 to set data in the
VkMemoryDedicatedRequirements pNext structure, the same
way vkGetBufferMemoryRequirements2 already does.

Bug b/119620767

Change-Id: I4fb6bc29862eb01188ec1d2a05b4f6cc34629d8a
Tests: dEQP-VK.memory.mapping.dedicated_alloc.image.*
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28488
Tested-by: Alexis Hétu <sugoi@google.com>
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 39a9c68..10d0048 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -1884,9 +1884,29 @@
 	TRACE("(VkDevice device = 0x%X, const VkImageMemoryRequirementsInfo2* pInfo = 0x%X, VkMemoryRequirements2* pMemoryRequirements = 0x%X)",
 	      device, pInfo, pMemoryRequirements);
 
-	if(pInfo->pNext || pMemoryRequirements->pNext)
+	if(pInfo->pNext)
 	{
-		UNIMPLEMENTED("pInfo->pNext || pMemoryRequirements->pNext");
+		UNIMPLEMENTED("pInfo->pNext");
+	}
+
+	VkBaseOutStructure* extensionRequirements = reinterpret_cast<VkBaseOutStructure*>(pMemoryRequirements->pNext);
+	while(extensionRequirements)
+	{
+		switch(extensionRequirements->sType)
+		{
+		case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
+		{
+			auto& requirements = *reinterpret_cast<VkMemoryDedicatedRequirements*>(extensionRequirements);
+			requirements.prefersDedicatedAllocation = VK_FALSE;
+			requirements.requiresDedicatedAllocation = VK_FALSE;
+		}
+		break;
+		default:
+			UNIMPLEMENTED("extensionRequirements->sType");
+			break;
+		}
+
+		extensionRequirements = extensionRequirements->pNext;
 	}
 
 	vkGetImageMemoryRequirements(device, pInfo->image, &(pMemoryRequirements->memoryRequirements));