1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and/or associated documentation files (the
10 * "Materials"), to deal in the Materials without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Materials, and to
13 * permit persons to whom the Materials are furnished to do so, subject to
14 * the following conditions:
16 * The above copyright notice(s) and this permission notice shall be included
17 * in all copies or substantial portions of the Materials.
19 * The Materials are Confidential Information as defined by the
20 * Khronos Membership Agreement until designated non-confidential by Khronos,
21 * at which point this condition clause shall be removed.
23 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
26 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
27 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
33 * \brief Vulkan Copies And Blitting Tests
34 *//*--------------------------------------------------------------------*/
36 #include "vktApiCopiesAndBlittingTests.hpp"
38 #include "deRandom.hpp"
39 #include "deStringUtil.hpp"
40 #include "deUniquePtr.hpp"
41 #include "vkImageUtil.hpp"
42 #include "vkMemUtil.hpp"
43 #include "vktTestCase.hpp"
44 #include "vktTestCaseUtil.hpp"
45 #include "vkQueryUtil.hpp"
46 #include "vkRefUtil.hpp"
47 #include "vkTypeUtil.hpp"
48 #include "tcuImageCompare.hpp"
49 #include "tcuTextureUtil.hpp"
50 #include "tcuVectorType.hpp"
51 #include "tcuTexture.hpp"
66 VkBufferCopy bufferCopy;
67 VkImageCopy imageCopy;
68 VkBufferImageCopy bufferImageCopy;
69 VkImageBlit imageBlit;
87 std::vector<CopyRegion> regions;
90 class CopiesAndBlittingTestInstance : public vkt::TestInstance
93 CopiesAndBlittingTestInstance (Context& context,
94 TestParams testParams);
95 virtual ~CopiesAndBlittingTestInstance (void);
96 virtual tcu::TestStatus iterate (void) = 0;
99 FILL_MODE_SEQUENTIAL = 0,
107 const TestParams m_params;
109 Move<VkCommandPool> m_cmdPool;
110 Move<VkCommandBuffer> m_cmdBuffer;
111 Move<VkFence> m_fence;
112 de::MovePtr<tcu::TextureLevel> m_sourceTextureLevel;
113 de::MovePtr<tcu::TextureLevel> m_destinationTextureLevel;
114 de::MovePtr<tcu::TextureLevel> m_expectedTextureLevel;
116 VkCommandBufferBeginInfo m_cmdBufferBeginInfo;
118 void generateBuffer (tcu::PixelBufferAccess buffer, int width, int height, int depth = 1, FillMode = FILL_MODE_SEQUENTIAL);
119 virtual void generateExpectedResult (void);
120 void uploadBuffer (tcu::ConstPixelBufferAccess bufferAccess, const Allocation& bufferAlloc);
121 void uploadImage (tcu::ConstPixelBufferAccess imageAccess, const VkImage& image);
122 virtual tcu::TestStatus checkTestResult (tcu::ConstPixelBufferAccess result);
123 virtual void copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region) = 0;
124 VkImageAspectFlags getAspectFlag (tcu::TextureFormat format);
125 deUint32 calculateSize (tcu::ConstPixelBufferAccess src) const
127 return src.getWidth() * src.getHeight() * src.getDepth() * tcu::getPixelSize(src.getFormat());
130 de::MovePtr<tcu::TextureLevel> readImage (const vk::DeviceInterface& vk,
133 vk::Allocator& allocator,
136 const VkExtent3D imageSize);
139 CopiesAndBlittingTestInstance::~CopiesAndBlittingTestInstance (void)
143 CopiesAndBlittingTestInstance::CopiesAndBlittingTestInstance (Context& context, TestParams testParams)
144 : vkt::TestInstance (context)
145 , m_params (testParams)
147 const DeviceInterface& vk = context.getDeviceInterface();
148 const VkDevice vkDevice = context.getDevice();
149 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
151 // Create command pool
153 const VkCommandPoolCreateInfo cmdPoolParams =
155 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
156 DE_NULL, // const void* pNext;
157 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCmdPoolCreateFlags flags;
158 queueFamilyIndex, // deUint32 queueFamilyIndex;
161 m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
164 // Create command buffer
166 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
168 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
169 DE_NULL, // const void* pNext;
170 *m_cmdPool, // VkCommandPool commandPool;
171 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
172 1u // deUint32 bufferCount;
175 m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
180 const VkFenceCreateInfo fenceParams =
182 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
183 DE_NULL, // const void* pNext;
184 0u // VkFenceCreateFlags flags;
187 m_fence = createFence(vk, vkDevice, &fenceParams);
191 void CopiesAndBlittingTestInstance::generateBuffer(tcu::PixelBufferAccess buffer, int width, int height, int depth, FillMode mode)
193 de::Random rnd(width ^ height ^ depth);
194 for (int z = 0; z < depth; z++)
196 for (int y = 0; y < height; y++)
198 for (int x = 0; x < width; x++)
202 case FILL_MODE_SEQUENTIAL:
203 buffer.setPixel(tcu::UVec4(x, y, z, 255), x, y, z);
205 case FILL_MODE_WHITE:
206 buffer.setPixel(tcu::UVec4(255, 255, 255, 255), x, y, z);
209 buffer.setPixel(tcu::UVec4(255, 0, 0, 255), x, y, z);
211 case FILL_MODE_RANDOM:
212 buffer.setPixel(tcu::UVec4(rnd.getUint8(), rnd.getUint8(), rnd.getUint8(), 255), x, y, z);
221 void CopiesAndBlittingTestInstance::uploadBuffer(tcu::ConstPixelBufferAccess bufferAccess, const Allocation& bufferAlloc)
223 const DeviceInterface& vk = m_context.getDeviceInterface();
224 const VkDevice vkDevice = m_context.getDevice();
225 const deUint32 bufferSize = calculateSize(bufferAccess);
228 deMemcpy(bufferAlloc.getHostPtr(), bufferAccess.getDataPtr(), bufferSize);
229 flushMappedMemoryRange(vk, vkDevice, bufferAlloc.getMemory(), bufferAlloc.getOffset(), bufferSize);
232 void CopiesAndBlittingTestInstance::uploadImage(tcu::ConstPixelBufferAccess imageAccess, const VkImage& image)
234 const DeviceInterface& vk = m_context.getDeviceInterface();
235 const VkDevice vkDevice = m_context.getDevice();
236 const VkQueue queue = m_context.getUniversalQueue();
237 const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
238 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
240 Move<VkBuffer> buffer;
241 const deUint32 bufferSize = calculateSize(imageAccess);
242 de::MovePtr<Allocation> bufferAlloc;
243 Move<VkCommandBuffer> cmdBuffer;
246 // Create source buffer
248 const VkBufferCreateInfo bufferParams =
250 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
251 DE_NULL, // const void* pNext;
252 0u, // VkBufferCreateFlags flags;
253 bufferSize, // VkDeviceSize size;
254 VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // VkBufferUsageFlags usage;
255 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
256 1u, // deUint32 queueFamilyIndexCount;
257 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
260 buffer = createBuffer(vk, vkDevice, &bufferParams);
261 bufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
262 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
265 // Create command buffer
267 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
269 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
270 DE_NULL, // const void* pNext;
271 *m_cmdPool, // VkCommandPool commandPool;
272 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
273 1u, // deUint32 bufferCount;
276 cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
281 const VkFenceCreateInfo fenceParams =
283 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
284 DE_NULL, // const void* pNext;
285 0u // VkFenceCreateFlags flags;
288 fence = createFence(vk, vkDevice, &fenceParams);
291 // Barriers for copying buffer to image
292 const VkBufferMemoryBarrier preBufferBarrier =
294 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
295 DE_NULL, // const void* pNext;
296 VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask;
297 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
298 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
299 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
300 *buffer, // VkBuffer buffer;
301 0u, // VkDeviceSize offset;
302 bufferSize // VkDeviceSize size;
305 const VkImageMemoryBarrier preImageBarrier =
307 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
308 DE_NULL, // const void* pNext;
309 0u, // VkAccessFlags srcAccessMask;
310 0u, // VkAccessFlags dstAccessMask;
311 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
312 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
313 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
314 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
315 image, // VkImage image;
316 { // VkImageSubresourceRange subresourceRange;
317 getAspectFlag(imageAccess.getFormat()), // VkImageAspect aspect;
318 0u, // deUint32 baseMipLevel;
319 1u, // deUint32 mipLevels;
320 0u, // deUint32 baseArraySlice;
321 1u, // deUint32 arraySize;
325 const VkImageMemoryBarrier postImageBarrier =
327 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
328 DE_NULL, // const void* pNext;
329 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
330 VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
331 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
332 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
333 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
334 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
335 image, // VkImage image;
336 { // VkImageSubresourceRange subresourceRange;
337 getAspectFlag(imageAccess.getFormat()), // VkImageAspect aspect;
338 0u, // deUint32 baseMipLevel;
339 1u, // deUint32 mipLevels;
340 0u, // deUint32 baseArraySlice;
341 1u, // deUint32 arraySize;
345 const void* preCopyBarriers[2] =
350 const void* const postCopyBarrier = &postImageBarrier;
352 const VkBufferImageCopy copyRegion =
354 0u, // VkDeviceSize bufferOffset;
355 (deUint32)imageAccess.getWidth(), // deUint32 bufferRowLength;
356 (deUint32)imageAccess.getHeight(), // deUint32 bufferImageHeight;
357 { // VkImageSubresourceLayers imageSubresource;
358 getAspectFlag(imageAccess.getFormat()), // VkImageAspect aspect;
359 0u, // deUint32 mipLevel;
360 0u, // deUint32 baseArrayLayer;
361 1u, // deUint32 layerCount;
363 { 0, 0, 0 }, // VkOffset3D imageOffset;
364 { imageAccess.getWidth(), imageAccess.getHeight(), 1u } // VkExtent3D imageExtent;
368 deMemcpy(bufferAlloc->getHostPtr(), imageAccess.getDataPtr(), bufferSize);
369 flushMappedMemoryRange(vk, vkDevice, bufferAlloc->getMemory(), bufferAlloc->getOffset(), bufferSize);
371 // Copy buffer to image
372 VkCommandBufferBeginInfo cmdBufferBeginInfo =
374 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
375 DE_NULL, // const void* pNext;
376 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
377 DE_NULL, // VkRenderPass renderPass;
378 0u, // deUint32 subpass;
379 DE_NULL, // VkFramebuffer framebuffer;
380 false, // VkBool32 occlusionQueryEnable;
381 0u, // VkQueryControlFlags queryFlags;
382 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
385 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
386 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 2u, preCopyBarriers);
387 vk.cmdCopyBufferToImage(*cmdBuffer, *buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©Region);
388 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1u, &postCopyBarrier);
389 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
391 const VkSubmitInfo submitInfo =
393 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
394 DE_NULL, // const void* pNext;
395 0u, // deUint32 waitSemaphoreCount;
396 DE_NULL, // const VkSemaphore* pWaitSemaphores;
397 1u, // deUint32 commandBufferCount;
398 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
399 0u, // deUint32 signalSemaphoreCount;
400 DE_NULL // const VkSemaphore* pSignalSemaphores;
403 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
404 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
407 tcu::TestStatus CopiesAndBlittingTestInstance::checkTestResult(tcu::ConstPixelBufferAccess result)
409 const tcu::ConstPixelBufferAccess expected = m_expectedTextureLevel->getAccess();
410 const tcu::UVec4 treshold (0, 0, 0, 0);
412 if (!tcu::intThresholdCompare(m_context.getTestContext().getLog(), "Compare", "Result comparsion", expected, result, treshold, tcu::COMPARE_LOG_RESULT))
413 return tcu::TestStatus::fail("CopiesAndBlitting test");
415 return tcu::TestStatus::pass("CopiesAndBlitting test");
418 void CopiesAndBlittingTestInstance::generateExpectedResult()
420 const tcu::ConstPixelBufferAccess src = m_sourceTextureLevel->getAccess();
421 const tcu::ConstPixelBufferAccess dst = m_destinationTextureLevel->getAccess();
423 m_expectedTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dst.getFormat(), dst.getWidth(), dst.getHeight(), dst.getDepth()));
424 tcu::copy(m_expectedTextureLevel->getAccess(), dst);
425 for (deUint32 i = 0; i < m_params.regions.size(); i++)
426 copyRegionToTextureLevel(src, m_expectedTextureLevel->getAccess(), m_params.regions[i]);
429 class CopiesAndBlittingTestCase : public vkt::TestCase
432 CopiesAndBlittingTestCase (tcu::TestContext& testCtx,
433 const std::string& name,
434 const std::string& description)
435 : vkt::TestCase (testCtx, name, description)
438 virtual ~CopiesAndBlittingTestCase (void) {}
440 virtual TestInstance* createInstance (Context& context) const = 0;
443 VkImageAspectFlags CopiesAndBlittingTestInstance::getAspectFlag(tcu::TextureFormat format)
445 VkImageAspectFlags aspectFlag = 0;
446 aspectFlag |= (tcu::hasDepthComponent(format.order)? VK_IMAGE_ASPECT_DEPTH_BIT : 0);
447 aspectFlag |= (tcu::hasStencilComponent(format.order)? VK_IMAGE_ASPECT_STENCIL_BIT : 0);
450 aspectFlag = VK_IMAGE_ASPECT_COLOR_BIT;
455 de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage (const vk::DeviceInterface& vk,
458 vk::Allocator& allocator,
461 const VkExtent3D imageSize)
463 Move<VkBuffer> buffer;
464 de::MovePtr<Allocation> bufferAlloc;
465 Move<VkCommandBuffer> cmdBuffer;
467 const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
468 const tcu::TextureFormat tcuFormat = mapVkFormat(format);
469 const VkDeviceSize pixelDataSize = imageSize.width * imageSize.height * imageSize.depth * tcu::getPixelSize(tcuFormat);
470 de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(tcuFormat, imageSize.width, imageSize.height, imageSize.depth));
472 // Create destination buffer
474 const VkBufferCreateInfo bufferParams =
476 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
477 DE_NULL, // const void* pNext;
478 0u, // VkBufferCreateFlags flags;
479 pixelDataSize, // VkDeviceSize size;
480 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
481 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
482 1u, // deUint32 queueFamilyIndexCount;
483 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
486 buffer = createBuffer(vk, device, &bufferParams);
487 bufferAlloc = allocator.allocate(getBufferMemoryRequirements(vk, device, *buffer), MemoryRequirement::HostVisible);
488 VK_CHECK(vk.bindBufferMemory(device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
491 // Create command pool and buffer
493 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
495 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
496 DE_NULL, // const void* pNext;
497 *m_cmdPool, // VkCommandPool commandPool;
498 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
499 1u // deUint32 bufferCount;
502 cmdBuffer = allocateCommandBuffer(vk, device, &cmdBufferAllocateInfo);
507 const VkFenceCreateInfo fenceParams =
509 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
510 DE_NULL, // const void* pNext;
511 0u // VkFenceCreateFlags flags;
514 fence = createFence(vk, device, &fenceParams);
517 // Barriers for copying image to buffer
519 const VkImageMemoryBarrier imageBarrier =
521 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
522 DE_NULL, // const void* pNext;
523 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
524 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
525 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
526 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
527 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
528 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
529 image, // VkImage image;
530 { // VkImageSubresourceRange subresourceRange;
531 getAspectFlag(tcuFormat), // VkImageAspectFlags aspectMask;
532 0u, // deUint32 baseMipLevel;
533 1u, // deUint32 mipLevels;
534 0u, // deUint32 baseArraySlice;
535 1u // deUint32 arraySize;
539 const VkBufferMemoryBarrier bufferBarrier =
541 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
542 DE_NULL, // const void* pNext;
543 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
544 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
545 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
546 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
547 *buffer, // VkBuffer buffer;
548 0u, // VkDeviceSize offset;
549 pixelDataSize // VkDeviceSize size;
552 const void* const imageBarrierPtr = &imageBarrier;
553 const void* const bufferBarrierPtr = &bufferBarrier;
555 // Copy image to buffer
557 const VkBufferImageCopy copyRegion =
559 0u, // VkDeviceSize bufferOffset;
560 (deUint32)imageSize.width, // deUint32 bufferRowLength;
561 (deUint32)imageSize.height, // deUint32 bufferImageHeight;
562 { getAspectFlag(tcuFormat), 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource;
563 { 0, 0, 0 }, // VkOffset3D imageOffset;
564 imageSize // VkExtent3D imageExtent;
567 VkCommandBufferBeginInfo cmdBufferBeginInfo =
569 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
570 DE_NULL, // const void* pNext;
571 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
572 DE_NULL, // VkRenderPass renderPass;
573 0u, // deUint32 subpass;
574 DE_NULL, // VkFramebuffer framebuffer;
575 false, // VkBool32 occlusionQueryEnable;
576 0u, // VkQueryControlFlags queryFlags;
577 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
580 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
581 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 1, &imageBarrierPtr);
582 vk.cmdCopyImageToBuffer(*cmdBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region);
583 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1, &bufferBarrierPtr);
584 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
586 const VkSubmitInfo submitInfo =
588 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
589 DE_NULL, // const void* pNext;
590 0u, // deUint32 waitSemaphoreCount;
591 DE_NULL, // const VkSemaphore* pWaitSemaphores;
592 1u, // deUint32 commandBufferCount;
593 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
594 0u, // deUint32 signalSemaphoreCount;
595 DE_NULL // const VkSemaphore* pSignalSemaphores;
598 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
599 VK_CHECK(vk.waitForFences(device, 1, &fence.get(), 0, ~(0ull) /* infinity */));
602 invalidateMappedMemoryRange(vk, device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
603 tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
608 // Copy from image to image.
610 class CopyImageToImage : public CopiesAndBlittingTestInstance
613 CopyImageToImage (Context& context,
615 virtual tcu::TestStatus iterate (void);
617 Move<VkImage> m_source;
618 de::MovePtr<Allocation> m_sourceImageAlloc;
619 Move<VkImage> m_destination;
620 de::MovePtr<Allocation> m_destinationImageAlloc;
622 virtual void copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
625 CopyImageToImage::CopyImageToImage (Context& context, TestParams params)
626 : CopiesAndBlittingTestInstance(context, params)
628 const DeviceInterface& vk = context.getDeviceInterface();
629 const VkDevice vkDevice = context.getDevice();
630 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
631 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
633 // Create source image
635 const VkImageCreateInfo sourceImageParams =
637 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
638 DE_NULL, // const void* pNext;
639 0u, // VkImageCreateFlags flags;
640 VK_IMAGE_TYPE_2D, // VkImageType imageType;
641 m_params.src.image.format, // VkFormat format;
642 m_params.src.image.extent, // VkExtent3D extent;
643 1u, // deUint32 mipLevels;
644 1u, // deUint32 arraySize;
645 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
646 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
647 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage;
648 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
649 1u, // deUint32 queueFamilyCount;
650 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
651 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
654 m_source = createImage(vk, vkDevice, &sourceImageParams);
655 m_sourceImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_source), MemoryRequirement::Any);
656 VK_CHECK(vk.bindImageMemory(vkDevice, *m_source, m_sourceImageAlloc->getMemory(), m_sourceImageAlloc->getOffset()));
659 // Create destination image
661 const VkImageCreateInfo destinationImageParams =
663 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
664 DE_NULL, // const void* pNext;
665 0u, // VkImageCreateFlags flags;
666 VK_IMAGE_TYPE_2D, // VkImageType imageType;
667 m_params.dst.image.format, // VkFormat format;
668 m_params.dst.image.extent, // VkExtent3D extent;
669 1u, // deUint32 mipLevels;
670 1u, // deUint32 arraySize;
671 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
672 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
673 VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
674 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
675 1u, // deUint32 queueFamilyCount;
676 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
677 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
680 m_destination = createImage(vk, vkDevice, &destinationImageParams);
681 m_destinationImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_destination), MemoryRequirement::Any);
682 VK_CHECK(vk.bindImageMemory(vkDevice, *m_destination, m_destinationImageAlloc->getMemory(), m_destinationImageAlloc->getOffset()));
686 tcu::TestStatus CopyImageToImage::iterate()
688 tcu::TextureFormat srcTcuFormat = mapVkFormat(m_params.src.image.format);
689 tcu::TextureFormat dstTcuFormat = mapVkFormat(m_params.dst.image.format);
690 m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(srcTcuFormat,
691 m_params.src.image.extent.width,
692 m_params.src.image.extent.height,
693 m_params.src.image.extent.depth));
694 generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth);
695 m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dstTcuFormat,
696 (int)m_params.dst.image.extent.width,
697 (int)m_params.dst.image.extent.height,
698 (int)m_params.dst.image.extent.depth));
699 generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth);
700 generateExpectedResult();
702 uploadImage(m_sourceTextureLevel->getAccess(), m_source.get());
703 uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get());
705 const DeviceInterface& vk = m_context.getDeviceInterface();
706 const VkDevice vkDevice = m_context.getDevice();
707 const VkQueue queue = m_context.getUniversalQueue();
708 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
710 VkImageCopy* imageCopies = ((VkImageCopy*)deMalloc(m_params.regions.size() * sizeof(VkImageCopy)));
711 for (deUint32 i = 0; i < m_params.regions.size(); i++)
712 imageCopies[i] = m_params.regions[i].imageCopy;
714 // Barriers for copying image to buffer
715 const VkImageMemoryBarrier srcImageBarrier =
717 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
718 DE_NULL, // const void* pNext;
719 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
720 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
721 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout oldLayout;
722 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
723 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
724 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
725 m_source.get(), // VkImage image;
726 { // VkImageSubresourceRange subresourceRange;
727 getAspectFlag(srcTcuFormat), // VkImageAspectFlags aspectMask;
728 0u, // deUint32 baseMipLevel;
729 1u, // deUint32 mipLevels;
730 0u, // deUint32 baseArraySlice;
731 1u // deUint32 arraySize;
735 const VkImageMemoryBarrier dstImageBarrier =
737 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
738 DE_NULL, // const void* pNext;
739 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
740 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
741 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout oldLayout;
742 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
743 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
744 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
745 m_destination.get(), // VkImage image;
746 { // VkImageSubresourceRange subresourceRange;
747 getAspectFlag(dstTcuFormat), // VkImageAspectFlags aspectMask;
748 0u, // deUint32 baseMipLevel;
749 1u, // deUint32 mipLevels;
750 0u, // deUint32 baseArraySlice;
751 1u // deUint32 arraySize;
755 const void* const srcImageBarrierPtr = &srcImageBarrier;
756 const void* const dstImageBarrierPtr = &dstImageBarrier;
758 VkCommandBufferBeginInfo cmdBufferBeginInfo =
760 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
761 DE_NULL, // const void* pNext;
762 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
763 DE_NULL, // VkRenderPass renderPass;
764 0u, // deUint32 subpass;
765 DE_NULL, // VkFramebuffer framebuffer;
766 false, // VkBool32 occlusionQueryEnable;
767 0u, // VkQueryControlFlags queryFlags;
768 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
771 VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
772 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 1, &srcImageBarrierPtr);
773 vk.cmdCopyImage(*m_cmdBuffer, m_source.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)m_params.regions.size(), imageCopies);
774 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1, &dstImageBarrierPtr);
775 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
777 const VkSubmitInfo submitInfo =
779 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
780 DE_NULL, // const void* pNext;
781 0u, // deUint32 waitSemaphoreCount;
782 DE_NULL, // const VkSemaphore* pWaitSemaphores;
783 1u, // deUint32 commandBufferCount;
784 &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
785 0u, // deUint32 signalSemaphoreCount;
786 DE_NULL // const VkSemaphore* pSignalSemaphores;
789 VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
790 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
791 VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
794 de::MovePtr<tcu::TextureLevel> resultTextureLevel = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
796 return checkTestResult(resultTextureLevel->getAccess());
799 void CopyImageToImage::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
801 VkOffset3D srcOffset = region.imageCopy.srcOffset;
802 VkOffset3D dstOffset = region.imageCopy.dstOffset;
803 VkExtent3D extent = region.imageCopy.extent;
805 const tcu::ConstPixelBufferAccess srcSubRegion = tcu::getSubregion(src, srcOffset.x, srcOffset.y, extent.width, extent.height);
806 // CopyImage acts like a memcpy. Replace the destination format with the srcformat to use a memcpy.
807 const tcu::PixelBufferAccess dstWithSrcFormat(srcSubRegion.getFormat(), dst.getSize(), dst.getDataPtr());
808 const tcu::PixelBufferAccess dstSubRegion = tcu::getSubregion(dstWithSrcFormat, dstOffset.x, dstOffset.y, extent.width, extent.height);
810 tcu::copy(dstSubRegion, srcSubRegion);
813 class CopyImageToImageTestCase : public vkt::TestCase
816 CopyImageToImageTestCase (tcu::TestContext& testCtx,
817 const std::string& name,
818 const std::string& description,
819 const TestParams params)
820 : vkt::TestCase (testCtx, name, description)
824 virtual ~CopyImageToImageTestCase (void) {}
826 virtual TestInstance* createInstance (Context& context) const
828 return new CopyImageToImage(context, m_params);
834 // Copy from buffer to buffer.
836 class CopyBufferToBuffer : public CopiesAndBlittingTestInstance
839 CopyBufferToBuffer (Context& context, TestParams params);
840 virtual tcu::TestStatus iterate (void);
842 virtual void copyRegionToTextureLevel (tcu::ConstPixelBufferAccess, tcu::PixelBufferAccess, CopyRegion);
843 Move<VkBuffer> m_source;
844 de::MovePtr<Allocation> m_sourceBufferAlloc;
845 Move<VkBuffer> m_destination;
846 de::MovePtr<Allocation> m_destinationBufferAlloc;
849 CopyBufferToBuffer::CopyBufferToBuffer (Context& context, TestParams params)
850 : CopiesAndBlittingTestInstance (context, params)
852 const DeviceInterface& vk = context.getDeviceInterface();
853 const VkDevice vkDevice = context.getDevice();
854 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
855 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
857 // Create source buffer
859 const VkBufferCreateInfo sourceBufferParams =
861 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
862 DE_NULL, // const void* pNext;
863 0u, // VkBufferCreateFlags flags;
864 m_params.src.buffer.size, // VkDeviceSize size;
865 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
866 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
867 1u, // deUint32 queueFamilyIndexCount;
868 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
871 m_source = createBuffer(vk, vkDevice, &sourceBufferParams);
872 m_sourceBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_source), MemoryRequirement::HostVisible);
873 VK_CHECK(vk.bindBufferMemory(vkDevice, *m_source, m_sourceBufferAlloc->getMemory(), m_sourceBufferAlloc->getOffset()));
876 // Create desctination buffer
878 const VkBufferCreateInfo destinationBufferParams =
880 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
881 DE_NULL, // const void* pNext;
882 0u, // VkBufferCreateFlags flags;
883 m_params.dst.buffer.size, // VkDeviceSize size;
884 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
885 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
886 1u, // deUint32 queueFamilyIndexCount;
887 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
890 m_destination = createBuffer(vk, vkDevice, &destinationBufferParams);
891 m_destinationBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_destination), MemoryRequirement::HostVisible);
892 VK_CHECK(vk.bindBufferMemory(vkDevice, *m_destination, m_destinationBufferAlloc->getMemory(), m_destinationBufferAlloc->getOffset()));
896 tcu::TestStatus CopyBufferToBuffer::iterate()
898 m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(mapVkFormat(VK_FORMAT_R32_UINT), (int)m_params.src.buffer.size, 1));
899 generateBuffer(m_sourceTextureLevel->getAccess(), (int)m_params.src.buffer.size, 1, 1, FILL_MODE_RED);
900 m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(mapVkFormat(VK_FORMAT_R32_UINT), (int)m_params.dst.buffer.size, 1));
901 generateBuffer(m_destinationTextureLevel->getAccess(), (int)m_params.dst.buffer.size, 1, 1, FILL_MODE_WHITE);
903 generateExpectedResult();
905 uploadBuffer(m_sourceTextureLevel->getAccess(), *m_sourceBufferAlloc);
906 uploadBuffer(m_destinationTextureLevel->getAccess(), *m_destinationBufferAlloc);
908 const DeviceInterface& vk = m_context.getDeviceInterface();
909 const VkDevice vkDevice = m_context.getDevice();
910 const VkQueue queue = m_context.getUniversalQueue();
912 const VkBufferMemoryBarrier srcBufferBarrier =
914 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
915 DE_NULL, // const void* pNext;
916 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
917 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
918 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
919 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
920 *m_source, // VkBuffer buffer;
921 0u, // VkDeviceSize offset;
922 m_params.src.buffer.size // VkDeviceSize size;
925 const VkBufferMemoryBarrier dstBufferBarrier =
927 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
928 DE_NULL, // const void* pNext;
929 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
930 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
931 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
932 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
933 *m_destination, // VkBuffer buffer;
934 0u, // VkDeviceSize offset;
935 m_params.dst.buffer.size // VkDeviceSize size;
938 const void* const srcBufferBarrierPtr = &srcBufferBarrier;
939 const void* const dstBufferBarrierPtr = &dstBufferBarrier;
941 VkBufferCopy* bufferCopies = ((VkBufferCopy*)deMalloc(m_params.regions.size() * sizeof(VkBufferCopy)));
942 for (deUint32 i = 0; i < m_params.regions.size(); i++)
943 bufferCopies[i] = m_params.regions[i].bufferCopy;
945 VkCommandBufferBeginInfo cmdBufferBeginInfo =
947 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
948 DE_NULL, // const void* pNext;
949 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
950 DE_NULL, // VkRenderPass renderPass;
951 0u, // deUint32 subpass;
952 DE_NULL, // VkFramebuffer framebuffer;
953 false, // VkBool32 occlusionQueryEnable;
954 0u, // VkQueryControlFlags queryFlags;
955 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
958 VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
959 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 1, &srcBufferBarrierPtr);
960 vk.cmdCopyBuffer(*m_cmdBuffer, m_source.get(), m_destination.get(), (deUint32)m_params.regions.size(), bufferCopies);
961 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1, &dstBufferBarrierPtr);
962 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
964 const VkSubmitInfo submitInfo =
966 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
967 DE_NULL, // const void* pNext;
968 0u, // deUint32 waitSemaphoreCount;
969 DE_NULL, // const VkSemaphore* pWaitSemaphores;
970 1u, // deUint32 commandBufferCount;
971 &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
972 0u, // deUint32 signalSemaphoreCount;
973 DE_NULL // const VkSemaphore* pSignalSemaphores;
976 VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
977 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
978 VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
981 de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(mapVkFormat(VK_FORMAT_R32_UINT), (int)m_params.dst.buffer.size, 1));
982 invalidateMappedMemoryRange(vk, vkDevice, m_destinationBufferAlloc->getMemory(), m_destinationBufferAlloc->getOffset(), m_params.dst.buffer.size);
983 tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), m_destinationBufferAlloc->getHostPtr()));
984 deFree(bufferCopies);
986 return checkTestResult(resultLevel->getAccess());
989 void CopyBufferToBuffer::copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
991 deMemcpy((deUint8*) dst.getDataPtr() + region.bufferCopy.dstOffset,
992 (deUint8*) src.getDataPtr() + region.bufferCopy.srcOffset,
993 (size_t)region.bufferCopy.size);
996 class BufferToBufferTestCase : public vkt::TestCase
999 BufferToBufferTestCase (tcu::TestContext& testCtx,
1000 const std::string& name,
1001 const std::string& description,
1002 const TestParams params)
1003 : vkt::TestCase (testCtx, name, description)
1006 virtual ~BufferToBufferTestCase (void) {}
1008 virtual TestInstance* createInstance (Context& context) const
1010 return new CopyBufferToBuffer(context, m_params);
1013 TestParams m_params;
1016 // Copy from image to buffer.
1018 class CopyImageToBuffer : public CopiesAndBlittingTestInstance
1021 CopyImageToBuffer (Context& context,
1022 TestParams testParams);
1023 virtual ~CopyImageToBuffer (void) {}
1024 virtual tcu::TestStatus iterate (void);
1026 virtual void copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
1028 tcu::TextureFormat m_textureFormat;
1029 VkDeviceSize m_bufferSize;
1031 Move<VkImage> m_source;
1032 de::MovePtr<Allocation> m_sourceImageAlloc;
1033 Move<VkBuffer> m_destination;
1034 de::MovePtr<Allocation> m_destinationBufferAlloc;
1037 CopyImageToBuffer::CopyImageToBuffer (Context& context, TestParams testParams)
1038 : CopiesAndBlittingTestInstance(context, testParams)
1039 , m_textureFormat(mapVkFormat(testParams.src.image.format))
1040 , m_bufferSize(m_params.dst.buffer.size * tcu::getPixelSize(m_textureFormat))
1042 const DeviceInterface& vk = context.getDeviceInterface();
1043 const VkDevice vkDevice = context.getDevice();
1044 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1045 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
1047 // Create source image
1049 const VkImageCreateInfo sourceImageParams =
1051 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
1052 DE_NULL, // const void* pNext;
1053 0u, // VkImageCreateFlags flags;
1054 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1055 m_params.src.image.format, // VkFormat format;
1056 m_params.src.image.extent, // VkExtent3D extent;
1057 1u, // deUint32 mipLevels;
1058 1u, // deUint32 arraySize;
1059 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
1060 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
1061 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
1062 VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
1063 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1064 1u, // deUint32 queueFamilyCount;
1065 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
1066 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
1069 m_source = createImage(vk, vkDevice, &sourceImageParams);
1070 m_sourceImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_source), MemoryRequirement::Any);
1071 VK_CHECK(vk.bindImageMemory(vkDevice, *m_source, m_sourceImageAlloc->getMemory(), m_sourceImageAlloc->getOffset()));
1074 // Create destination buffer
1076 const VkBufferCreateInfo destinationBufferParams =
1078 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1079 DE_NULL, // const void* pNext;
1080 0u, // VkBufferCreateFlags flags;
1081 m_bufferSize, // VkDeviceSize size;
1082 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
1083 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1084 1u, // deUint32 queueFamilyIndexCount;
1085 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
1088 m_destination = createBuffer(vk, vkDevice, &destinationBufferParams);
1089 m_destinationBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_destination), MemoryRequirement::HostVisible);
1090 VK_CHECK(vk.bindBufferMemory(vkDevice, *m_destination, m_destinationBufferAlloc->getMemory(), m_destinationBufferAlloc->getOffset()));
1094 tcu::TestStatus CopyImageToBuffer::iterate()
1096 m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(m_textureFormat,
1097 m_params.src.image.extent.width,
1098 m_params.src.image.extent.height,
1099 m_params.src.image.extent.depth));
1100 generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, FILL_MODE_RED);
1101 m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(m_textureFormat, (int)m_params.dst.buffer.size, 1));
1102 generateBuffer(m_destinationTextureLevel->getAccess(), (int)m_params.dst.buffer.size, 1, 1);
1104 generateExpectedResult();
1106 uploadImage(m_sourceTextureLevel->getAccess(), *m_source);
1107 uploadBuffer(m_destinationTextureLevel->getAccess(), *m_destinationBufferAlloc);
1109 const DeviceInterface& vk = m_context.getDeviceInterface();
1110 const VkDevice vkDevice = m_context.getDevice();
1111 const VkQueue queue = m_context.getUniversalQueue();
1113 // Barriers for copying image to buffer
1114 const VkImageMemoryBarrier imageBarrier =
1116 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1117 DE_NULL, // const void* pNext;
1118 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1119 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
1120 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout oldLayout;
1121 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
1122 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1123 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1124 *m_source, // VkImage image;
1125 { // VkImageSubresourceRange subresourceRange;
1126 getAspectFlag(m_textureFormat), // VkImageAspectFlags aspectMask;
1127 0u, // deUint32 baseMipLevel;
1128 1u, // deUint32 mipLevels;
1129 0u, // deUint32 baseArraySlice;
1130 1u // deUint32 arraySize;
1134 const VkBufferMemoryBarrier bufferBarrier =
1136 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
1137 DE_NULL, // const void* pNext;
1138 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1139 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
1140 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1141 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1142 *m_destination, // VkBuffer buffer;
1143 0u, // VkDeviceSize offset;
1144 m_bufferSize // VkDeviceSize size;
1147 const void* const imageBarrierPtr = &imageBarrier;
1148 const void* const bufferBarrierPtr = &bufferBarrier;
1150 // Copy from image to buffer
1151 VkBufferImageCopy* bufferImageCopies = ((VkBufferImageCopy*)deMalloc(m_params.regions.size() * sizeof(VkBufferImageCopy)));
1152 for (deUint32 i = 0; i < m_params.regions.size(); i++)
1153 bufferImageCopies[i] = m_params.regions[i].bufferImageCopy;
1155 VkCommandBufferBeginInfo cmdBufferBeginInfo =
1157 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
1158 DE_NULL, // const void* pNext;
1159 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
1160 DE_NULL, // VkRenderPass renderPass;
1161 0u, // deUint32 subpass;
1162 DE_NULL, // VkFramebuffer framebuffer;
1163 false, // VkBool32 occlusionQueryEnable;
1164 0u, // VkQueryControlFlags queryFlags;
1165 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
1168 VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1169 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 1, &imageBarrierPtr);
1170 vk.cmdCopyImageToBuffer(*m_cmdBuffer, m_source.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_destination.get(), (deUint32)m_params.regions.size(), bufferImageCopies);
1171 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1, &bufferBarrierPtr);
1172 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1174 const VkSubmitInfo submitInfo =
1176 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
1177 DE_NULL, // const void* pNext;
1178 0u, // deUint32 waitSemaphoreCount;
1179 DE_NULL, // const VkSemaphore* pWaitSemaphores;
1180 1u, // deUint32 commandBufferCount;
1181 &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
1182 0u, // deUint32 signalSemaphoreCount;
1183 DE_NULL // const VkSemaphore* pSignalSemaphores;
1186 VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
1187 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
1188 VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
1191 de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(m_textureFormat, (int)m_params.dst.buffer.size, 1));
1192 invalidateMappedMemoryRange(vk, vkDevice, m_destinationBufferAlloc->getMemory(), m_destinationBufferAlloc->getOffset(), m_bufferSize);
1193 tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), m_destinationBufferAlloc->getHostPtr()));
1194 deFree(bufferImageCopies);
1196 return checkTestResult(resultLevel->getAccess());
1199 class CopyImageToBufferTestCase : public vkt::TestCase
1202 CopyImageToBufferTestCase (tcu::TestContext& testCtx,
1203 const std::string& name,
1204 const std::string& description,
1205 const TestParams params)
1206 : vkt::TestCase (testCtx, name, description)
1210 virtual ~CopyImageToBufferTestCase (void) {}
1212 virtual TestInstance* createInstance (Context& context) const
1214 return new CopyImageToBuffer(context, m_params);
1217 TestParams m_params;
1220 void CopyImageToBuffer::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
1222 deUint32 rowLength = region.bufferImageCopy.bufferRowLength;
1224 rowLength = region.bufferImageCopy.imageExtent.width;
1226 deUint32 imageHeight = region.bufferImageCopy.bufferImageHeight;
1228 imageHeight = region.bufferImageCopy.imageExtent.height;
1230 const int texelSize = src.getFormat().getPixelSize();
1231 const VkExtent3D extent = region.bufferImageCopy.imageExtent;
1232 const VkOffset3D srcOffset = region.bufferImageCopy.imageOffset;
1233 const int texelOffset = (int) region.bufferImageCopy.bufferOffset / texelSize;
1235 for (int z = 0; z < extent.depth; z++)
1237 for (int y = 0; y < extent.height; y++)
1239 int texelIndex = texelOffset + (z * imageHeight + y) * rowLength;
1240 const tcu::ConstPixelBufferAccess srcSubRegion = tcu::getSubregion(src, srcOffset.x, srcOffset.y + y, srcOffset.z + z,
1241 region.bufferImageCopy.imageExtent.width, 1, 1);
1242 const tcu::PixelBufferAccess dstSubRegion = tcu::getSubregion(dst, texelIndex, 0, region.bufferImageCopy.imageExtent.width, 1);
1243 tcu::copy(dstSubRegion, srcSubRegion);
1248 // Copy from buffer to image.
1250 class CopyBufferToImage : public CopiesAndBlittingTestInstance
1253 CopyBufferToImage (Context& context,
1254 TestParams testParams);
1255 virtual ~CopyBufferToImage (void) {}
1256 virtual tcu::TestStatus iterate (void);
1258 virtual void copyRegionToTextureLevel (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
1260 tcu::TextureFormat m_textureFormat;
1261 VkDeviceSize m_bufferSize;
1263 Move<VkBuffer> m_source;
1264 de::MovePtr<Allocation> m_sourceBufferAlloc;
1265 Move<VkImage> m_destination;
1266 de::MovePtr<Allocation> m_destinationImageAlloc;
1269 CopyBufferToImage::CopyBufferToImage (Context& context, TestParams testParams)
1270 : CopiesAndBlittingTestInstance(context, testParams)
1271 , m_textureFormat(mapVkFormat(testParams.dst.image.format))
1272 , m_bufferSize(m_params.src.buffer.size * tcu::getPixelSize(m_textureFormat))
1274 const DeviceInterface& vk = context.getDeviceInterface();
1275 const VkDevice vkDevice = context.getDevice();
1276 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1277 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
1279 // Create source buffer
1281 const VkBufferCreateInfo sourceBufferParams =
1283 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1284 DE_NULL, // const void* pNext;
1285 0u, // VkBufferCreateFlags flags;
1286 m_bufferSize, // VkDeviceSize size;
1287 VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // VkBufferUsageFlags usage;
1288 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1289 1u, // deUint32 queueFamilyIndexCount;
1290 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
1293 m_source = createBuffer(vk, vkDevice, &sourceBufferParams);
1294 m_sourceBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_source), MemoryRequirement::HostVisible);
1295 VK_CHECK(vk.bindBufferMemory(vkDevice, *m_source, m_sourceBufferAlloc->getMemory(), m_sourceBufferAlloc->getOffset()));
1298 // Create destination image
1300 const VkImageCreateInfo destinationImageParams =
1302 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
1303 DE_NULL, // const void* pNext;
1304 0u, // VkImageCreateFlags flags;
1305 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1306 m_params.dst.image.format, // VkFormat format;
1307 m_params.dst.image.extent, // VkExtent3D extent;
1308 1u, // deUint32 mipLevels;
1309 1u, // deUint32 arraySize;
1310 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
1311 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
1312 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
1313 VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
1314 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1315 1u, // deUint32 queueFamilyCount;
1316 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
1317 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
1320 m_destination = createImage(vk, vkDevice, &destinationImageParams);
1321 m_destinationImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_destination), MemoryRequirement::Any);
1322 VK_CHECK(vk.bindImageMemory(vkDevice, *m_destination, m_destinationImageAlloc->getMemory(), m_destinationImageAlloc->getOffset()));
1326 tcu::TestStatus CopyBufferToImage::iterate()
1328 m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(m_textureFormat, (int)m_params.src.buffer.size, 1));
1329 generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth);
1330 m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(m_textureFormat,
1331 m_params.dst.image.extent.width,
1332 m_params.dst.image.extent.height,
1333 m_params.dst.image.extent.depth));
1334 generateBuffer(m_destinationTextureLevel->getAccess(), (int)m_params.dst.buffer.size, 1, 1);
1336 generateExpectedResult();
1338 uploadBuffer(m_sourceTextureLevel->getAccess(), *m_sourceBufferAlloc);
1339 uploadImage(m_destinationTextureLevel->getAccess(), *m_destination);
1341 const DeviceInterface& vk = m_context.getDeviceInterface();
1342 const VkDevice vkDevice = m_context.getDevice();
1343 const VkQueue queue = m_context.getUniversalQueue();
1344 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
1346 // Barriers for copying image to buffer
1347 const VkBufferMemoryBarrier bufferBarrier =
1349 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
1350 DE_NULL, // const void* pNext;
1351 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1352 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
1353 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1354 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1355 *m_source, // VkBuffer buffer;
1356 0u, // VkDeviceSize offset;
1357 m_bufferSize // VkDeviceSize size;
1360 const VkImageMemoryBarrier imageBarrier =
1362 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1363 DE_NULL, // const void* pNext;
1364 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1365 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
1366 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout oldLayout;
1367 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
1368 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1369 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1370 *m_destination, // VkImage image;
1371 { // VkImageSubresourceRange subresourceRange;
1372 getAspectFlag(m_textureFormat), // VkImageAspectFlags aspectMask;
1373 0u, // deUint32 baseMipLevel;
1374 1u, // deUint32 mipLevels;
1375 0u, // deUint32 baseArraySlice;
1376 1u // deUint32 arraySize;
1380 const void* const bufferBarrierPtr = &bufferBarrier;
1381 const void* const imageBarrierPtr = &imageBarrier;
1383 // Copy from buffer to image
1384 VkBufferImageCopy* bufferImageCopies = ((VkBufferImageCopy*)deMalloc(m_params.regions.size() * sizeof(VkBufferImageCopy)));
1385 for (deUint32 i = 0; i < m_params.regions.size(); i++)
1386 bufferImageCopies[i] = m_params.regions[i].bufferImageCopy;
1388 VkCommandBufferBeginInfo cmdBufferBeginInfo =
1390 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
1391 DE_NULL, // const void* pNext;
1392 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
1393 DE_NULL, // VkRenderPass renderPass;
1394 0u, // deUint32 subpass;
1395 DE_NULL, // VkFramebuffer framebuffer;
1396 false, // VkBool32 occlusionQueryEnable;
1397 0u, // VkQueryControlFlags queryFlags;
1398 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
1401 VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
1402 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_FALSE, 1, &bufferBarrierPtr);
1403 vk.cmdCopyBufferToImage(*m_cmdBuffer, m_source.get(), m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)m_params.regions.size(), bufferImageCopies);
1404 vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_FALSE, 1, &imageBarrierPtr);
1405 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1407 const VkSubmitInfo submitInfo =
1409 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
1410 DE_NULL, // const void* pNext;
1411 0u, // deUint32 waitSemaphoreCount;
1412 DE_NULL, // const VkSemaphore* pWaitSemaphores;
1413 1u, // deUint32 commandBufferCount;
1414 &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
1415 0u, // deUint32 signalSemaphoreCount;
1416 DE_NULL // const VkSemaphore* pSignalSemaphores;
1419 VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
1420 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
1421 VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
1424 de::MovePtr<tcu::TextureLevel> resultLevel = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
1425 deFree(bufferImageCopies);
1427 return checkTestResult(resultLevel->getAccess());
1430 class CopyBufferToImageTestCase : public vkt::TestCase
1433 CopyBufferToImageTestCase (tcu::TestContext& testCtx,
1434 const std::string& name,
1435 const std::string& description,
1436 const TestParams params)
1437 : vkt::TestCase (testCtx, name, description)
1441 virtual ~CopyBufferToImageTestCase (void) {}
1443 virtual TestInstance* createInstance (Context& context) const
1445 return new CopyBufferToImage(context, m_params);
1448 TestParams m_params;
1451 void CopyBufferToImage::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
1453 deUint32 rowLength = region.bufferImageCopy.bufferRowLength;
1455 rowLength = region.bufferImageCopy.imageExtent.width;
1457 deUint32 imageHeight = region.bufferImageCopy.bufferImageHeight;
1459 imageHeight = region.bufferImageCopy.imageExtent.height;
1461 const int texelSize = dst.getFormat().getPixelSize();
1462 const VkExtent3D extent = region.bufferImageCopy.imageExtent;
1463 const VkOffset3D dstOffset = region.bufferImageCopy.imageOffset;
1464 const int texelOffset = (int) region.bufferImageCopy.bufferOffset / texelSize;
1466 for (int z = 0; z < extent.depth; z++)
1468 for (int y = 0; y < extent.height; y++)
1470 int texelIndex = texelOffset + (z * imageHeight + y) * rowLength;
1471 const tcu::ConstPixelBufferAccess srcSubRegion = tcu::getSubregion(src, texelIndex, 0, region.bufferImageCopy.imageExtent.width, 1);
1472 const tcu::PixelBufferAccess dstSubRegion = tcu::getSubregion(dst, dstOffset.x, dstOffset.y + y, dstOffset.z + z,
1473 region.bufferImageCopy.imageExtent.width, 1, 1);
1474 tcu::copy(dstSubRegion, srcSubRegion);
1481 tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
1483 de::MovePtr<tcu::TestCaseGroup> copiesAndBlittingTests (new tcu::TestCaseGroup(testCtx, "copy_and_blit", "Copies And Blitting Tests"));
1485 const VkExtent3D defaultExtent = {256, 256, 1};
1486 const VkImageSubresourceLayers defaultSourceLayer =
1488 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
1489 0u, // uint32_t mipLevel;
1490 0u, // uint32_t baseArrayLayer;
1491 1u, // uint32_t layerCount;
1495 std::ostringstream description;
1496 description << "Copy from image to image";
1499 params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
1500 params.src.image.extent = defaultExtent;
1501 params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
1502 params.dst.image.extent = defaultExtent;
1505 const VkImageSubresourceLayers sourceLayer =
1507 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
1508 0u, // uint32_t mipLevel;
1509 0u, // uint32_t baseArrayLayer;
1510 1u // uint32_t layerCount;
1512 const VkImageCopy testCopy =
1514 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1515 {0, 0, 0}, // VkOffset3D srcOffset;
1516 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1517 {0, 0, 0}, // VkOffset3D dstOffset;
1518 {256, 256, 1}, // VkExtent3D extent;
1521 CopyRegion imageCopy;
1522 imageCopy.imageCopy = testCopy;
1524 params.regions.push_back(imageCopy);
1527 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "imageToImage_whole", description.str(), params));
1531 std::ostringstream description;
1532 description << "Copy from image to image";
1535 params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
1536 params.src.image.extent = defaultExtent;
1537 params.dst.image.format = VK_FORMAT_R32_UINT;
1538 params.dst.image.extent = defaultExtent;
1541 const VkImageSubresourceLayers sourceLayer =
1543 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
1544 0u, // uint32_t mipLevel;
1545 0u, // uint32_t baseArrayLayer;
1546 1u // uint32_t layerCount;
1548 const VkImageCopy testCopy =
1550 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1551 {0, 0, 0}, // VkOffset3D srcOffset;
1552 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1553 {0, 0, 0}, // VkOffset3D dstOffset;
1554 {256, 256, 1}, // VkExtent3D extent;
1557 CopyRegion imageCopy;
1558 imageCopy.imageCopy = testCopy;
1560 params.regions.push_back(imageCopy);
1563 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "image_to_image_whole_different_format_uncompressed", description.str(), params));
1567 std::ostringstream description;
1568 description << "Copy from image to image";
1571 params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
1572 params.src.image.extent = defaultExtent;
1573 params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
1574 params.dst.image.extent = defaultExtent;
1577 const VkImageSubresourceLayers sourceLayer =
1579 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
1580 0u, // uint32_t mipLevel;
1581 0u, // uint32_t baseArrayLayer;
1582 1u // uint32_t layerCount;
1584 const VkImageCopy testCopy =
1586 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1587 {0, 0, 0}, // VkOffset3D srcOffset;
1588 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1589 {64, 98, 0}, // VkOffset3D dstOffset;
1590 {16, 16, 1}, // VkExtent3D extent;
1593 CopyRegion imageCopy;
1594 imageCopy.imageCopy = testCopy;
1596 params.regions.push_back(imageCopy);
1599 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "image_to_image_partial", description.str(), params));
1603 std::ostringstream description;
1604 description << "Copy from image to image";
1607 params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
1608 params.src.image.extent = defaultExtent;
1609 params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
1610 params.dst.image.extent = defaultExtent;
1612 for (deInt32 i = 0; i < 16; i++)
1614 const VkImageSubresourceLayers sourceLayer =
1616 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
1617 0u, // uint32_t mipLevel;
1618 0u, // uint32_t baseArrayLayer;
1619 1u // uint32_t layerCount;
1621 const VkImageCopy testCopy =
1623 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1624 {0, 0, 0}, // VkOffset3D srcOffset;
1625 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1626 {i*16, 240-i*16, 0}, // VkOffset3D dstOffset;
1627 {16, 16, 1}, // VkExtent3D extent;
1630 CopyRegion imageCopy;
1631 imageCopy.imageCopy = testCopy;
1633 params.regions.push_back(imageCopy);
1636 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "image_to_image_partial_multiple", description.str(), params));
1639 // Copy image to buffer testcases.
1641 std::ostringstream description;
1642 description << "Copy from image to buffer";
1645 params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
1646 params.src.image.extent = defaultExtent;
1647 params.dst.buffer.size = 256 * 256;
1649 const VkBufferImageCopy bufferImageCopy =
1651 0u, // VkDeviceSize bufferOffset;
1652 0u, // uint32_t bufferRowLength;
1653 0u, // uint32_t bufferImageHeight;
1654 defaultSourceLayer, // VkImageSubresourceLayers imageSubresource;
1655 {0, 0, 0}, // VkOffset3D imageOffset;
1656 {16, 16, 1} // VkExtent3D imageExtent;
1658 CopyRegion copyRegion;
1659 copyRegion.bufferImageCopy = bufferImageCopy;
1661 params.regions.push_back(copyRegion);
1663 copiesAndBlittingTests->addChild(new CopyImageToBufferTestCase(testCtx, "image_to_buffer", description.str(), params));
1666 // Copy buffer to image testcases.
1668 std::ostringstream description;
1669 description << "Copy from buffer to image";
1672 params.src.buffer.size = 256 * 256;
1673 params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
1674 params.dst.image.extent = defaultExtent;
1676 const VkBufferImageCopy bufferImageCopy =
1678 0u, // VkDeviceSize bufferOffset;
1679 0u, // uint32_t bufferRowLength;
1680 0u, // uint32_t bufferImageHeight;
1681 defaultSourceLayer, // VkImageSubresourceLayers imageSubresource;
1682 {0, 0, 0}, // VkOffset3D imageOffset;
1683 {16, 16, 1} // VkExtent3D imageExtent;
1685 CopyRegion copyRegion;
1686 copyRegion.bufferImageCopy = bufferImageCopy;
1688 params.regions.push_back(copyRegion);
1690 copiesAndBlittingTests->addChild(new CopyBufferToImageTestCase(testCtx, "buffer_to_image", description.str(), params));
1694 std::ostringstream description;
1695 description << "Copy from buffer to buffer: whole buffer.";
1698 params.src.buffer.size = 256;
1699 params.dst.buffer.size = 256;
1700 const VkBufferCopy bufferCopy = {
1701 0u, // VkDeviceSize srcOffset;
1702 0u, // VkDeviceSize dstOffset;
1703 256u, // VkDeviceSize size;
1705 CopyRegion copyRegion;
1706 copyRegion.bufferCopy = bufferCopy;
1708 params.regions.push_back(copyRegion);
1710 copiesAndBlittingTests->addChild(new BufferToBufferTestCase(testCtx, "buffer_to_buffer_whole", description.str(), params));
1714 std::ostringstream description;
1715 description << "Copy from buffer to buffer: small area.";
1718 params.src.buffer.size = 16;
1719 params.dst.buffer.size = 16;
1720 const VkBufferCopy bufferCopy = {
1721 12u, // VkDeviceSize srcOffset;
1722 4u, // VkDeviceSize dstOffset;
1723 1u, // VkDeviceSize size;
1725 CopyRegion copyRegion;
1726 copyRegion.bufferCopy = bufferCopy;
1728 params.regions.push_back(copyRegion);
1730 copiesAndBlittingTests->addChild(new BufferToBufferTestCase(testCtx, "buffer_to_buffer_small", description.str(), params));
1734 std::ostringstream description;
1735 description << "Copy from buffer to buffer: more regions.";
1737 const deUint32 size = 16;
1740 params.src.buffer.size = size;
1741 params.dst.buffer.size = size * (size + 1);
1743 // Copy region with size 0..size
1744 for (unsigned int i = 0; i <= size; i++)
1746 const VkBufferCopy bufferCopy = {
1747 0, // VkDeviceSize srcOffset;
1748 i*size, // VkDeviceSize dstOffset;
1749 i, // VkDeviceSize size;
1751 CopyRegion copyRegion;
1752 copyRegion.bufferCopy = bufferCopy;
1753 params.regions.push_back(copyRegion);
1755 copiesAndBlittingTests->addChild(new BufferToBufferTestCase(testCtx, "buffer_to_buffer_regions", description.str(), params));
1759 std::ostringstream description;
1760 description << "Copy from image to image depth";
1763 params.src.image.format = VK_FORMAT_D32_SFLOAT;
1764 params.src.image.extent = defaultExtent;
1765 params.dst.image.format = VK_FORMAT_D32_SFLOAT;
1766 params.dst.image.extent = defaultExtent;
1769 const VkImageSubresourceLayers sourceLayer =
1771 VK_IMAGE_ASPECT_DEPTH_BIT, // VkImageAspectFlags aspectMask;
1772 0u, // uint32_t mipLevel;
1773 0u, // uint32_t baseArrayLayer;
1774 1u // uint32_t layerCount;
1776 const VkImageCopy testCopy =
1778 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1779 {0, 0, 0}, // VkOffset3D srcOffset;
1780 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1781 {64, 98, 0}, // VkOffset3D dstOffset;
1782 {16, 16, 1}, // VkExtent3D extent;
1785 CopyRegion imageCopy;
1786 imageCopy.imageCopy = testCopy;
1788 params.regions.push_back(imageCopy);
1791 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "image_to_image_depth", description.str(), params));
1795 std::ostringstream description;
1796 description << "Copy from image to image stencil";
1799 params.src.image.format = VK_FORMAT_S8_UINT;
1800 params.src.image.extent = defaultExtent;
1801 params.dst.image.format = VK_FORMAT_S8_UINT;
1802 params.dst.image.extent = defaultExtent;
1805 const VkImageSubresourceLayers sourceLayer =
1807 VK_IMAGE_ASPECT_STENCIL_BIT, // VkImageAspectFlags aspectMask;
1808 0u, // uint32_t mipLevel;
1809 0u, // uint32_t baseArrayLayer;
1810 1u // uint32_t layerCount;
1812 const VkImageCopy testCopy =
1814 sourceLayer, // VkImageSubresourceLayers srcSubresource;
1815 {0, 0, 0}, // VkOffset3D srcOffset;
1816 sourceLayer, // VkImageSubresourceLayers dstSubresource;
1817 {64, 98, 0}, // VkOffset3D dstOffset;
1818 {16, 16, 1}, // VkExtent3D extent;
1821 CopyRegion imageCopy;
1822 imageCopy.imageCopy = testCopy;
1824 params.regions.push_back(imageCopy);
1827 copiesAndBlittingTests->addChild(new CopyImageToImageTestCase(testCtx, "image_to_image_stencil", description.str(), params));
1830 return copiesAndBlittingTests.release();