Fix incorrect staging buffer size calculation

The dEQP-VK.api.image_clearing.* tests use a staging buffer to
pre-clear the images to a known value before each test. The size
of this buffer was previously determined by taking the size from the
VkMemoryRequirements obtained for the image. This fails if the size
required to store the image is less than the size required to store
the raw texel data in the buffer, which is later to be copied into
the image. This commit changes that and instead computes the size
of the staging buffer based on image extent, format and number of
layers.

Affects:
dEQP-VK.api.image_clearing.*

Components: Vulkan

VK-GL-CTS issue: 3809

Change-Id: I2b74697d54e11ddd7598299d57d02205bd2571d5
diff --git a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
index b97ba82..6a78792 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
@@ -498,7 +498,7 @@
 	void								submitCommandBuffer				(void) const;
 	void								beginRenderPass					(VkSubpassContents content, VkClearValue clearValue) const;
 	void								preClearImage					(const deUint32 imageMipLevels, VkExtent3D imageExtent, deUint32 imageLayerCount, Unique<VkCommandBuffer>& commandBuffer) const;
-	Move<VkBuffer>						createImageClearingBuffer		(const DeviceInterface& vkd, const VkDevice device, Unique<VkImage>& image);
+	Move<VkBuffer>						createImageClearingBuffer		(const DeviceInterface& vkd, const VkDevice device);
 
 	void								pipelineImageBarrier			(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspectMask = 0u) const;
 	de::MovePtr<TextureLevelPyramid>	readImage						(VkImageAspectFlags aspectMask, deUint32 baseLayer) const;
@@ -578,7 +578,7 @@
 											 params.imageLayerCount,
 											 m_imageUsageFlags))
 
-	, m_stagingBuffer			(createImageClearingBuffer(m_vkd, m_device,  m_image))
+	, m_stagingBuffer			(createImageClearingBuffer(m_vkd, m_device))
 	, m_stagingBufferMemory		(allocateAndBindBufferMemory(*m_stagingBuffer))
 
 	, m_imageMemory				(allocateAndBindImageMemory(*m_image))
@@ -1311,11 +1311,12 @@
 	return TestStatus::pass(successMessage);
 }
 
-Move<VkBuffer> ImageClearingTestInstance::createImageClearingBuffer(const DeviceInterface& vkd, const VkDevice device, Unique<VkImage>& image)
+Move<VkBuffer> ImageClearingTestInstance::createImageClearingBuffer(const DeviceInterface& vkd, const VkDevice device)
 {
 	Move<VkBuffer>							stagingBuffer;
 	de::MovePtr<Allocation>					stagingBufferAlloc;
-	const VkDeviceSize stagingBufferSize	= getImageMemoryRequirements(vkd, device, *image).size;
+	const VkDeviceSize stagingBufferSize	= m_params.imageExtent.width * m_params.imageExtent.height * m_params.imageExtent.depth
+											  * getPixelSize(mapVkFormat(m_params.imageFormat)) * m_params.imageLayerCount;
 	// Create image clearing buffer
 	{
 		const VkBufferCreateInfo   bufferParams   =