vkGetImageMemoryRequirements2 refactor
This CL moves vkGetImageMemoryRequirements2's internal logic from
libVulkan.cpp to VkImage.cpp, as it will also be required for
vkGetDeviceImageMemoryRequirements.
Bug: b/204502926
Change-Id: If0d92ae57655b5af0b1dbcef6dea9e3c8dc121ff
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/63292
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Commit-Queue: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp
index 1533e49..29dbd7e 100644
--- a/src/Vulkan/VkImage.cpp
+++ b/src/Vulkan/VkImage.cpp
@@ -232,6 +232,37 @@
return memoryRequirements;
}
+void Image::getMemoryRequirements(VkMemoryRequirements2* pMemoryRequirements) const
+{
+ 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);
+ device->getRequirements(requirements);
+#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
+ if(getSupportedExternalMemoryHandleTypes() == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+ {
+ requirements->prefersDedicatedAllocation = VK_TRUE;
+ requirements->requiresDedicatedAllocation = VK_TRUE;
+ }
+#endif
+ }
+ break;
+ default:
+ UNSUPPORTED("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
+ break;
+ }
+
+ extensionRequirements = extensionRequirements->pNext;
+ }
+
+ pMemoryRequirements->memoryRequirements = getMemoryRequirements();
+}
+
size_t Image::getSizeInBytes(const VkImageSubresourceRange &subresourceRange) const
{
size_t size = 0;
diff --git a/src/Vulkan/VkImage.hpp b/src/Vulkan/VkImage.hpp
index 75d22cd..34a50f9 100644
--- a/src/Vulkan/VkImage.hpp
+++ b/src/Vulkan/VkImage.hpp
@@ -56,6 +56,7 @@
static size_t ComputeRequiredAllocationSize(const VkImageCreateInfo *pCreateInfo);
const VkMemoryRequirements getMemoryRequirements() const;
+ void getMemoryRequirements(VkMemoryRequirements2 *pMemoryRequirements) const;
size_t getSizeInBytes(const VkImageSubresourceRange &subresourceRange) const;
void getSubresourceLayout(const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) const;
void bind(DeviceMemory *pDeviceMemory, VkDeviceSize pMemoryOffset);
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index c5837ad..092b05f 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -3346,33 +3346,7 @@
extInfo = extInfo->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);
- vk::Cast(device)->getRequirements(requirements);
-#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
- if(vk::Cast(pInfo->image)->getSupportedExternalMemoryHandleTypes() == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
- {
- requirements->prefersDedicatedAllocation = VK_TRUE;
- requirements->requiresDedicatedAllocation = VK_TRUE;
- }
-#endif
- }
- break;
- default:
- UNSUPPORTED("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType).c_str());
- break;
- }
-
- extensionRequirements = extensionRequirements->pNext;
- }
-
- vkGetImageMemoryRequirements(device, pInfo->image, &(pMemoryRequirements->memoryRequirements));
+ vk::Cast(pInfo->image)->getMemoryRequirements(pMemoryRequirements);
}
VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2(VkDevice device, const VkBufferMemoryRequirementsInfo2 *pInfo, VkMemoryRequirements2 *pMemoryRequirements)