From 2df7d386d30ca8d9359536d9379a6333456d34c2 Mon Sep 17 00:00:00 2001 From: ziga-lunarg Date: Tue, 20 Sep 2022 01:15:07 +0200 Subject: [PATCH] Check if buffer size is multiple of nonCoherentAtomSize When flushing memory range, if VK_WHOLE_SIZE is used, size must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize Components: Vulkan VK-GL-CTS issue: 3972 Affected tests: dEQP-VK.memory.binding.* Change-Id: If66e593f88af00450a55dfacc988df93ef6991eb --- .../vulkan/memory/vktMemoryBindingTests.cpp | 43 +++++++++++++++------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp index 15f085f..f2835de 100644 --- a/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp +++ b/external/vulkancts/modules/vulkan/memory/vktMemoryBindingTests.cpp @@ -774,7 +774,8 @@ void layoutTransitionResource (Move& target, void createBuffer (Move& buffer, Move& memory, Context& ctx, - BindingCaseParameters params) + BindingCaseParameters params, + VkDeviceSize* memorySize) { const DeviceInterface& vk = ctx.getDeviceInterface(); const VkDevice vkDevice = ctx.getDevice(); @@ -783,6 +784,7 @@ void createBuffer (Move& buffer, buffer = createBuffer(vk, vkDevice, &bufferParams); vk.getBufferMemoryRequirements(vkDevice, *buffer, &memReqs); + *memorySize = memReqs.size; const VkMemoryAllocateInfo memAlloc = makeMemoryAllocateInfo(ctx, memReqs, MemoryHostVisible); VkDeviceMemory rawMemory = DE_NULL; @@ -795,15 +797,15 @@ void createBuffer (Move& buffer, void pushData (VkDeviceMemory memory, deUint32 dataSeed, Context& ctx, - BindingCaseParameters params) + VkDeviceSize size) { const DeviceInterface& vk = ctx.getDeviceInterface(); const VkDevice vkDevice = ctx.getDevice(); - MemoryMappingRAII hostMemory (vk, vkDevice, memory, 0u, params.bufferSize, 0u); + MemoryMappingRAII hostMemory (vk, vkDevice, memory, 0u, size, 0u); deUint8* hostBuffer = static_cast(hostMemory.ptr()); SimpleRandomGenerator random (dataSeed); - for (deUint32 i = 0u; i < params.bufferSize; ++i) + for (deUint32 i = 0u; i < size; ++i) { hostBuffer[i] = static_cast(random.getNext() & 0xFFu); } @@ -813,11 +815,12 @@ void pushData (VkDeviceMemory memory, deBool checkData (VkDeviceMemory memory, deUint32 dataSeed, Context& ctx, - BindingCaseParameters params) + BindingCaseParameters params, + VkDeviceSize size) { const DeviceInterface& vk = ctx.getDeviceInterface(); const VkDevice vkDevice = ctx.getDevice(); - MemoryMappingRAII hostMemory (vk, vkDevice, memory, 0u, params.bufferSize, 0u); + MemoryMappingRAII hostMemory (vk, vkDevice, memory, 0u, size, 0u); deUint8* hostBuffer = static_cast(hostMemory.ptr()); SimpleRandomGenerator random (dataSeed); @@ -844,6 +847,10 @@ public: virtual tcu::TestStatus iterate (void) { + const InstanceInterface& vkInstance = m_context.getInstanceInterface(); + const VkPhysicalDevice vkPhysicalDevice = m_context.getPhysicalDevice(); + VkPhysicalDeviceProperties properties; + vkInstance.getPhysicalDeviceProperties(vkPhysicalDevice, &properties); std::vector > > targets; MemoryRegionsList memory; @@ -854,21 +861,23 @@ public: Move srcBuffer; Move srcMemory; + VkDeviceSize srcMemorySize; - createBuffer(srcBuffer, srcMemory, m_context, m_params); - pushData(*srcMemory, 1, m_context, m_params); + createBuffer(srcBuffer, srcMemory, m_context, m_params, &srcMemorySize); + pushData(*srcMemory, 1, m_context, srcMemorySize); Move dstBuffer; Move dstMemory; + VkDeviceSize dstMemorySize; - createBuffer(dstBuffer, dstMemory, m_context, m_params); + createBuffer(dstBuffer, dstMemory, m_context, m_params, &dstMemorySize); deBool passed = DE_TRUE; for (deUint32 i = 0; passed && i < m_params.targetsCount; ++i) { fillUpResource(srcBuffer, *targets[i], m_context, m_params); readUpResource(*targets[i], dstBuffer, m_context, m_params); - passed = checkData(*dstMemory, 1, m_context, m_params); + passed = checkData(*dstMemory, 1, m_context, m_params, dstMemorySize); } return passed ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Failed"); @@ -890,6 +899,10 @@ public: virtual tcu::TestStatus iterate (void) { + const InstanceInterface& vkInstance = m_context.getInstanceInterface(); + const VkPhysicalDevice vkPhysicalDevice = m_context.getPhysicalDevice(); + VkPhysicalDeviceProperties properties; + vkInstance.getPhysicalDeviceProperties(vkPhysicalDevice, &properties); std::vector > > targets[2]; MemoryRegionsList memory; @@ -902,14 +915,16 @@ public: Move srcBuffer; Move srcMemory; + VkDeviceSize srcMemorySize; - createBuffer(srcBuffer, srcMemory, m_context, m_params); - pushData(*srcMemory, 2, m_context, m_params); + createBuffer(srcBuffer, srcMemory, m_context, m_params, &srcMemorySize); + pushData(*srcMemory, 2, m_context, srcMemorySize); Move dstBuffer; Move dstMemory; + VkDeviceSize dstMemorySize; - createBuffer(dstBuffer, dstMemory, m_context, m_params); + createBuffer(dstBuffer, dstMemory, m_context, m_params, &dstMemorySize); deBool passed = DE_TRUE; for (deUint32 i = 0; passed && i < m_params.targetsCount; ++i) @@ -918,7 +933,7 @@ public: layoutTransitionResource(*(targets[1][i]), m_context); fillUpResource(srcBuffer, *(targets[0][i]), m_context, m_params); readUpResource(*(targets[1][i]), dstBuffer, m_context, m_params); - passed = checkData(*dstMemory, 2, m_context, m_params); + passed = checkData(*dstMemory, 2, m_context, m_params, dstMemorySize); } return passed ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Failed"); -- 2.7.4