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
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									createBuffer						(Move<VkBuffer>&		buffer,
 																			 Move<VkDeviceMemory>&	memory,
 																			 Context&				ctx,
-																			 BindingCaseParameters	params)
+																			 BindingCaseParameters	params,
+																			 VkDeviceSize*			memorySize)
 {
 	const DeviceInterface&				vk									= ctx.getDeviceInterface();
 	const VkDevice						vkDevice							= ctx.getDevice();
@@ -783,6 +784,7 @@
 
 	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									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<deUint8*>(hostMemory.ptr());
 	SimpleRandomGenerator				random								(dataSeed);
 
-	for (deUint32 i = 0u; i < params.bufferSize; ++i)
+	for (deUint32 i = 0u; i < size; ++i)
 	{
 		hostBuffer[i] = static_cast<deUint8>(random.getNext() & 0xFFu);
 	}
@@ -813,11 +815,12 @@
 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<deUint8*>(hostMemory.ptr());
 	SimpleRandomGenerator				random								(dataSeed);
 
@@ -844,6 +847,10 @@
 
 	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<de::SharedPtr<Move<TTarget> > >
 										targets;
 		MemoryRegionsList				memory;
@@ -854,21 +861,23 @@
 
 		Move<VkBuffer>					srcBuffer;
 		Move<VkDeviceMemory>			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<VkBuffer>					dstBuffer;
 		Move<VkDeviceMemory>			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 @@
 
 	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<de::SharedPtr<Move<TTarget> > >
 										targets[2];
 		MemoryRegionsList				memory;
@@ -902,14 +915,16 @@
 
 		Move<VkBuffer>					srcBuffer;
 		Move<VkDeviceMemory>			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<VkBuffer>					dstBuffer;
 		Move<VkDeviceMemory>			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 @@
 			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");