de::MovePtr<Image> m_imageSrc; // source image
SharedVkImageView m_imageSrcView;
+ VkDeviceSize m_imageSrcSize;
de::MovePtr<Image> m_imageDst; // dest image
SharedVkImageView m_imageDstView;
VkFormat m_imageDstFormat;
+ VkDeviceSize m_imageDstSize;
de::MovePtr<Buffer> m_buffer; // result buffer
- VkDeviceSize m_bufferSizeBytes;
Move<VkDescriptorSetLayout> m_descriptorSetLayout;
Move<VkDescriptorPool> m_descriptorPool;
MemoryRequirement::Any));
// Create destination image
- m_bufferSizeBytes = width * height * tcu::getPixelSize(textureFormat);
m_imageDstFormat = m_isSigned ? VK_FORMAT_R32G32B32A32_SINT : VK_FORMAT_R32G32B32A32_UINT;
m_imageDst = de::MovePtr<Image>(new Image(
vk, device, allocator,
makeImageCreateInfo(m_texture, m_imageDstFormat, VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0u),
MemoryRequirement::Any));
+ // Compute image and buffer sizes
+ m_imageSrcSize = width * height * tcu::getPixelSize(textureFormat);
+ m_imageDstSize = width * height * tcu::getPixelSize(mapVkFormat(m_imageDstFormat));
+ VkDeviceSize bufferSizeBytes = de::max(m_imageSrcSize, m_imageDstSize);
+
// Create helper buffer able to store input data and image write result
m_buffer = de::MovePtr<Buffer>(new Buffer(
vk, device, allocator,
- makeBufferCreateInfo(m_bufferSizeBytes, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT),
+ makeBufferCreateInfo(bufferSizeBytes, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT),
MemoryRequirement::HostVisible));
const Allocation& alloc = m_buffer->getAllocation();
- deMemcpy(alloc.getHostPtr(), m_inputImageData.getAccess().getDataPtr(), static_cast<size_t>(m_bufferSizeBytes));
+ deMemcpy(alloc.getHostPtr(), m_inputImageData.getAccess().getDataPtr(), static_cast<size_t>(m_imageSrcSize));
flushAlloc(vk, device, alloc);
}
const VkBufferMemoryBarrier barrierFlushHostWriteBeforeCopy = makeBufferMemoryBarrier(
VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
- m_buffer->get(), 0ull, m_bufferSizeBytes);
+ m_buffer->get(), 0ull, m_imageSrcSize);
vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT,
(VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &barrierFlushHostWriteBeforeCopy, DE_LENGTH_OF_ARRAY(preCopyImageBarriers), preCopyImageBarriers);
void ImageExtendOperandTestInstance::commandAfterCompute (const VkCommandBuffer cmdBuffer)
{
- commandCopyImageToBuffer(m_context, cmdBuffer, m_imageDst->get(), m_buffer->get(), m_bufferSizeBytes, m_texture);
+ commandCopyImageToBuffer(m_context, cmdBuffer, m_imageDst->get(), m_buffer->get(), m_imageDstSize, m_texture);
}
tcu::TestStatus ImageExtendOperandTestInstance::verifyResult (void)