Fix creating Buffer objects in VK_SHARING_MODE_EXCLUSIVE mode
queueFamilyIndices are only valid in VK_SHARING_MODE_CONCURRENT mode,
so Buffers were copying garbage in VK_SHARING_MODE_EXCLUSIVE mode.
This cl allows dEQP-VK.robustness.* tests to run and fail rather than
immediately crash at Buffer construction time.
Bug b/118383648
Tests: dEQP-VK.robustness.*
Change-Id: I5b82348317e12302359e082088ed5d10f6367e0e
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28311
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkBuffer.cpp b/src/Vulkan/VkBuffer.cpp
index 7679553..9691fd3 100644
--- a/src/Vulkan/VkBuffer.cpp
+++ b/src/Vulkan/VkBuffer.cpp
@@ -25,11 +25,14 @@
Buffer::Buffer(const VkBufferCreateInfo* pCreateInfo, void* mem) :
flags(pCreateInfo->flags), size(pCreateInfo->size), usage(pCreateInfo->usage),
- sharingMode(pCreateInfo->sharingMode), queueFamilyIndexCount(pCreateInfo->queueFamilyIndexCount),
- queueFamilyIndices(reinterpret_cast<uint32_t*>(mem))
+ sharingMode(pCreateInfo->sharingMode)
{
- size_t queueFamilyIndicesSize = sizeof(uint32_t) * queueFamilyIndexCount;
- memcpy(queueFamilyIndices, pCreateInfo->pQueueFamilyIndices, queueFamilyIndicesSize);
+ if(pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT)
+ {
+ queueFamilyIndexCount = pCreateInfo->queueFamilyIndexCount;
+ queueFamilyIndices = reinterpret_cast<uint32_t*>(mem);
+ memcpy(queueFamilyIndices, pCreateInfo->pQueueFamilyIndices, sizeof(uint32_t) * queueFamilyIndexCount);
+ }
}
void Buffer::destroy(const VkAllocationCallbacks* pAllocator)
@@ -39,7 +42,7 @@
size_t Buffer::ComputeRequiredAllocationSize(const VkBufferCreateInfo* pCreateInfo)
{
- return sizeof(uint32_t) * pCreateInfo->queueFamilyIndexCount;
+ return (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) ? sizeof(uint32_t) * pCreateInfo->queueFamilyIndexCount : 0;
}
const VkMemoryRequirements Buffer::getMemoryRequirements() const