1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7 * Copyright (c) 2015 Google Inc.
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
21 *//*--------------------------------------------------------------------*/
24 #include "vktTestCaseUtil.hpp"
25 #include "vkBuilderUtil.hpp"
26 #include "vkPlatform.hpp"
27 #include "vkRefUtil.hpp"
28 #include "vkQueryUtil.hpp"
29 #include "vkMemUtil.hpp"
30 #include "vkDeviceUtil.hpp"
31 #include "tcuTextureUtil.hpp"
32 #include "vkImageUtil.hpp"
33 #include "vkPrograms.hpp"
34 #include "vkTypeUtil.hpp"
35 #include "vkAllocationCallbackUtil.hpp"
36 #include "vktApiCommandBuffersTests.hpp"
37 #include "vktApiBufferComputeInstance.hpp"
38 #include "vktApiComputeInstanceResultBuffer.hpp"
39 #include "deSharedPtr.hpp"
51 typedef de::SharedPtr<vk::Unique<vk::VkEvent> > VkEventSp;
54 const deUint64 INFINITE_TIMEOUT = ~(deUint64)0u;
57 template <deUint32 NumBuffers>
58 class CommandBufferBareTestEnvironment
61 CommandBufferBareTestEnvironment (Context& context,
62 VkCommandPoolCreateFlags commandPoolCreateFlags);
64 VkCommandPool getCommandPool (void) const { return *m_commandPool; }
65 VkCommandBuffer getCommandBuffer (deUint32 bufferIndex) const;
69 const VkDevice m_device;
70 const DeviceInterface& m_vkd;
71 const VkQueue m_queue;
72 const deUint32 m_queueFamilyIndex;
73 Allocator& m_allocator;
75 // \note All VkCommandBuffers are allocated from m_commandPool so there is no need
76 // to free them separately as the auto-generated dtor will do that through
77 // destroying the pool.
78 Move<VkCommandPool> m_commandPool;
79 VkCommandBuffer m_primaryCommandBuffers[NumBuffers];
82 template <deUint32 NumBuffers>
83 CommandBufferBareTestEnvironment<NumBuffers>::CommandBufferBareTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags)
85 , m_device (context.getDevice())
86 , m_vkd (context.getDeviceInterface())
87 , m_queue (context.getUniversalQueue())
88 , m_queueFamilyIndex (context.getUniversalQueueFamilyIndex())
89 , m_allocator (context.getDefaultAllocator())
91 const VkCommandPoolCreateInfo cmdPoolCreateInfo =
93 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
94 DE_NULL, // const void* pNext;
95 commandPoolCreateFlags, // VkCommandPoolCreateFlags flags;
96 m_queueFamilyIndex // deUint32 queueFamilyIndex;
99 m_commandPool = createCommandPool(m_vkd, m_device, &cmdPoolCreateInfo, DE_NULL);
101 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
103 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
104 DE_NULL, // const void* pNext;
105 *m_commandPool, // VkCommandPool commandPool;
106 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
107 NumBuffers // deUint32 commandBufferCount;
110 VK_CHECK(m_vkd.allocateCommandBuffers(m_device, &cmdBufferAllocateInfo, m_primaryCommandBuffers));
113 template <deUint32 NumBuffers>
114 VkCommandBuffer CommandBufferBareTestEnvironment<NumBuffers>::getCommandBuffer(deUint32 bufferIndex) const
116 DE_ASSERT(bufferIndex < NumBuffers);
117 return m_primaryCommandBuffers[bufferIndex];
120 class CommandBufferRenderPassTestEnvironment : public CommandBufferBareTestEnvironment<1>
123 CommandBufferRenderPassTestEnvironment (Context& context,
124 VkCommandPoolCreateFlags commandPoolCreateFlags);
126 VkRenderPass getRenderPass (void) const { return *m_renderPass; }
127 VkFramebuffer getFrameBuffer (void) const { return *m_frameBuffer; }
128 VkCommandBuffer getPrimaryCommandBuffer (void) const { return getCommandBuffer(0); }
129 VkCommandBuffer getSecondaryCommandBuffer (void) const { return *m_secondaryCommandBuffer; }
131 void beginPrimaryCommandBuffer (VkCommandBufferUsageFlags usageFlags);
132 void beginSecondaryCommandBuffer (VkCommandBufferUsageFlags usageFlags);
133 void beginRenderPass (VkSubpassContents content);
134 void submitPrimaryCommandBuffer (void);
135 de::MovePtr<tcu::TextureLevel> readColorAttachment (void);
137 static const VkImageType DEFAULT_IMAGE_TYPE;
138 static const VkFormat DEFAULT_IMAGE_FORMAT;
139 static const VkExtent3D DEFAULT_IMAGE_SIZE;
140 static const VkRect2D DEFAULT_IMAGE_AREA;
144 Move<VkImage> m_colorImage;
145 Move<VkImageView> m_colorImageView;
146 Move<VkRenderPass> m_renderPass;
147 Move<VkFramebuffer> m_frameBuffer;
148 de::MovePtr<Allocation> m_colorImageMemory;
149 Move<VkCommandBuffer> m_secondaryCommandBuffer;
153 const VkImageType CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_TYPE = VK_IMAGE_TYPE_2D;
154 const VkFormat CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_FORMAT = VK_FORMAT_R8G8B8A8_UINT;
155 const VkExtent3D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE = {255, 255, 1};
156 const VkRect2D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA =
158 { 0u, 0u, }, // VkOffset2D offset;
159 { DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height }, // VkExtent2D extent;
162 CommandBufferRenderPassTestEnvironment::CommandBufferRenderPassTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags)
163 : CommandBufferBareTestEnvironment<1> (context, commandPoolCreateFlags)
166 const VkAttachmentDescription colorAttDesc =
168 0u, // VkAttachmentDescriptionFlags flags;
169 DEFAULT_IMAGE_FORMAT, // VkFormat format;
170 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
171 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
172 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
173 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
174 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
175 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
176 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
179 const VkAttachmentDescription attachments[1] =
184 const VkAttachmentReference colorAttRef =
186 0u, // deUint32 attachment;
187 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
190 const VkSubpassDescription subpassDesc[1] =
193 0u, // VkSubpassDescriptionFlags flags;
194 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
195 0u, // deUint32 inputAttachmentCount;
196 DE_NULL, // const VkAttachmentReference* pInputAttachments;
197 1u, // deUint32 colorAttachmentCount;
198 &colorAttRef, // const VkAttachmentReference* pColorAttachments;
199 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
200 DE_NULL, // const VkAttachmentReference* depthStencilAttachment;
201 0u, // deUint32 preserveAttachmentCount;
202 DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
206 const VkRenderPassCreateInfo renderPassCreateInfo =
208 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
209 DE_NULL, // const void* pNext;
210 0u, // VkRenderPassCreateFlags flags;
211 1u, // deUint32 attachmentCount;
212 attachments, // const VkAttachmentDescription* pAttachments;
213 1u, // deUint32 subpassCount;
214 subpassDesc, // const VkSubpassDescription* pSubpasses;
215 0u, // deUint32 dependencyCount;
216 DE_NULL, // const VkSubpassDependency* pDependencies;
219 m_renderPass = createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
223 const VkImageCreateInfo imageCreateInfo =
225 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
226 DE_NULL, // const void* pNext;
227 0u, // VkImageCreateFlags flags;
228 DEFAULT_IMAGE_TYPE, // VkImageType imageType;
229 DEFAULT_IMAGE_FORMAT, // VkFormat format;
230 DEFAULT_IMAGE_SIZE, // VkExtent3D extent;
231 1, // deUint32 mipLevels;
232 1, // deUint32 arrayLayers;
233 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
234 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
235 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
236 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
237 VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
238 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
239 1, // deUint32 queueFamilyIndexCount;
240 &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
241 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
244 m_colorImage = createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
247 m_colorImageMemory = m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, *m_colorImage), MemoryRequirement::Any);
248 VK_CHECK(m_vkd.bindImageMemory(m_device, *m_colorImage, m_colorImageMemory->getMemory(), m_colorImageMemory->getOffset()));
251 const VkImageViewCreateInfo imageViewCreateInfo =
253 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
254 DE_NULL, // const void* pNext;
255 0u, // VkImageViewCreateFlags flags;
256 *m_colorImage, // VkImage image;
257 VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
258 DEFAULT_IMAGE_FORMAT, // VkFormat format;
260 VK_COMPONENT_SWIZZLE_R,
261 VK_COMPONENT_SWIZZLE_G,
262 VK_COMPONENT_SWIZZLE_B,
263 VK_COMPONENT_SWIZZLE_A
264 }, // VkComponentMapping components;
266 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
267 0u, // deUint32 baseMipLevel;
268 1u, // deUint32 mipLevels;
269 0u, // deUint32 baseArrayLayer;
270 1u, // deUint32 arraySize;
271 }, // VkImageSubresourceRange subresourceRange;
274 m_colorImageView = createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL);
278 const VkImageView attachmentViews[1] =
283 const VkFramebufferCreateInfo framebufferCreateInfo =
285 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
286 DE_NULL, // const void* pNext;
287 0u, // VkFramebufferCreateFlags flags;
288 *m_renderPass, // VkRenderPass renderPass;
289 1, // deUint32 attachmentCount;
290 attachmentViews, // const VkImageView* pAttachments;
291 DEFAULT_IMAGE_SIZE.width, // deUint32 width;
292 DEFAULT_IMAGE_SIZE.height, // deUint32 height;
293 1u, // deUint32 layers;
296 m_frameBuffer = createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL);
300 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
302 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
303 DE_NULL, // const void* pNext;
304 *m_commandPool, // VkCommandPool commandPool;
305 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
306 1u // deUint32 commandBufferCount;
309 m_secondaryCommandBuffer = allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo);
314 void CommandBufferRenderPassTestEnvironment::beginRenderPass(VkSubpassContents content)
316 const VkClearValue clearValues[1] =
318 makeClearValueColorU32(17, 59, 163, 251),
321 const VkRenderPassBeginInfo renderPassBeginInfo =
323 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
324 DE_NULL, // const void* pNext;
325 *m_renderPass, // VkRenderPass renderPass;
326 *m_frameBuffer, // VkFramebuffer framebuffer;
327 DEFAULT_IMAGE_AREA, // VkRect2D renderArea;
328 1u, // deUint32 clearValueCount;
329 clearValues // const VkClearValue* pClearValues;
332 m_vkd.cmdBeginRenderPass(m_primaryCommandBuffers[0], &renderPassBeginInfo, content);
335 void CommandBufferRenderPassTestEnvironment::beginPrimaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
337 const VkCommandBufferBeginInfo commandBufferBeginInfo =
339 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
340 DE_NULL, // const void* pNext;
341 usageFlags, // VkCommandBufferUsageFlags flags;
342 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
345 VK_CHECK(m_vkd.beginCommandBuffer(m_primaryCommandBuffers[0], &commandBufferBeginInfo));
350 void CommandBufferRenderPassTestEnvironment::beginSecondaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
352 const VkCommandBufferInheritanceInfo commandBufferInheritanceInfo =
354 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
355 DE_NULL, // const void* pNext;
356 *m_renderPass, // VkRenderPass renderPass;
357 0u, // deUint32 subpass;
358 *m_frameBuffer, // VkFramebuffer framebuffer;
359 VK_FALSE, // VkBool32 occlusionQueryEnable;
360 0u, // VkQueryControlFlags queryFlags;
361 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
364 const VkCommandBufferBeginInfo commandBufferBeginInfo =
366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
367 DE_NULL, // const void* pNext;
368 usageFlags, // VkCommandBufferUsageFlags flags;
369 &commandBufferInheritanceInfo // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
372 VK_CHECK(m_vkd.beginCommandBuffer(*m_secondaryCommandBuffer, &commandBufferBeginInfo));
376 void CommandBufferRenderPassTestEnvironment::submitPrimaryCommandBuffer(void)
379 const VkFenceCreateInfo fenceCreateInfo =
381 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
382 DE_NULL, // const void* pNext;
383 0u // VkFenceCreateFlags flags;
386 const Unique<VkFence> fence (createFence(m_vkd, m_device, &fenceCreateInfo));
389 const VkSubmitInfo submitInfo =
391 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
392 DE_NULL, // const void* pNext;
393 0u, // deUint32 waitSemaphoreCount;
394 DE_NULL, // const VkSemaphore* pWaitSemaphores;
395 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
396 1u, // deUint32 commandBufferCount;
397 m_primaryCommandBuffers, // const VkCommandBuffer* pCommandBuffers;
398 0u, // deUint32 signalSemaphoreCount;
399 DE_NULL // const VkSemaphore* pSignalSemaphores;
402 VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence));
404 VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull));
408 de::MovePtr<tcu::TextureLevel> CommandBufferRenderPassTestEnvironment::readColorAttachment ()
410 Move<VkBuffer> buffer;
411 de::MovePtr<Allocation> bufferAlloc;
412 const tcu::TextureFormat tcuFormat = mapVkFormat(DEFAULT_IMAGE_FORMAT);
413 const VkDeviceSize pixelDataSize = DEFAULT_IMAGE_SIZE.height * DEFAULT_IMAGE_SIZE.height * tcuFormat.getPixelSize();
414 de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(tcuFormat, DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height));
416 // Create destination buffer
418 const VkBufferCreateInfo bufferParams =
420 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
421 DE_NULL, // const void* pNext;
422 0u, // VkBufferCreateFlags flags;
423 pixelDataSize, // VkDeviceSize size;
424 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
425 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
426 0u, // deUint32 queueFamilyIndexCount;
427 DE_NULL // const deUint32* pQueueFamilyIndices;
430 buffer = createBuffer(m_vkd, m_device, &bufferParams);
431 bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible);
432 VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
435 // Barriers for copying image to buffer
437 const VkImageMemoryBarrier imageBarrier =
439 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
440 DE_NULL, // const void* pNext;
441 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
442 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
443 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
444 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
445 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
446 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
447 *m_colorImage, // VkImage image;
448 { // VkImageSubresourceRange subresourceRange;
449 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
450 0u, // deUint32 baseMipLevel;
451 1u, // deUint32 mipLevels;
452 0u, // deUint32 baseArraySlice;
453 1u // deUint32 arraySize;
457 const VkBufferMemoryBarrier bufferBarrier =
459 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
460 DE_NULL, // const void* pNext;
461 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
462 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
463 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
464 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
465 *buffer, // VkBuffer buffer;
466 0u, // VkDeviceSize offset;
467 pixelDataSize // VkDeviceSize size;
470 // Copy image to buffer
472 const VkBufferImageCopy copyRegion =
474 0u, // VkDeviceSize bufferOffset;
475 DEFAULT_IMAGE_SIZE.width, // deUint32 bufferRowLength;
476 DEFAULT_IMAGE_SIZE.height, // deUint32 bufferImageHeight;
477 { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource;
478 { 0, 0, 0 }, // VkOffset3D imageOffset;
479 DEFAULT_IMAGE_SIZE // VkExtent3D imageExtent;
482 beginPrimaryCommandBuffer(0);
483 m_vkd.cmdPipelineBarrier(m_primaryCommandBuffers[0], VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
484 m_vkd.cmdCopyImageToBuffer(m_primaryCommandBuffers[0], *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region);
485 m_vkd.cmdPipelineBarrier(m_primaryCommandBuffers[0], VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
486 VK_CHECK(m_vkd.endCommandBuffer(m_primaryCommandBuffers[0]));
488 submitPrimaryCommandBuffer();
491 invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
492 tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
499 /********* 19.1. Command Pools (5.1 in VK 1.0 Spec) ***************************/
500 tcu::TestStatus createPoolNullParamsTest(Context& context)
502 const VkDevice vkDevice = context.getDevice();
503 const DeviceInterface& vk = context.getDeviceInterface();
504 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
506 const VkCommandPoolCreateInfo cmdPoolParams =
508 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
511 queueFamilyIndex, // queueFamilyIndex;
514 createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
516 return tcu::TestStatus::pass("Command Pool allocated correctly.");
519 tcu::TestStatus createPoolNonNullAllocatorTest(Context& context)
521 const VkDevice vkDevice = context.getDevice();
522 const DeviceInterface& vk = context.getDeviceInterface();
523 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
524 const VkAllocationCallbacks* allocationCallbacks = getSystemAllocator();
526 const VkCommandPoolCreateInfo cmdPoolParams =
528 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
531 queueFamilyIndex, // queueFamilyIndex;
534 createCommandPool(vk, vkDevice, &cmdPoolParams, allocationCallbacks);
536 return tcu::TestStatus::pass("Command Pool allocated correctly.");
539 tcu::TestStatus createPoolTransientBitTest(Context& context)
541 const VkDevice vkDevice = context.getDevice();
542 const DeviceInterface& vk = context.getDeviceInterface();
543 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
545 const VkCommandPoolCreateInfo cmdPoolParams =
547 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
549 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags;
550 queueFamilyIndex, // queueFamilyIndex;
553 createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
555 return tcu::TestStatus::pass("Command Pool allocated correctly.");
558 tcu::TestStatus createPoolResetBitTest(Context& context)
560 const VkDevice vkDevice = context.getDevice();
561 const DeviceInterface& vk = context.getDeviceInterface();
562 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
564 const VkCommandPoolCreateInfo cmdPoolParams =
566 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
568 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
569 queueFamilyIndex, // queueFamilyIndex;
572 createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
574 return tcu::TestStatus::pass("Command Pool allocated correctly.");
577 tcu::TestStatus resetPoolReleaseResourcesBitTest(Context& context)
579 const VkDevice vkDevice = context.getDevice();
580 const DeviceInterface& vk = context.getDeviceInterface();
581 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
583 const VkCommandPoolCreateInfo cmdPoolParams =
585 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
588 queueFamilyIndex, // queueFamilyIndex;
591 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
593 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
595 return tcu::TestStatus::pass("Command Pool allocated correctly.");
598 tcu::TestStatus resetPoolNoFlagsTest(Context& context)
600 const VkDevice vkDevice = context.getDevice();
601 const DeviceInterface& vk = context.getDeviceInterface();
602 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
604 const VkCommandPoolCreateInfo cmdPoolParams =
606 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
609 queueFamilyIndex, // queueFamilyIndex;
612 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
614 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, 0u));
616 return tcu::TestStatus::pass("Command Pool allocated correctly.");
619 bool executeCommandBuffer (const VkDevice device,
620 const DeviceInterface& vk,
622 const VkCommandBuffer commandBuffer,
623 const bool exitBeforeEndCommandBuffer = false)
625 const VkEventCreateInfo eventCreateInfo =
627 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, //VkStructureType sType;
628 DE_NULL, //const void* pNext;
629 0u //VkEventCreateFlags flags;
631 const Unique<VkEvent> event (createEvent(vk, device, &eventCreateInfo));
632 const VkCommandBufferBeginInfo commandBufferBeginInfo =
634 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, //VkStructureType sType;
635 DE_NULL, //const void* pNext;
636 0u, //VkCommandBufferUsageFlags flags;
637 (const VkCommandBufferInheritanceInfo*)DE_NULL //const VkCommandBufferInheritanceInfo* pInheritanceInfo;
640 VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufferBeginInfo));
642 const VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
643 vk.cmdSetEvent(commandBuffer, *event, stageMask);
644 if (exitBeforeEndCommandBuffer)
645 return exitBeforeEndCommandBuffer;
647 VK_CHECK(vk.endCommandBuffer(commandBuffer));
650 const VkFenceCreateInfo fenceCreateInfo =
652 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, //VkStructureType sType;
653 DE_NULL, //const void* pNext;
654 0u //VkFenceCreateFlags flags;
656 const Unique<VkFence> fence (createFence(vk, device, &fenceCreateInfo));
657 const VkSubmitInfo submitInfo =
659 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
661 0u, // waitSemaphoreCount
662 DE_NULL, // pWaitSemaphores
663 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
664 1u, // commandBufferCount
665 &commandBuffer, // pCommandBuffers
666 0u, // signalSemaphoreCount
667 DE_NULL // pSignalSemaphores
670 // Submit the command buffer to the queue
671 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
672 // wait for end of execution of queue
673 VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
675 // check if buffer has been executed
676 const VkResult result = vk.getEventStatus(device, *event);
677 return result == VK_EVENT_SET;
680 tcu::TestStatus resetPoolReuseTest (Context& context)
682 const VkDevice vkDevice = context.getDevice();
683 const DeviceInterface& vk = context.getDeviceInterface();
684 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
685 const VkQueue queue = context.getUniversalQueue();
687 const VkCommandPoolCreateInfo cmdPoolParams =
689 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
692 queueFamilyIndex // queueFamilyIndex;
694 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
695 const VkCommandBufferAllocateInfo cmdBufParams =
697 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
699 *cmdPool, // commandPool;
700 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
703 const Move<VkCommandBuffer> commandBuffers[] =
705 allocateCommandBuffer(vk, vkDevice, &cmdBufParams),
706 allocateCommandBuffer(vk, vkDevice, &cmdBufParams)
709 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
710 return tcu::TestStatus::fail("Failed");
711 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1]), true))
712 return tcu::TestStatus::fail("Failed");
714 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
716 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
717 return tcu::TestStatus::fail("Failed");
718 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1])))
719 return tcu::TestStatus::fail("Failed");
722 const Unique<VkCommandBuffer> afterResetCommandBuffers(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
723 if (!executeCommandBuffer(vkDevice, vk, queue, *afterResetCommandBuffers))
724 return tcu::TestStatus::fail("Failed");
727 return tcu::TestStatus::pass("Passed");
730 /******** 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) ******************/
731 tcu::TestStatus allocatePrimaryBufferTest(Context& context)
733 const VkDevice vkDevice = context.getDevice();
734 const DeviceInterface& vk = context.getDeviceInterface();
735 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
737 const VkCommandPoolCreateInfo cmdPoolParams =
739 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
741 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
742 queueFamilyIndex, // queueFamilyIndex;
744 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
747 const VkCommandBufferAllocateInfo cmdBufParams =
749 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
751 *cmdPool, // commandPool;
752 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
755 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
757 return tcu::TestStatus::pass("Buffer was created correctly.");
760 tcu::TestStatus allocateManyPrimaryBuffersTest(Context& context)
763 const VkDevice vkDevice = context.getDevice();
764 const DeviceInterface& vk = context.getDeviceInterface();
765 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
767 const VkCommandPoolCreateInfo cmdPoolParams =
769 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
770 DE_NULL, // const void* pNext;
771 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
772 queueFamilyIndex, // deUint32 queueFamilyIndex;
774 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
776 // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
777 #if (DE_PTR_SIZE == 4)
778 const unsigned minCommandBuffer = 1024;
780 const unsigned minCommandBuffer = 10000;
784 const VkCommandBufferAllocateInfo cmdBufParams =
786 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
787 DE_NULL, // const void* pNext;
788 *cmdPool, // VkCommandPool pool;
789 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
790 minCommandBuffer, // uint32_t bufferCount;
793 // do not keep the handles to buffers, as they will be freed with command pool
795 // allocate the minimum required amount of buffers
796 VkCommandBuffer cmdBuffers[minCommandBuffer];
797 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
799 std::ostringstream out;
800 out << "allocateManyPrimaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
802 return tcu::TestStatus::pass(out.str());
805 tcu::TestStatus allocateSecondaryBufferTest(Context& context)
807 const VkDevice vkDevice = context.getDevice();
808 const DeviceInterface& vk = context.getDeviceInterface();
809 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
811 const VkCommandPoolCreateInfo cmdPoolParams =
813 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
815 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
816 queueFamilyIndex, // queueFamilyIndex;
818 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
821 const VkCommandBufferAllocateInfo cmdBufParams =
823 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
825 *cmdPool, // commandPool;
826 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
829 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
831 return tcu::TestStatus::pass("Buffer was created correctly.");
834 tcu::TestStatus allocateManySecondaryBuffersTest(Context& context)
837 const VkDevice vkDevice = context.getDevice();
838 const DeviceInterface& vk = context.getDeviceInterface();
839 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
841 const VkCommandPoolCreateInfo cmdPoolParams =
843 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
844 DE_NULL, // const void* pNext;
845 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
846 queueFamilyIndex, // deUint32 queueFamilyIndex;
848 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
850 // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
851 #if (DE_PTR_SIZE == 4)
852 const unsigned minCommandBuffer = 1024;
854 const unsigned minCommandBuffer = 10000;
858 const VkCommandBufferAllocateInfo cmdBufParams =
860 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
861 DE_NULL, // const void* pNext;
862 *cmdPool, // VkCommandPool pool;
863 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
864 minCommandBuffer, // uint32_t bufferCount;
867 // do not keep the handles to buffers, as they will be freed with command pool
869 // allocate the minimum required amount of buffers
870 VkCommandBuffer cmdBuffers[minCommandBuffer];
871 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
873 std::ostringstream out;
874 out << "allocateManySecondaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
876 return tcu::TestStatus::pass(out.str());
879 tcu::TestStatus executePrimaryBufferTest(Context& context)
881 const VkDevice vkDevice = context.getDevice();
882 const DeviceInterface& vk = context.getDeviceInterface();
883 const VkQueue queue = context.getUniversalQueue();
884 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
886 const VkCommandPoolCreateInfo cmdPoolParams =
888 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
889 DE_NULL, // const void* pNext;
890 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
891 queueFamilyIndex, // deUint32 queueFamilyIndex;
893 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
896 const VkCommandBufferAllocateInfo cmdBufParams =
898 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
899 DE_NULL, // const void* pNext;
900 *cmdPool, // VkCommandPool pool;
901 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
902 1u, // uint32_t bufferCount;
904 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
905 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
907 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
910 (const VkCommandBufferInheritanceInfo*)DE_NULL,
913 // Fill create info struct for event
914 const VkEventCreateInfo eventCreateInfo =
916 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
921 // create event that will be used to check if secondary command buffer has been executed
922 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
925 VK_CHECK(vk.resetEvent(vkDevice, *event));
927 // record primary command buffer
928 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
930 // allow execution of event during every stage of pipeline
931 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
933 // record setting event
934 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
936 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
938 const VkFenceCreateInfo fenceCreateInfo =
940 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
945 // create fence to wait for execution of queue
946 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
948 const VkSubmitInfo submitInfo =
950 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
952 0u, // waitSemaphoreCount
953 DE_NULL, // pWaitSemaphores
954 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
955 1, // commandBufferCount
956 &primCmdBuf.get(), // pCommandBuffers
957 0u, // signalSemaphoreCount
958 DE_NULL, // pSignalSemaphores
961 // Submit the command buffer to the queue
962 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
964 // wait for end of execution of queue
965 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
967 // check if buffer has been executed
968 VkResult result = vk.getEventStatus(vkDevice,*event);
969 if (result == VK_EVENT_SET)
970 return tcu::TestStatus::pass("Execute Primary Command Buffer succeeded");
972 return tcu::TestStatus::fail("Execute Primary Command Buffer FAILED");
975 tcu::TestStatus executeLargePrimaryBufferTest(Context& context)
977 const VkDevice vkDevice = context.getDevice();
978 const DeviceInterface& vk = context.getDeviceInterface();
979 const VkQueue queue = context.getUniversalQueue();
980 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
981 const deUint32 LARGE_BUFFER_SIZE = 10000;
983 const VkCommandPoolCreateInfo cmdPoolParams =
985 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
986 DE_NULL, // const void* pNext;
987 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
988 queueFamilyIndex, // deUint32 queueFamilyIndex;
990 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
993 const VkCommandBufferAllocateInfo cmdBufParams =
995 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
996 DE_NULL, // const void* pNext;
997 *cmdPool, // VkCommandPool pool;
998 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
999 1u, // uint32_t bufferCount;
1001 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1002 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1004 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1007 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1010 // Fill create info struct for event
1011 const VkEventCreateInfo eventCreateInfo =
1013 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1018 std::vector<VkEventSp> events;
1019 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
1020 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice, &eventCreateInfo, DE_NULL))));
1022 // record primary command buffer
1023 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1025 // set all the events
1026 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
1028 vk.cmdSetEvent(*primCmdBuf, events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1031 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1033 const VkFenceCreateInfo fenceCreateInfo =
1035 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1040 // create fence to wait for execution of queue
1041 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1043 const VkSubmitInfo submitInfo =
1045 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1047 0u, // waitSemaphoreCount
1048 DE_NULL, // pWaitSemaphores
1049 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1050 1, // commandBufferCount
1051 &primCmdBuf.get(), // pCommandBuffers
1052 0u, // signalSemaphoreCount
1053 DE_NULL, // pSignalSemaphores
1056 // Submit the command buffer to the queue
1057 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1059 // wait for end of execution of queue
1060 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1062 // check if the buffer was executed correctly - all events had their status
1064 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
1066 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
1068 if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
1070 testResult = tcu::TestStatus::fail("An event was not set.");
1075 if (!testResult.isComplete())
1076 testResult = tcu::TestStatus::pass("All events set correctly.");
1081 tcu::TestStatus resetBufferImplicitlyTest(Context& context)
1083 const VkDevice vkDevice = context.getDevice();
1084 const DeviceInterface& vk = context.getDeviceInterface();
1085 const VkQueue queue = context.getUniversalQueue();
1086 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1088 const VkCommandPoolCreateInfo cmdPoolParams =
1090 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
1092 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
1093 queueFamilyIndex, // queueFamilyIndex;
1095 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1098 const VkCommandBufferAllocateInfo cmdBufParams =
1100 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
1103 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
1106 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1108 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1110 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1113 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1116 const VkEventCreateInfo eventCreateInfo =
1118 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, // sType;
1122 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1124 // Put the command buffer in recording state.
1125 VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
1128 vk.cmdSetEvent(*cmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1130 VK_CHECK(vk.endCommandBuffer(*cmdBuf));
1132 // We'll use a fence to wait for the execution of the queue
1133 const VkFenceCreateInfo fenceCreateInfo =
1135 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType;
1139 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1141 const VkSubmitInfo submitInfo =
1143 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1145 0u, // waitSemaphoreCount
1146 DE_NULL, // pWaitSemaphores
1147 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1148 1u, // commandBufferCount
1149 &cmdBuf.get(), // pCommandBuffers
1150 0u, // signalSemaphoreCount
1151 DE_NULL, // pSignalSemaphores
1154 // Submitting the command buffer that sets the event to the queue
1155 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1157 // Waiting for the queue to finish executing
1158 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1159 // Reset the fence so that we can reuse it
1160 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1162 // Check if the buffer was executed
1163 if (vk.getEventStatus(vkDevice, *event) != VK_EVENT_SET)
1164 return tcu::TestStatus::fail("Failed to set the event.");
1167 vk.resetEvent(vkDevice, *event);
1168 if(vk.getEventStatus(vkDevice, *event) != VK_EVENT_RESET)
1169 return tcu::TestStatus::fail("Failed to reset the event.");
1171 // Reset the command buffer by putting it in recording state again. This
1172 // should empty the command buffer.
1173 VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
1174 VK_CHECK(vk.endCommandBuffer(*cmdBuf));
1176 // Submit the command buffer after resetting. It should have no commands
1177 // recorded, so the event should remain unsignaled.
1178 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1179 // Waiting for the queue to finish executing
1180 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1182 // Check if the event remained unset.
1183 if(vk.getEventStatus(vkDevice, *event) == VK_EVENT_RESET)
1184 return tcu::TestStatus::pass("Buffer was reset correctly.");
1186 return tcu::TestStatus::fail("Buffer was not reset correctly.");
1189 using de::SharedPtr;
1190 typedef SharedPtr<Unique<VkEvent> > VkEventShared;
1192 template<typename T>
1193 inline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move)
1195 return SharedPtr<Unique<T> >(new Unique<T>(move));
1198 bool submitAndCheck (Context& context, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
1200 const VkDevice vkDevice = context.getDevice();
1201 const DeviceInterface& vk = context.getDeviceInterface();
1202 const VkQueue queue = context.getUniversalQueue();
1204 const VkFenceCreateInfo fenceCreateInfo =
1206 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType;
1210 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1212 const VkSubmitInfo submitInfo =
1214 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1216 0u, // waitSemaphoreCount
1217 DE_NULL, // pWaitSemaphores
1218 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1219 static_cast<deUint32>(cmdBuffers.size()), // commandBufferCount
1220 &cmdBuffers[0], // pCommandBuffers
1221 0u, // signalSemaphoreCount
1222 DE_NULL, // pSignalSemaphores
1225 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1226 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1228 for(int eventNdx = 0; eventNdx < static_cast<int>(events.size()); ++eventNdx)
1230 if (vk.getEventStatus(vkDevice, **events[eventNdx]) != VK_EVENT_SET)
1232 vk.resetEvent(vkDevice, **events[eventNdx]);
1238 void createCommadBuffers (const DeviceInterface& vk,
1239 const VkDevice vkDevice,
1240 deUint32 bufferCount,
1242 const VkCommandBufferLevel cmdBufferLevel,
1243 VkCommandBuffer* pCommandBuffers)
1245 const VkCommandBufferAllocateInfo cmdBufParams =
1247 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1248 DE_NULL, // const void* pNext;
1249 pool, // VkCommandPool pool;
1250 cmdBufferLevel, // VkCommandBufferLevel level;
1251 bufferCount, // uint32_t bufferCount;
1253 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, pCommandBuffers));
1256 void addCommandsToBuffer (const DeviceInterface& vk, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
1258 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1260 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1262 (VkRenderPass)0u, // renderPass
1264 (VkFramebuffer)0u, // framebuffer
1265 VK_FALSE, // occlusionQueryEnable
1266 (VkQueryControlFlags)0u, // queryFlags
1267 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1270 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1272 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1275 &secCmdBufInheritInfo, // pInheritanceInfo;
1278 for(int bufferNdx = 0; bufferNdx < static_cast<int>(cmdBuffers.size()); ++bufferNdx)
1280 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[bufferNdx], &cmdBufBeginInfo));
1281 vk.cmdSetEvent(cmdBuffers[bufferNdx], **events[bufferNdx % events.size()], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1282 VK_CHECK(vk.endCommandBuffer(cmdBuffers[bufferNdx]));
1286 bool executeSecondaryCmdBuffer (Context& context,
1288 std::vector<VkCommandBuffer>& cmdBuffersSecondary,
1289 std::vector <VkEventShared>& events)
1291 const VkDevice vkDevice = context.getDevice();
1292 const DeviceInterface& vk = context.getDeviceInterface();
1293 std::vector<VkCommandBuffer> cmdBuffer (1);
1294 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1296 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1299 (const VkCommandBufferInheritanceInfo*)DE_NULL, // pInheritanceInfo;
1302 createCommadBuffers(vk, vkDevice, 1u, pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, &cmdBuffer[0]);
1303 VK_CHECK(vk.beginCommandBuffer(cmdBuffer[0], &cmdBufBeginInfo));
1304 vk.cmdExecuteCommands(cmdBuffer[0], static_cast<deUint32>(cmdBuffersSecondary.size()), &cmdBuffersSecondary[0]);
1305 VK_CHECK(vk.endCommandBuffer(cmdBuffer[0]));
1307 bool returnValue = submitAndCheck(context, cmdBuffer, events);
1308 vk.freeCommandBuffers(vkDevice, pool, 1u, &cmdBuffer[0]);
1312 tcu::TestStatus trimCommandPoolTest (Context& context, const VkCommandBufferLevel cmdBufferLevel)
1314 if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance1"))
1315 TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
1317 const VkDevice vkDevice = context.getDevice();
1318 const DeviceInterface& vk = context.getDeviceInterface();
1319 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1322 const deUint32 cmdBufferIterationCount = 300u;
1323 const deUint32 cmdBufferCount = 10u;
1325 const VkCommandPoolCreateInfo cmdPoolParams =
1327 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
1329 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
1330 queueFamilyIndex, // queueFamilyIndex;
1332 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1334 const VkEventCreateInfo eventCreateInfo =
1336 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, // sType;
1341 std::vector <VkEventShared> events;
1342 for (deUint32 ndx = 0u; ndx < cmdBufferCount; ++ndx)
1343 events.push_back(makeSharedPtr(createEvent(vk, vkDevice, &eventCreateInfo)));
1346 std::vector<VkCommandBuffer> cmdBuffers(cmdBufferCount);
1347 createCommadBuffers(vk, vkDevice, cmdBufferCount, *cmdPool, cmdBufferLevel, &cmdBuffers[0]);
1349 for (deUint32 cmdBufferIterationrNdx = 0; cmdBufferIterationrNdx < cmdBufferIterationCount; ++cmdBufferIterationrNdx)
1351 addCommandsToBuffer(vk, cmdBuffers, events);
1353 //Peak, situation when we use a lot more command buffers
1354 if (cmdBufferIterationrNdx % 10u == 0)
1356 std::vector<VkCommandBuffer> cmdBuffersPeak(cmdBufferCount * 10u);
1357 createCommadBuffers(vk, vkDevice, static_cast<deUint32>(cmdBuffersPeak.size()), *cmdPool, cmdBufferLevel, &cmdBuffersPeak[0]);
1358 addCommandsToBuffer(vk, cmdBuffersPeak, events);
1360 switch(cmdBufferLevel)
1362 case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
1363 if (!submitAndCheck(context, cmdBuffersPeak, events))
1364 return tcu::TestStatus::fail("Fail");
1366 case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
1367 if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffersPeak, events))
1368 return tcu::TestStatus::fail("Fail");
1373 vk.freeCommandBuffers(vkDevice, *cmdPool, static_cast<deUint32>(cmdBuffersPeak.size()), &cmdBuffersPeak[0]);
1376 vk.trimCommandPoolKHR(vkDevice, *cmdPool, (VkCommandPoolTrimFlagsKHR)0);
1378 switch(cmdBufferLevel)
1380 case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
1381 if (!submitAndCheck(context, cmdBuffers, events))
1382 return tcu::TestStatus::fail("Fail");
1384 case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
1385 if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffers, events))
1386 return tcu::TestStatus::fail("Fail");
1392 for (deUint32 bufferNdx = cmdBufferIterationrNdx % 3u; bufferNdx < cmdBufferCount; bufferNdx+=2u)
1394 vk.freeCommandBuffers(vkDevice, *cmdPool, 1u, &cmdBuffers[bufferNdx]);
1395 createCommadBuffers(vk, vkDevice, 1u, *cmdPool, cmdBufferLevel, &cmdBuffers[bufferNdx]);
1400 return tcu::TestStatus::pass("Pass");
1403 /******** 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) *****************/
1404 tcu::TestStatus recordSinglePrimaryBufferTest(Context& context)
1406 const VkDevice vkDevice = context.getDevice();
1407 const DeviceInterface& vk = context.getDeviceInterface();
1408 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1410 const VkCommandPoolCreateInfo cmdPoolParams =
1412 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1413 DE_NULL, // const void* pNext;
1414 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1415 queueFamilyIndex, // deUint32 queueFamilyIndex;
1417 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1420 const VkCommandBufferAllocateInfo cmdBufParams =
1422 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1423 DE_NULL, // const void* pNext;
1424 *cmdPool, // VkCommandPool pool;
1425 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1426 1u, // uint32_t bufferCount;
1428 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1430 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1432 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1435 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1438 // Fill create info struct for event
1439 const VkEventCreateInfo eventCreateInfo =
1441 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1446 // create event that will be used to check if secondary command buffer has been executed
1447 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1449 // record primary command buffer
1450 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1452 // record setting event
1453 vk.cmdSetEvent(*primCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1455 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1457 return tcu::TestStatus::pass("Primary buffer recorded successfully.");
1460 tcu::TestStatus recordLargePrimaryBufferTest(Context &context)
1463 const VkDevice vkDevice = context.getDevice();
1464 const DeviceInterface& vk = context.getDeviceInterface();
1465 const VkQueue queue = context.getUniversalQueue();
1466 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1468 const VkCommandPoolCreateInfo cmdPoolParams =
1470 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1471 DE_NULL, // const void* pNext;
1472 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1473 queueFamilyIndex, // deUint32 queueFamilyIndex;
1475 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1478 const VkCommandBufferAllocateInfo cmdBufParams =
1480 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1481 DE_NULL, // const void* pNext;
1482 *cmdPool, // VkCommandPool pool;
1483 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1484 1u, // uint32_t bufferCount;
1486 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1487 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1489 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1492 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1495 // Fill create info struct for event
1496 const VkEventCreateInfo eventCreateInfo =
1498 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1503 // create event that will be used to check if secondary command buffer has been executed
1504 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1507 VK_CHECK(vk.resetEvent(vkDevice, *event));
1509 // record primary command buffer
1510 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1512 // allow execution of event during every stage of pipeline
1513 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1515 // define minimal amount of commands to accept
1516 const long long unsigned minNumCommands = 10000llu;
1518 for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
1520 // record setting event
1521 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1523 // record resetting event
1524 vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
1528 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1530 const VkFenceCreateInfo fenceCreateInfo =
1532 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1537 // create fence to wait for execution of queue
1538 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1540 const VkSubmitInfo submitInfo =
1542 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1544 0u, // waitSemaphoreCount
1545 DE_NULL, // pWaitSemaphores
1546 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1547 1, // commandBufferCount
1548 &primCmdBuf.get(), // pCommandBuffers
1549 0u, // signalSemaphoreCount
1550 DE_NULL, // pSignalSemaphores
1553 // Submit the command buffer to the queue
1554 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1556 // wait for end of execution of queue
1557 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1559 return tcu::TestStatus::pass("hugeTest succeeded");
1562 tcu::TestStatus recordSingleSecondaryBufferTest(Context& context)
1564 const VkDevice vkDevice = context.getDevice();
1565 const DeviceInterface& vk = context.getDeviceInterface();
1566 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1568 const VkCommandPoolCreateInfo cmdPoolParams =
1570 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1571 DE_NULL, // const void* pNext;
1572 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1573 queueFamilyIndex, // deUint32 queueFamilyIndex;
1575 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1578 const VkCommandBufferAllocateInfo cmdBufParams =
1580 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1581 DE_NULL, // const void* pNext;
1582 *cmdPool, // VkCommandPool pool;
1583 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
1584 1u, // uint32_t bufferCount;
1586 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1588 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1590 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1592 (VkRenderPass)0u, // renderPass
1594 (VkFramebuffer)0u, // framebuffer
1595 VK_FALSE, // occlusionQueryEnable
1596 (VkQueryControlFlags)0u, // queryFlags
1597 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1599 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
1601 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1604 &secCmdBufInheritInfo,
1607 // Fill create info struct for event
1608 const VkEventCreateInfo eventCreateInfo =
1610 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1615 // create event that will be used to check if secondary command buffer has been executed
1616 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1618 // record primary command buffer
1619 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
1621 // record setting event
1622 vk.cmdSetEvent(*secCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1624 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
1626 return tcu::TestStatus::pass("Secondary buffer recorded successfully.");
1629 tcu::TestStatus recordLargeSecondaryBufferTest(Context &context)
1632 const VkDevice vkDevice = context.getDevice();
1633 const DeviceInterface& vk = context.getDeviceInterface();
1634 const VkQueue queue = context.getUniversalQueue();
1635 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1637 const VkCommandPoolCreateInfo cmdPoolParams =
1639 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1640 DE_NULL, // const void* pNext;
1641 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1642 queueFamilyIndex, // deUint32 queueFamilyIndex;
1644 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1647 const VkCommandBufferAllocateInfo cmdBufParams =
1649 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1650 DE_NULL, // const void* pNext;
1651 *cmdPool, // VkCommandPool pool;
1652 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1653 1u, // uint32_t bufferCount;
1655 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1656 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1658 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1661 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1664 // Fill create info struct for event
1665 const VkEventCreateInfo eventCreateInfo =
1667 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1672 // create event that will be used to check if secondary command buffer has been executed
1673 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1676 VK_CHECK(vk.resetEvent(vkDevice, *event));
1678 // record primary command buffer
1679 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1681 // allow execution of event during every stage of pipeline
1682 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1684 // define minimal amount of commands to accept
1685 const long long unsigned minNumCommands = 10000llu;
1687 for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
1689 // record setting event
1690 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1692 // record resetting event
1693 vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
1698 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1700 const VkFenceCreateInfo fenceCreateInfo =
1702 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1707 // create fence to wait for execution of queue
1708 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1710 const VkSubmitInfo submitInfo =
1712 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1714 0u, // waitSemaphoreCount
1715 DE_NULL, // pWaitSemaphores
1716 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1717 1, // commandBufferCount
1718 &primCmdBuf.get(), // pCommandBuffers
1719 0u, // signalSemaphoreCount
1720 DE_NULL, // pSignalSemaphores
1723 // Submit the command buffer to the queue
1724 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1726 // wait for end of execution of queue
1727 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1729 return tcu::TestStatus::pass("hugeTest succeeded");
1732 tcu::TestStatus submitPrimaryBufferTwiceTest(Context& context)
1735 const VkDevice vkDevice = context.getDevice();
1736 const DeviceInterface& vk = context.getDeviceInterface();
1737 const VkQueue queue = context.getUniversalQueue();
1738 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1740 const VkCommandPoolCreateInfo cmdPoolParams =
1742 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1743 DE_NULL, // const void* pNext;
1744 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1745 queueFamilyIndex, // deUint32 queueFamilyIndex;
1747 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1750 const VkCommandBufferAllocateInfo cmdBufParams =
1752 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1753 DE_NULL, // const void* pNext;
1754 *cmdPool, // VkCommandPool pool;
1755 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1756 1u, // uint32_t bufferCount;
1758 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1759 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1761 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1764 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1767 // Fill create info struct for event
1768 const VkEventCreateInfo eventCreateInfo =
1770 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1775 // create event that will be used to check if secondary command buffer has been executed
1776 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1779 VK_CHECK(vk.resetEvent(vkDevice, *event));
1781 // record primary command buffer
1782 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1784 // allow execution of event during every stage of pipeline
1785 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1787 // record setting event
1788 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1790 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1792 const VkFenceCreateInfo fenceCreateInfo =
1794 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1799 // create fence to wait for execution of queue
1800 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1802 const VkSubmitInfo submitInfo =
1804 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1806 0u, // waitSemaphoreCount
1807 DE_NULL, // pWaitSemaphores
1808 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1809 1, // commandBufferCount
1810 &primCmdBuf.get(), // pCommandBuffers
1811 0u, // signalSemaphoreCount
1812 DE_NULL, // pSignalSemaphores
1815 // submit primary buffer
1816 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1818 // wait for end of execution of queue
1819 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1820 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1821 // check if buffer has been executed
1822 VkResult result = vk.getEventStatus(vkDevice,*event);
1823 if (result != VK_EVENT_SET)
1824 return tcu::TestStatus::fail("Submit Twice Test FAILED");
1827 VK_CHECK(vk.resetEvent(vkDevice, *event));
1829 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1831 // wait for end of execution of queue
1832 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1834 // check if buffer has been executed
1835 result = vk.getEventStatus(vkDevice,*event);
1836 if (result != VK_EVENT_SET)
1837 return tcu::TestStatus::fail("Submit Twice Test FAILED");
1839 return tcu::TestStatus::pass("Submit Twice Test succeeded");
1842 tcu::TestStatus submitSecondaryBufferTwiceTest(Context& context)
1845 const VkDevice vkDevice = context.getDevice();
1846 const DeviceInterface& vk = context.getDeviceInterface();
1847 const VkQueue queue = context.getUniversalQueue();
1848 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1850 const VkCommandPoolCreateInfo cmdPoolParams =
1852 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1853 DE_NULL, // const void* pNext;
1854 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1855 queueFamilyIndex, // deUint32 queueFamilyIndex;
1858 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1861 const VkCommandBufferAllocateInfo cmdBufParams =
1863 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1864 DE_NULL, // const void* pNext;
1865 *cmdPool, // VkCommandPool pool;
1866 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1867 1u, // uint32_t bufferCount;
1870 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1871 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1873 // Secondary Command buffer
1874 const VkCommandBufferAllocateInfo secCmdBufParams =
1876 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1877 DE_NULL, // const void* pNext;
1878 *cmdPool, // VkCommandPool pool;
1879 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
1880 1u, // uint32_t bufferCount;
1882 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
1884 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1886 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1889 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1892 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1894 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1896 (VkRenderPass)0u, // renderPass
1898 (VkFramebuffer)0u, // framebuffer
1899 VK_FALSE, // occlusionQueryEnable
1900 (VkQueryControlFlags)0u, // queryFlags
1901 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1903 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
1905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1908 &secCmdBufInheritInfo,
1911 // Fill create info struct for event
1912 const VkEventCreateInfo eventCreateInfo =
1914 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
1919 // create event that will be used to check if secondary command buffer has been executed
1920 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
1923 VK_CHECK(vk.resetEvent(vkDevice, *event));
1925 // record first primary command buffer
1926 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
1928 // record secondary command buffer
1929 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
1931 // allow execution of event during every stage of pipeline
1932 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1934 // record setting event
1935 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
1938 // end recording of secondary buffers
1939 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
1941 // execute secondary buffer
1942 vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
1944 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
1946 const VkFenceCreateInfo fenceCreateInfo =
1948 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
1953 // create fence to wait for execution of queue
1954 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
1956 const VkSubmitInfo submitInfo1 =
1958 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1960 0u, // waitSemaphoreCount
1961 DE_NULL, // pWaitSemaphores
1962 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1963 1, // commandBufferCount
1964 &primCmdBuf1.get(), // pCommandBuffers
1965 0u, // signalSemaphoreCount
1966 DE_NULL, // pSignalSemaphores
1969 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
1971 // wait for end of execution of queue
1972 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1973 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1975 // check if secondary buffer has been executed
1976 VkResult result = vk.getEventStatus(vkDevice,*event);
1977 if (result != VK_EVENT_SET)
1978 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
1980 // reset first primary buffer
1981 vk.resetCommandBuffer( *primCmdBuf1, 0u);
1983 // reset event to allow receiving it again
1984 VK_CHECK(vk.resetEvent(vkDevice, *event));
1986 // record second primary command buffer
1987 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
1989 // execute secondary buffer
1990 vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
1993 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
1995 // submit second primary buffer, the secondary should be executed too
1996 const VkSubmitInfo submitInfo2 =
1998 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2000 0u, // waitSemaphoreCount
2001 DE_NULL, // pWaitSemaphores
2002 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2003 1, // commandBufferCount
2004 &primCmdBuf2.get(), // pCommandBuffers
2005 0u, // signalSemaphoreCount
2006 DE_NULL, // pSignalSemaphores
2008 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
2010 // wait for end of execution of queue
2011 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2013 // check if secondary buffer has been executed
2014 result = vk.getEventStatus(vkDevice,*event);
2015 if (result != VK_EVENT_SET)
2016 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
2018 return tcu::TestStatus::pass("Submit Twice Secondary Command Buffer succeeded");
2021 tcu::TestStatus oneTimeSubmitFlagPrimaryBufferTest(Context& context)
2024 const VkDevice vkDevice = context.getDevice();
2025 const DeviceInterface& vk = context.getDeviceInterface();
2026 const VkQueue queue = context.getUniversalQueue();
2027 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2029 const VkCommandPoolCreateInfo cmdPoolParams =
2031 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2032 DE_NULL, // const void* pNext;
2033 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2034 queueFamilyIndex, // deUint32 queueFamilyIndex;
2036 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2039 const VkCommandBufferAllocateInfo cmdBufParams =
2041 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2042 DE_NULL, // const void* pNext;
2043 *cmdPool, // VkCommandPool pool;
2044 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2045 1u, // uint32_t bufferCount;
2047 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2048 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2050 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2052 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
2053 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2056 // Fill create info struct for event
2057 const VkEventCreateInfo eventCreateInfo =
2059 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
2064 // create event that will be used to check if secondary command buffer has been executed
2065 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
2068 VK_CHECK(vk.resetEvent(vkDevice, *event));
2070 // record primary command buffer
2071 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2073 // allow execution of event during every stage of pipeline
2074 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2076 // record setting event
2077 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
2079 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2081 const VkFenceCreateInfo fenceCreateInfo =
2083 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2088 // create fence to wait for execution of queue
2089 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
2091 const VkSubmitInfo submitInfo =
2093 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2095 0u, // waitSemaphoreCount
2096 DE_NULL, // pWaitSemaphores
2097 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2098 1, // commandBufferCount
2099 &primCmdBuf.get(), // pCommandBuffers
2100 0u, // signalSemaphoreCount
2101 DE_NULL, // pSignalSemaphores
2104 // submit primary buffer
2105 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2107 // wait for end of execution of queue
2108 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2109 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
2111 // check if buffer has been executed
2112 VkResult result = vk.getEventStatus(vkDevice,*event);
2113 if (result != VK_EVENT_SET)
2114 return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
2116 // record primary command buffer again - implicit reset because of VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
2117 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2119 // allow execution of event during every stage of pipeline
2120 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2122 // record setting event
2123 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
2125 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2128 VK_CHECK(vk.resetEvent(vkDevice, *event));
2130 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2132 // wait for end of execution of queue
2133 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2135 // check if buffer has been executed
2136 result = vk.getEventStatus(vkDevice,*event);
2137 if (result != VK_EVENT_SET)
2138 return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
2140 return tcu::TestStatus::pass("oneTimeSubmitFlagPrimaryBufferTest succeeded");
2143 tcu::TestStatus oneTimeSubmitFlagSecondaryBufferTest(Context& context)
2146 const VkDevice vkDevice = context.getDevice();
2147 const DeviceInterface& vk = context.getDeviceInterface();
2148 const VkQueue queue = context.getUniversalQueue();
2149 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2151 const VkCommandPoolCreateInfo cmdPoolParams =
2153 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2154 DE_NULL, // const void* pNext;
2155 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2156 queueFamilyIndex, // deUint32 queueFamilyIndex;
2159 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2162 const VkCommandBufferAllocateInfo cmdBufParams =
2164 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2165 DE_NULL, // const void* pNext;
2166 *cmdPool, // VkCommandPool pool;
2167 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2168 1u, // uint32_t bufferCount;
2171 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2172 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2174 // Secondary Command buffer
2175 const VkCommandBufferAllocateInfo secCmdBufParams =
2177 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2178 DE_NULL, // const void* pNext;
2179 *cmdPool, // VkCommandPool pool;
2180 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2181 1u, // uint32_t bufferCount;
2183 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2185 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2187 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2190 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2193 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2195 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2197 (VkRenderPass)0u, // renderPass
2199 (VkFramebuffer)0u, // framebuffer
2200 VK_FALSE, // occlusionQueryEnable
2201 (VkQueryControlFlags)0u, // queryFlags
2202 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2204 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2206 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2208 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
2209 &secCmdBufInheritInfo,
2212 // Fill create info struct for event
2213 const VkEventCreateInfo eventCreateInfo =
2215 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
2220 // create event that will be used to check if secondary command buffer has been executed
2221 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
2224 VK_CHECK(vk.resetEvent(vkDevice, *event));
2226 // record first primary command buffer
2227 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
2229 // record secondary command buffer
2230 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2232 // allow execution of event during every stage of pipeline
2233 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2235 // record setting event
2236 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
2239 // end recording of secondary buffers
2240 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2242 // execute secondary buffer
2243 vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
2245 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
2247 const VkFenceCreateInfo fenceCreateInfo =
2249 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2254 // create fence to wait for execution of queue
2255 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
2257 const VkSubmitInfo submitInfo1 =
2259 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2261 0u, // waitSemaphoreCount
2262 DE_NULL, // pWaitSemaphores
2263 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2264 1, // commandBufferCount
2265 &primCmdBuf1.get(), // pCommandBuffers
2266 0u, // signalSemaphoreCount
2267 DE_NULL, // pSignalSemaphores
2270 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
2272 // wait for end of execution of queue
2273 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2274 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
2276 // check if secondary buffer has been executed
2277 VkResult result = vk.getEventStatus(vkDevice,*event);
2278 if (result != VK_EVENT_SET)
2279 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
2281 // reset first primary buffer
2282 vk.resetCommandBuffer( *primCmdBuf1, 0u);
2284 // reset event to allow receiving it again
2285 VK_CHECK(vk.resetEvent(vkDevice, *event));
2287 // record secondary command buffer again
2288 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2290 // allow execution of event during every stage of pipeline
2291 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2293 // record setting event
2294 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
2296 // end recording of secondary buffers
2297 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2299 // record second primary command buffer
2300 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
2302 // execute secondary buffer
2303 vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
2306 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
2308 // submit second primary buffer, the secondary should be executed too
2309 const VkSubmitInfo submitInfo2 =
2311 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2313 0u, // waitSemaphoreCount
2314 DE_NULL, // pWaitSemaphores
2315 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2316 1, // commandBufferCount
2317 &primCmdBuf2.get(), // pCommandBuffers
2318 0u, // signalSemaphoreCount
2319 DE_NULL, // pSignalSemaphores
2321 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
2323 // wait for end of execution of queue
2324 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2326 // check if secondary buffer has been executed
2327 result = vk.getEventStatus(vkDevice,*event);
2328 if (result != VK_EVENT_SET)
2329 return tcu::TestStatus::fail("oneTimeSubmitFlagSecondaryBufferTest FAILED");
2331 return tcu::TestStatus::pass("oneTimeSubmitFlagSecondaryBufferTest succeeded");
2334 tcu::TestStatus renderPassContinueTest(Context& context)
2336 const DeviceInterface& vkd = context.getDeviceInterface();
2337 CommandBufferRenderPassTestEnvironment env (context, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
2339 VkCommandBuffer primaryCommandBuffer = env.getPrimaryCommandBuffer();
2340 VkCommandBuffer secondaryCommandBuffer = env.getSecondaryCommandBuffer();
2341 const deUint32 clearColor[4] = { 2, 47, 131, 211 };
2343 const VkClearAttachment clearAttachment =
2345 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2346 0, // deUint32 colorAttachment;
2347 makeClearValueColorU32(clearColor[0],
2350 clearColor[3]) // VkClearValue clearValue;
2353 const VkClearRect clearRect =
2355 CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA, // VkRect2D rect;
2356 0u, // deUint32 baseArrayLayer;
2357 1u // deUint32 layerCount;
2360 env.beginSecondaryCommandBuffer(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
2361 vkd.cmdClearAttachments(secondaryCommandBuffer, 1, &clearAttachment, 1, &clearRect);
2362 VK_CHECK(vkd.endCommandBuffer(secondaryCommandBuffer));
2365 env.beginPrimaryCommandBuffer(0);
2366 env.beginRenderPass(VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
2367 vkd.cmdExecuteCommands(primaryCommandBuffer, 1, &secondaryCommandBuffer);
2368 vkd.cmdEndRenderPass(primaryCommandBuffer);
2370 VK_CHECK(vkd.endCommandBuffer(primaryCommandBuffer));
2372 env.submitPrimaryCommandBuffer();
2374 de::MovePtr<tcu::TextureLevel> result = env.readColorAttachment();
2375 tcu::PixelBufferAccess pixelBufferAccess = result->getAccess();
2377 for (deUint32 i = 0; i < (CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.width * CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.height); ++i)
2379 deUint8* colorData = reinterpret_cast<deUint8*>(pixelBufferAccess.getDataPtr());
2380 for (int colorComponent = 0; colorComponent < 4; ++colorComponent)
2381 if (colorData[i * 4 + colorComponent] != clearColor[colorComponent])
2382 return tcu::TestStatus::fail("clear value mismatch");
2385 return tcu::TestStatus::pass("render pass continue test passed");
2388 tcu::TestStatus simultaneousUsePrimaryBufferTest(Context& context)
2391 const VkDevice vkDevice = context.getDevice();
2392 const DeviceInterface& vk = context.getDeviceInterface();
2393 const VkQueue queue = context.getUniversalQueue();
2394 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2396 const VkCommandPoolCreateInfo cmdPoolParams =
2398 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2399 DE_NULL, // const void* pNext;
2400 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2401 queueFamilyIndex, // deUint32 queueFamilyIndex;
2403 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2406 const VkCommandBufferAllocateInfo cmdBufParams =
2408 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2409 DE_NULL, // const void* pNext;
2410 *cmdPool, // VkCommandPool pool;
2411 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2412 1u, // uint32_t bufferCount;
2414 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2415 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2417 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2419 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2420 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2423 // Fill create info struct for event
2424 const VkEventCreateInfo eventCreateInfo =
2426 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
2431 // create event that will be used to check if secondary command buffer has been executed
2432 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice, &eventCreateInfo));
2433 const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice, &eventCreateInfo));
2436 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
2438 // record primary command buffer
2439 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2442 vk.cmdWaitEvents(*primCmdBuf, 1u, &eventOne.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
2444 // Set the second event
2445 vk.cmdSetEvent(*primCmdBuf, eventTwo.get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
2447 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2449 const VkFenceCreateInfo fenceCreateInfo =
2451 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2456 // create fence to wait for execution of queue
2457 const Unique<VkFence> fence1 (createFence(vk, vkDevice, &fenceCreateInfo));
2458 const Unique<VkFence> fence2 (createFence(vk, vkDevice, &fenceCreateInfo));
2461 const VkSubmitInfo submitInfo =
2463 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2465 0u, // waitSemaphoreCount
2466 DE_NULL, // pWaitSemaphores
2467 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2468 1, // commandBufferCount
2469 &primCmdBuf.get(), // pCommandBuffers
2470 0u, // signalSemaphoreCount
2471 DE_NULL, // pSignalSemaphores
2474 // submit first buffer
2475 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence1));
2477 // submit second buffer
2478 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence2));
2480 // wait for both buffer to stop at event for 100 microseconds
2481 vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, 100000);
2482 vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, 100000);
2485 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
2487 // wait for end of execution of the first buffer
2488 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, INFINITE_TIMEOUT));
2489 // wait for end of execution of the second buffer
2490 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, INFINITE_TIMEOUT));
2492 // TODO: this will be true if the command buffer was executed only once
2493 // TODO: add some test that will say if it was executed twice
2495 // check if buffer has been executed
2496 VkResult result = vk.getEventStatus(vkDevice, *eventTwo);
2497 if (result == VK_EVENT_SET)
2498 return tcu::TestStatus::pass("simultaneous use - primary buffers test succeeded");
2500 return tcu::TestStatus::fail("simultaneous use - primary buffers test FAILED");
2503 tcu::TestStatus simultaneousUseSecondaryBufferTest(Context& context)
2505 const VkDevice vkDevice = context.getDevice();
2506 const DeviceInterface& vk = context.getDeviceInterface();
2507 const VkQueue queue = context.getUniversalQueue();
2508 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2510 const VkCommandPoolCreateInfo cmdPoolParams =
2512 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2513 DE_NULL, // const void* pNext;
2514 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2515 queueFamilyIndex, // deUint32 queueFamilyIndex;
2517 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2520 const VkCommandBufferAllocateInfo cmdBufParams =
2522 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2523 DE_NULL, // const void* pNext;
2524 *cmdPool, // VkCommandPool pool;
2525 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2526 1u, // uint32_t bufferCount;
2528 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2530 // Secondary Command buffer params
2531 const VkCommandBufferAllocateInfo secCmdBufParams =
2533 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2534 DE_NULL, // const void* pNext;
2535 *cmdPool, // VkCommandPool pool;
2536 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2537 1u, // uint32_t bufferCount;
2539 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2541 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2543 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2546 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2549 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2551 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2553 (VkRenderPass)0u, // renderPass
2555 (VkFramebuffer)0u, // framebuffer
2556 VK_FALSE, // occlusionQueryEnable
2557 (VkQueryControlFlags)0u, // queryFlags
2558 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2560 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2562 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2564 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2565 &secCmdBufInheritInfo,
2568 // Fill create info struct for event
2569 const VkEventCreateInfo eventCreateInfo =
2571 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
2576 // create event that will be used to check if secondary command buffer has been executed
2577 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice, &eventCreateInfo));
2578 const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice, &eventCreateInfo));
2581 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
2582 VK_CHECK(vk.resetEvent(vkDevice, *eventTwo));
2584 // record secondary command buffer
2585 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2587 // allow execution of event during every stage of pipeline
2588 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2591 vk.cmdWaitEvents(*secCmdBuf, 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
2594 vk.cmdSetEvent(*secCmdBuf, *eventTwo, stageMask);
2596 // end recording of secondary buffers
2597 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2599 // record primary command buffer
2600 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2602 // execute secondary buffer
2603 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2605 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2607 const VkFenceCreateInfo fenceCreateInfo =
2609 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2614 // create fence to wait for execution of queue
2615 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
2617 const VkSubmitInfo submitInfo =
2619 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2621 0u, // waitSemaphoreCount
2622 DE_NULL, // pWaitSemaphores
2623 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2624 1, // commandBufferCount
2625 &primCmdBuf.get(), // pCommandBuffers
2626 0u, // signalSemaphoreCount
2627 DE_NULL, // pSignalSemaphores
2630 // submit primary buffer, the secondary should be executed too
2631 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2633 // wait for both buffers to stop at event for 100 microseconds
2634 vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 100000);
2637 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
2639 // wait for end of execution of queue
2640 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2642 // TODO: this will be true if the command buffer was executed only once
2643 // TODO: add some test that will say if it was executed twice
2645 // check if secondary buffer has been executed
2646 VkResult result = vk.getEventStatus(vkDevice,*eventTwo);
2647 if (result == VK_EVENT_SET)
2648 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
2650 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
2653 tcu::TestStatus simultaneousUseSecondaryBufferOnePrimaryBufferTest(Context& context)
2655 const VkDevice vkDevice = context.getDevice();
2656 const DeviceInterface& vk = context.getDeviceInterface();
2657 const VkQueue queue = context.getUniversalQueue();
2658 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2659 Allocator& allocator = context.getDefaultAllocator();
2660 const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f);
2662 const VkCommandPoolCreateInfo cmdPoolParams =
2664 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2665 DE_NULL, // const void* pNext;
2666 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2667 queueFamilyIndex, // deUint32 queueFamilyIndex;
2669 const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
2672 const VkCommandBufferAllocateInfo cmdBufParams =
2674 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2675 DE_NULL, // const void* pNext;
2676 *cmdPool, // VkCommandPool pool;
2677 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2678 1u, // uint32_t bufferCount;
2680 const Unique<VkCommandBuffer> primCmdBuf(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2682 // Secondary Command buffer params
2683 const VkCommandBufferAllocateInfo secCmdBufParams =
2685 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2686 DE_NULL, // const void* pNext;
2687 *cmdPool, // VkCommandPool pool;
2688 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2689 1u, // uint32_t bufferCount;
2691 const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2693 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2695 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2698 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2701 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2703 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2708 VK_FALSE, // occlusionQueryEnable
2709 (VkQueryControlFlags)0u,
2710 (VkQueryPipelineStatisticFlags)0u,
2712 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2714 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2716 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2717 &secCmdBufInheritInfo,
2720 const deUint32 offset = (0u);
2721 const deUint32 addressableSize = 256;
2722 const deUint32 dataSize = 8;
2723 de::MovePtr<Allocation> bufferMem;
2724 const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
2725 // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
2726 const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context));
2727 const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context));
2728 const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
2729 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
2730 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
2732 const VkPipelineLayoutCreateInfo layoutCreateInfo =
2734 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
2736 (VkPipelineLayoutCreateFlags)0,
2737 numDescriptorSets, // setLayoutCount
2738 &descriptorSetLayout.get(), // pSetLayouts
2739 0u, // pushConstantRangeCount
2740 DE_NULL, // pPushConstantRanges
2742 Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
2744 const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
2746 const VkPipelineShaderStageCreateInfo shaderCreateInfo =
2748 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2750 (VkPipelineShaderStageCreateFlags)0,
2751 VK_SHADER_STAGE_COMPUTE_BIT, // stage
2752 *computeModule, // shader
2754 DE_NULL, // pSpecializationInfo
2757 const VkComputePipelineCreateInfo pipelineCreateInfo =
2759 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2762 shaderCreateInfo, // cs
2763 *pipelineLayout, // layout
2764 (vk::VkPipeline)0, // basePipelineHandle
2765 0u, // basePipelineIndex
2768 const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
2770 // record secondary command buffer
2771 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2773 vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
2774 vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
2775 vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
2777 // end recording of secondary buffer
2778 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2780 // record primary command buffer
2781 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2783 // execute secondary buffer twice in same primary
2784 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2785 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2787 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2789 const VkFenceCreateInfo fenceCreateInfo =
2791 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2796 // create fence to wait for execution of queue
2797 const Unique<VkFence> fence(createFence(vk, vkDevice, &fenceCreateInfo));
2799 const VkSubmitInfo submitInfo =
2801 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2803 0u, // waitSemaphoreCount
2804 DE_NULL, // pWaitSemaphores
2805 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2806 1, // commandBufferCount
2807 &primCmdBuf.get(), // pCommandBuffers
2808 0u, // signalSemaphoreCount
2809 DE_NULL, // pSignalSemaphores
2812 // submit primary buffer, the secondary should be executed too
2813 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2815 // wait for end of execution of queue
2816 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2818 deUint32 resultCount;
2819 result.readResultContentsTo(&resultCount);
2820 // check if secondary buffer has been executed
2821 if (resultCount == 2)
2822 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
2824 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
2827 tcu::TestStatus simultaneousUseSecondaryBufferTwoPrimaryBuffersTest(Context& context)
2829 const VkDevice vkDevice = context.getDevice();
2830 const DeviceInterface& vk = context.getDeviceInterface();
2831 const VkQueue queue = context.getUniversalQueue();
2832 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2833 Allocator& allocator = context.getDefaultAllocator();
2834 const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f);
2836 const VkCommandPoolCreateInfo cmdPoolParams =
2838 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2839 DE_NULL, // const void* pNext;
2840 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2841 queueFamilyIndex, // deUint32 queueFamilyIndex;
2843 const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
2846 const VkCommandBufferAllocateInfo cmdBufParams =
2848 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2849 DE_NULL, // const void* pNext;
2850 *cmdPool, // VkCommandPool pool;
2851 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2852 1u, // uint32_t bufferCount;
2854 // Two separate primary cmd buffers that will be executed with the same secondary cmd buffer
2855 const deUint32 numPrimCmdBufs = 2;
2856 const Unique<VkCommandBuffer> primCmdBufOne(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2857 const Unique<VkCommandBuffer> primCmdBufTwo(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2858 VkCommandBuffer primCmdBufs[numPrimCmdBufs];
2859 primCmdBufs[0] = primCmdBufOne.get();
2860 primCmdBufs[1] = primCmdBufTwo.get();
2862 // Secondary Command buffer params
2863 const VkCommandBufferAllocateInfo secCmdBufParams =
2865 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2866 DE_NULL, // const void* pNext;
2867 *cmdPool, // VkCommandPool pool;
2868 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2869 1u, // uint32_t bufferCount;
2871 const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2873 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2875 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2878 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2881 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2883 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2885 (VkRenderPass)0u, // renderPass
2887 (VkFramebuffer)0u, // framebuffer
2888 VK_FALSE, // occlusionQueryEnable
2889 (VkQueryControlFlags)0u, // queryFlags
2890 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2892 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2894 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2896 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2897 &secCmdBufInheritInfo,
2900 const deUint32 offset = (0u);
2901 const deUint32 addressableSize = 256;
2902 const deUint32 dataSize = 8;
2903 de::MovePtr<Allocation> bufferMem;
2904 const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
2905 // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
2906 const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context));
2907 const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context));
2908 const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
2909 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
2910 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
2912 const VkPipelineLayoutCreateInfo layoutCreateInfo =
2914 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
2916 (VkPipelineLayoutCreateFlags)0,
2917 numDescriptorSets, // setLayoutCount
2918 &descriptorSetLayout.get(), // pSetLayouts
2919 0u, // pushConstantRangeCount
2920 DE_NULL, // pPushConstantRanges
2922 Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
2924 const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
2926 const VkPipelineShaderStageCreateInfo shaderCreateInfo =
2928 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2930 (VkPipelineShaderStageCreateFlags)0,
2931 VK_SHADER_STAGE_COMPUTE_BIT, // stage
2932 *computeModule, // shader
2934 DE_NULL, // pSpecializationInfo
2937 const VkComputePipelineCreateInfo pipelineCreateInfo =
2939 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2942 shaderCreateInfo, // cs
2943 *pipelineLayout, // layout
2944 (vk::VkPipeline)0, // basePipelineHandle
2945 0u, // basePipelineIndex
2948 const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
2950 // record secondary command buffer
2951 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2953 vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
2954 vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
2955 vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
2957 // end recording of secondary buffer
2958 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2960 // record primary command buffers
2961 // Insert one instance of same secondary command buffer into two separate primary command buffers
2962 VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
2964 vk.cmdExecuteCommands(*primCmdBufOne, 1, &secCmdBuf.get());
2966 VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
2968 VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
2970 vk.cmdExecuteCommands(*primCmdBufTwo, 1, &secCmdBuf.get());
2972 VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
2974 const VkFenceCreateInfo fenceCreateInfo =
2976 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2981 // create fence to wait for execution of queue
2982 const Unique<VkFence> fence(createFence(vk, vkDevice, &fenceCreateInfo));
2984 const VkSubmitInfo submitInfo =
2986 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2988 0u, // waitSemaphoreCount
2989 DE_NULL, // pWaitSemaphores
2990 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2991 numPrimCmdBufs, // commandBufferCount
2992 primCmdBufs, // pCommandBuffers
2993 0u, // signalSemaphoreCount
2994 DE_NULL, // pSignalSemaphores
2997 // submit primary buffers, the secondary should be executed too
2998 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
3000 // wait for end of execution of queue
3001 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3003 deUint32 resultCount;
3004 result.readResultContentsTo(&resultCount);
3005 // check if secondary buffer has been executed
3006 if (resultCount == 2)
3007 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
3009 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
3012 tcu::TestStatus recordBufferQueryPreciseWithFlagTest(Context& context)
3014 const VkDevice vkDevice = context.getDevice();
3015 const DeviceInterface& vk = context.getDeviceInterface();
3016 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3018 if (!context.getDeviceFeatures().inheritedQueries)
3019 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
3021 const VkCommandPoolCreateInfo cmdPoolParams =
3023 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3025 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
3026 queueFamilyIndex, // queueFamilyIndex;
3028 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3031 const VkCommandBufferAllocateInfo primCmdBufParams =
3033 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3036 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3039 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
3041 // Secondary Command buffer params
3042 const VkCommandBufferAllocateInfo secCmdBufParams =
3044 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3047 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
3050 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
3052 const VkCommandBufferBeginInfo primBufferBeginInfo =
3054 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3057 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3060 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
3062 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3067 VK_TRUE, // occlusionQueryEnable
3068 VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags
3069 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3071 const VkCommandBufferBeginInfo secBufferBeginInfo =
3073 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3076 &secBufferInheritInfo,
3079 const VkQueryPoolCreateInfo queryPoolCreateInfo =
3081 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
3083 (VkQueryPoolCreateFlags)0, // flags
3084 VK_QUERY_TYPE_OCCLUSION, // queryType
3086 0u, // pipelineStatistics
3088 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
3090 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
3091 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
3093 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
3095 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
3096 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
3098 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
3100 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
3102 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
3104 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
3107 tcu::TestStatus recordBufferQueryImpreciseWithFlagTest(Context& context)
3109 const VkDevice vkDevice = context.getDevice();
3110 const DeviceInterface& vk = context.getDeviceInterface();
3111 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3113 if (!context.getDeviceFeatures().inheritedQueries)
3114 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
3116 const VkCommandPoolCreateInfo cmdPoolParams =
3118 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3120 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
3121 queueFamilyIndex, // queueFamilyIndex;
3123 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3126 const VkCommandBufferAllocateInfo primCmdBufParams =
3128 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3131 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3134 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
3136 // Secondary Command buffer params
3137 const VkCommandBufferAllocateInfo secCmdBufParams =
3139 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3142 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
3145 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
3147 const VkCommandBufferBeginInfo primBufferBeginInfo =
3149 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3152 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3155 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
3157 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3162 VK_TRUE, // occlusionQueryEnable
3163 VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags
3164 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3166 const VkCommandBufferBeginInfo secBufferBeginInfo =
3168 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3171 &secBufferInheritInfo,
3174 // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
3175 const VkQueryPoolCreateInfo queryPoolCreateInfo =
3177 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
3180 VK_QUERY_TYPE_OCCLUSION, // queryType
3182 0u, // pipelineStatistics
3184 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
3186 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
3187 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
3189 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
3191 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
3192 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
3194 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
3196 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
3198 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
3200 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
3203 tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context)
3205 const VkDevice vkDevice = context.getDevice();
3206 const DeviceInterface& vk = context.getDeviceInterface();
3207 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3209 if (!context.getDeviceFeatures().inheritedQueries)
3210 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
3212 const VkCommandPoolCreateInfo cmdPoolParams =
3214 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3216 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
3217 queueFamilyIndex, // queueFamilyIndex;
3219 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3222 const VkCommandBufferAllocateInfo primCmdBufParams =
3224 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3227 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3230 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
3232 // Secondary Command buffer params
3233 const VkCommandBufferAllocateInfo secCmdBufParams =
3235 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3238 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
3241 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
3243 const VkCommandBufferBeginInfo primBufferBeginInfo =
3245 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3248 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3251 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
3253 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3258 VK_TRUE, // occlusionQueryEnable
3260 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3262 const VkCommandBufferBeginInfo secBufferBeginInfo =
3264 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3267 &secBufferInheritInfo,
3270 // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
3271 const VkQueryPoolCreateInfo queryPoolCreateInfo =
3273 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
3275 (VkQueryPoolCreateFlags)0,
3276 VK_QUERY_TYPE_OCCLUSION,
3280 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
3282 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
3283 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
3285 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
3287 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
3288 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
3290 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
3292 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
3294 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
3296 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
3299 /******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/
3300 tcu::TestStatus submitBufferCountNonZero(Context& context)
3302 const VkDevice vkDevice = context.getDevice();
3303 const DeviceInterface& vk = context.getDeviceInterface();
3304 const VkQueue queue = context.getUniversalQueue();
3305 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3307 const deUint32 BUFFER_COUNT = 5u;
3309 const VkCommandPoolCreateInfo cmdPoolParams =
3311 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3314 queueFamilyIndex, // queueFamilyIndex;
3316 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3319 const VkCommandBufferAllocateInfo cmdBufParams =
3321 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3324 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3325 BUFFER_COUNT, // bufferCount;
3327 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3328 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
3330 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3332 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3335 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3338 const VkEventCreateInfo eventCreateInfo =
3340 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, // sType;
3345 std::vector<VkEventSp> events;
3346 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3348 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice, &eventCreateInfo, DE_NULL))));
3351 // Record the command buffers
3352 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3354 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3356 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3358 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3361 // We'll use a fence to wait for the execution of the queue
3362 const VkFenceCreateInfo fenceCreateInfo =
3364 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType;
3368 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
3370 const VkSubmitInfo submitInfo =
3372 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3374 0u, // waitSemaphoreCount
3375 DE_NULL, // pWaitSemaphores
3376 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3377 BUFFER_COUNT, // commandBufferCount
3378 cmdBuffers, // pCommandBuffers
3379 0u, // signalSemaphoreCount
3380 DE_NULL, // pSignalSemaphores
3383 // Submit the alpha command buffer to the queue
3384 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
3385 // Wait for the queue
3386 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
3388 // Check if the buffers were executed
3389 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3391 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3393 if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
3395 testResult = tcu::TestStatus::fail("Failed to set the event.");
3400 if (!testResult.isComplete())
3401 testResult = tcu::TestStatus::pass("All buffers were submitted and executed correctly.");
3406 tcu::TestStatus submitBufferCountEqualZero(Context& context)
3408 const VkDevice vkDevice = context.getDevice();
3409 const DeviceInterface& vk = context.getDeviceInterface();
3410 const VkQueue queue = context.getUniversalQueue();
3411 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3413 const deUint32 BUFFER_COUNT = 2u;
3415 const VkCommandPoolCreateInfo cmdPoolParams =
3417 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3420 queueFamilyIndex, // queueFamilyIndex;
3422 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3425 const VkCommandBufferAllocateInfo cmdBufParams =
3427 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3430 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3431 BUFFER_COUNT, // bufferCount;
3433 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3434 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
3436 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3438 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3441 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3444 const VkEventCreateInfo eventCreateInfo =
3446 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, // sType;
3451 std::vector<VkEventSp> events;
3452 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3453 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice, &eventCreateInfo, DE_NULL))));
3455 // Record the command buffers
3456 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3458 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3460 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3462 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3465 // We'll use a fence to wait for the execution of the queue
3466 const VkFenceCreateInfo fenceCreateInfo =
3468 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType;
3472 const Unique<VkFence> fenceZero (createFence(vk, vkDevice, &fenceCreateInfo));
3473 const Unique<VkFence> fenceOne (createFence(vk, vkDevice, &fenceCreateInfo));
3475 const VkSubmitInfo submitInfoCountZero =
3477 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3479 0u, // waitSemaphoreCount
3480 DE_NULL, // pWaitSemaphores
3481 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3482 1u, // commandBufferCount
3483 &cmdBuffers[0], // pCommandBuffers
3484 0u, // signalSemaphoreCount
3485 DE_NULL, // pSignalSemaphores
3488 const VkSubmitInfo submitInfoCountOne =
3490 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3492 0u, // waitSemaphoreCount
3493 DE_NULL, // pWaitSemaphores
3494 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3495 1u, // commandBufferCount
3496 &cmdBuffers[1], // pCommandBuffers
3497 0u, // signalSemaphoreCount
3498 DE_NULL, // pSignalSemaphores
3501 // Submit the command buffers to the queue
3502 // We're performing two submits to make sure that the first one has
3503 // a chance to be processed before we check the event's status
3504 VK_CHECK(vk.queueSubmit(queue, 0, &submitInfoCountZero, fenceZero.get()));
3505 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfoCountOne, fenceOne.get()));
3507 const VkFence fences[] =
3513 // Wait for the queue
3514 VK_CHECK(vk.waitForFences(vkDevice, (deUint32)DE_LENGTH_OF_ARRAY(fences), fences, VK_TRUE, INFINITE_TIMEOUT));
3516 // Check if the first buffer was executed
3517 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3519 if (vk.getEventStatus(vkDevice, events[0]->get()) == VK_EVENT_SET)
3520 testResult = tcu::TestStatus::fail("The first event was signaled.");
3522 testResult = tcu::TestStatus::pass("The first submission was ignored.");
3527 tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context)
3529 const VkDevice vkDevice = context.getDevice();
3530 const DeviceInterface& vk = context.getDeviceInterface();
3531 const VkQueue queue = context.getUniversalQueue();
3532 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3534 const VkCommandPoolCreateInfo cmdPoolParams =
3536 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
3537 DE_NULL, // const void* pNext;
3538 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
3539 queueFamilyIndex, // deUint32 queueFamilyIndex;
3541 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3544 const VkCommandBufferAllocateInfo cmdBufParams =
3546 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3547 DE_NULL, // const void* pNext;
3548 *cmdPool, // VkCommandPool pool;
3549 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
3550 1u, // uint32_t bufferCount;
3553 // Create two command buffers
3554 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3555 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3557 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3559 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3562 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
3565 // Fill create info struct for event
3566 const VkEventCreateInfo eventCreateInfo =
3568 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
3573 // create two events that will be used to check if command buffers has been executed
3574 const Unique<VkEvent> event1 (createEvent(vk, vkDevice, &eventCreateInfo));
3575 const Unique<VkEvent> event2 (createEvent(vk, vkDevice, &eventCreateInfo));
3578 VK_CHECK(vk.resetEvent(vkDevice, *event1));
3579 VK_CHECK(vk.resetEvent(vkDevice, *event2));
3581 // record first command buffer
3582 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
3584 // allow execution of event during every stage of pipeline
3585 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3587 // record setting event
3588 vk.cmdSetEvent(*primCmdBuf1, *event1,stageMask);
3590 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
3592 // record second command buffer
3593 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
3595 // allow execution of event during every stage of pipeline
3596 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3598 // record setting event
3599 vk.cmdSetEvent(*primCmdBuf2, *event2,stageMask);
3601 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
3603 const VkFenceCreateInfo fenceCreateInfo =
3605 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
3610 // create fence to wait for execution of queue
3611 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
3613 // create semaphore for use in this test
3614 const VkSemaphoreCreateInfo semaphoreCreateInfo =
3616 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // sType;
3621 const Unique <VkSemaphore> semaphore (createSemaphore(vk, vkDevice, &semaphoreCreateInfo));
3623 // create submit info for first buffer - signalling semaphore
3624 const VkSubmitInfo submitInfo1 =
3626 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3628 0u, // waitSemaphoreCount
3629 DE_NULL, // pWaitSemaphores
3630 DE_NULL, // pWaitDstStageMask
3631 1, // commandBufferCount
3632 &primCmdBuf1.get(), // pCommandBuffers
3633 1u, // signalSemaphoreCount
3634 &semaphore.get(), // pSignalSemaphores
3637 // Submit the command buffer to the queue
3638 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
3640 // wait for end of execution of queue
3641 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3643 // check if buffer has been executed
3644 VkResult result = vk.getEventStatus(vkDevice,*event1);
3645 if (result != VK_EVENT_SET)
3646 return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
3648 const VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
3650 // create submit info for second buffer - waiting for semaphore
3651 const VkSubmitInfo submitInfo2 =
3653 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3655 1u, // waitSemaphoreCount
3656 &semaphore.get(), // pWaitSemaphores
3657 &waitDstStageFlags, // pWaitDstStageMask
3658 1, // commandBufferCount
3659 &primCmdBuf2.get(), // pCommandBuffers
3660 0u, // signalSemaphoreCount
3661 DE_NULL, // pSignalSemaphores
3664 // reset fence, so it can be used again
3665 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3667 // Submit the second command buffer to the queue
3668 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
3670 // wait for end of execution of queue
3671 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3673 // check if second buffer has been executed
3674 // if it has been executed, it means that the semaphore was signalled - so test if passed
3675 result = vk.getEventStatus(vkDevice,*event1);
3676 if (result != VK_EVENT_SET)
3677 return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
3679 return tcu::TestStatus::pass("Submit Buffer and Wait for Single Semaphore Test succeeded");
3682 tcu::TestStatus submitBufferWaitManySemaphores(Context& context)
3684 // This test will create numSemaphores semaphores, and signal them in NUM_SEMAPHORES submits to queue
3685 // After that the numSubmissions queue submissions will wait for each semaphore
3687 const deUint32 numSemaphores = 10u; // it must be multiply of numSubmission
3688 const deUint32 numSubmissions = 2u;
3689 const VkDevice vkDevice = context.getDevice();
3690 const DeviceInterface& vk = context.getDeviceInterface();
3691 const VkQueue queue = context.getUniversalQueue();
3692 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3694 const VkCommandPoolCreateInfo cmdPoolParams =
3696 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
3697 DE_NULL, // const void* pNext;
3698 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
3699 queueFamilyIndex, // deUint32 queueFamilyIndex;
3701 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3704 const VkCommandBufferAllocateInfo cmdBufParams =
3706 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3707 DE_NULL, // const void* pNext;
3708 *cmdPool, // VkCommandPool pool;
3709 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
3710 1u, // uint32_t bufferCount;
3713 // Create command buffer
3714 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3716 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3718 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3721 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
3724 // Fill create info struct for event
3725 const VkEventCreateInfo eventCreateInfo =
3727 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
3732 // create event that will be used to check if command buffers has been executed
3733 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
3735 // reset event - at creation state is undefined
3736 VK_CHECK(vk.resetEvent(vkDevice, *event));
3738 // record command buffer
3739 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
3741 // allow execution of event during every stage of pipeline
3742 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3744 // record setting event
3745 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
3747 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
3749 const VkFenceCreateInfo fenceCreateInfo =
3751 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
3756 // create fence to wait for execution of queue
3757 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
3759 // numSemaphores is declared const, so this array can be static
3760 // the semaphores will be destroyed automatically at end of scope
3761 Move <VkSemaphore> semaphoreArray[numSemaphores];
3762 VkSemaphore semaphores[numSemaphores];
3764 // prepare create info for semaphores - same for all
3765 const VkSemaphoreCreateInfo semaphoreCreateInfo =
3767 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // sType;
3772 for (deUint32 idx = 0; idx < numSemaphores; ++idx) {
3773 // create semaphores for use in this test
3774 semaphoreArray[idx] = createSemaphore(vk, vkDevice, &semaphoreCreateInfo);
3775 semaphores[idx] = semaphoreArray[idx].get();
3779 // create submit info for buffer - signal semaphores
3780 const VkSubmitInfo submitInfo1 =
3782 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3784 0u, // waitSemaphoreCount
3785 DE_NULL, // pWaitSemaphores
3786 DE_NULL, // pWaitDstStageMask
3787 1, // commandBufferCount
3788 &primCmdBuf.get(), // pCommandBuffers
3789 numSemaphores, // signalSemaphoreCount
3790 semaphores // pSignalSemaphores
3792 // Submit the command buffer to the queue
3793 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
3795 // wait for end of execution of queue
3796 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3798 // check if buffer has been executed
3799 VkResult result = vk.getEventStatus(vkDevice,*event);
3800 if (result != VK_EVENT_SET)
3801 return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
3803 // reset event, so next buffers can set it again
3804 VK_CHECK(vk.resetEvent(vkDevice, *event));
3806 // reset fence, so it can be used again
3807 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3810 const deUint32 numberOfSemaphoresToBeWaitedByOneSubmission = numSemaphores / numSubmissions;
3811 const std::vector<VkPipelineStageFlags> waitDstStageFlags (numberOfSemaphoresToBeWaitedByOneSubmission, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
3813 // the following code waits for the semaphores set above - numSubmissions queues will wait for each semaphore from above
3814 for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) {
3816 // create submit info for buffer - waiting for semaphore
3817 const VkSubmitInfo submitInfo2 =
3819 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3821 numberOfSemaphoresToBeWaitedByOneSubmission, // waitSemaphoreCount
3822 semaphores + (numberOfSemaphoresToBeWaitedByOneSubmission * idxSubmission), // pWaitSemaphores
3823 waitDstStageFlags.data(), // pWaitDstStageMask
3824 1, // commandBufferCount
3825 &primCmdBuf.get(), // pCommandBuffers
3826 0u, // signalSemaphoreCount
3827 DE_NULL, // pSignalSemaphores
3830 // Submit the second command buffer to the queue
3831 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
3833 // wait for 1 second.
3834 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 1000 * 1000 * 1000));
3836 // check if second buffer has been executed
3837 // if it has been executed, it means that the semaphore was signalled - so test if passed
3838 VkResult result = vk.getEventStatus(vkDevice,*event);
3839 if (result != VK_EVENT_SET)
3840 return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
3842 // reset fence, so it can be used again
3843 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3845 // reset event, so next buffers can set it again
3846 VK_CHECK(vk.resetEvent(vkDevice, *event));
3849 return tcu::TestStatus::pass("Submit Buffer and Wait for Many Semaphores Test succeeded");
3852 tcu::TestStatus submitBufferNullFence(Context& context)
3854 const VkDevice vkDevice = context.getDevice();
3855 const DeviceInterface& vk = context.getDeviceInterface();
3856 const VkQueue queue = context.getUniversalQueue();
3857 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3859 const short BUFFER_COUNT = 2;
3861 const VkCommandPoolCreateInfo cmdPoolParams =
3863 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3866 queueFamilyIndex, // queueFamilyIndex;
3868 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3871 const VkCommandBufferAllocateInfo cmdBufParams =
3873 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3876 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3879 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3880 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3881 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, &cmdBuffers[ndx]));
3883 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3885 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3888 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3891 const VkEventCreateInfo eventCreateInfo =
3893 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, // sType;
3898 std::vector<VkEventSp> events;
3899 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3900 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice, &eventCreateInfo, DE_NULL))));
3902 // Record the command buffers
3903 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3905 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3907 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3909 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3912 // We'll use a fence to wait for the execution of the queue
3913 const VkFenceCreateInfo fenceCreateInfo =
3915 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // sType;
3919 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
3921 const VkSubmitInfo submitInfoNullFence =
3923 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3925 0u, // waitSemaphoreCount
3926 DE_NULL, // pWaitSemaphores
3927 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3928 1u, // commandBufferCount
3929 &cmdBuffers[0], // pCommandBuffers
3930 0u, // signalSemaphoreCount
3931 DE_NULL, // pSignalSemaphores
3934 const VkSubmitInfo submitInfoNonNullFence =
3936 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3938 0u, // waitSemaphoreCount
3939 DE_NULL, // pWaitSemaphores
3940 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3941 1u, // commandBufferCount
3942 &cmdBuffers[1], // pCommandBuffers
3943 0u, // signalSemaphoreCount
3944 DE_NULL, // pSignalSemaphores
3947 // Perform two submissions - one with no fence, the other one with a valid
3948 // fence Hoping submitting the other buffer will give the first one time to
3950 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNullFence, DE_NULL));
3951 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNonNullFence, fence.get()));
3953 // Wait for the queue
3954 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
3957 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3959 //Fence guaranteed that all buffers submited before fence were executed
3960 if (vk.getEventStatus(vkDevice, events[0]->get()) != VK_EVENT_SET || vk.getEventStatus(vkDevice, events[1]->get()) != VK_EVENT_SET)
3962 testResult = tcu::TestStatus::fail("One of the buffers was not executed.");
3966 testResult = tcu::TestStatus::pass("Buffers have been submitted and executed correctly.");
3969 vk.queueWaitIdle(queue);
3973 /******** 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) *******/
3974 tcu::TestStatus executeSecondaryBufferTest(Context& context)
3976 const VkDevice vkDevice = context.getDevice();
3977 const DeviceInterface& vk = context.getDeviceInterface();
3978 const VkQueue queue = context.getUniversalQueue();
3979 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3981 const VkCommandPoolCreateInfo cmdPoolParams =
3983 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3985 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
3986 queueFamilyIndex, // queueFamilyIndex;
3988 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3991 const VkCommandBufferAllocateInfo cmdBufParams =
3993 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3995 *cmdPool, // commandPool;
3996 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3999 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
4001 // Secondary Command buffer
4002 const VkCommandBufferAllocateInfo secCmdBufParams =
4004 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
4006 *cmdPool, // commandPool;
4007 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
4010 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
4012 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
4014 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
4017 (const VkCommandBufferInheritanceInfo*)DE_NULL,
4020 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
4022 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
4024 DE_NULL, // renderPass
4026 DE_NULL, // framebuffer
4027 VK_FALSE, // occlusionQueryEnable
4028 (VkQueryControlFlags)0u, // queryFlags
4029 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
4031 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
4033 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
4036 &secCmdBufInheritInfo,
4039 // Fill create info struct for event
4040 const VkEventCreateInfo eventCreateInfo =
4042 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
4047 // create event that will be used to check if secondary command buffer has been executed
4048 const Unique<VkEvent> event (createEvent(vk, vkDevice, &eventCreateInfo));
4051 VK_CHECK(vk.resetEvent(vkDevice, *event));
4053 // record secondary command buffer
4054 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
4056 // allow execution of event during every stage of pipeline
4057 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
4058 // record setting event
4059 vk.cmdSetEvent(*secCmdBuf, *event, stageMask);
4061 // end recording of the secondary buffer
4062 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
4064 // record primary command buffer
4065 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
4067 // execute secondary buffer
4068 vk.cmdExecuteCommands(*primCmdBuf, 1u, &secCmdBuf.get());
4070 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
4072 const VkFenceCreateInfo fenceCreateInfo =
4074 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
4079 // create fence to wait for execution of queue
4080 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceCreateInfo));
4081 const VkSubmitInfo submitInfo =
4083 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
4085 0u, // waitSemaphoreCount
4086 DE_NULL, // pWaitSemaphores
4087 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
4088 1u, // commandBufferCount
4089 &primCmdBuf.get(), // pCommandBuffers
4090 0u, // signalSemaphoreCount
4091 DE_NULL, // pSignalSemaphores
4094 // submit primary buffer, the secondary should be executed too
4095 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
4097 // wait for end of execution of queue
4098 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
4100 // check if secondary buffer has been executed
4101 VkResult result = vk.getEventStatus(vkDevice, *event);
4102 if (result == VK_EVENT_SET)
4103 return tcu::TestStatus::pass("executeSecondaryBufferTest succeeded");
4105 return tcu::TestStatus::fail("executeSecondaryBufferTest FAILED");
4108 tcu::TestStatus executeSecondaryBufferTwiceTest(Context& context)
4110 const deUint32 BUFFER_COUNT = 10u;
4111 const VkDevice vkDevice = context.getDevice();
4112 const DeviceInterface& vk = context.getDeviceInterface();
4113 const VkQueue queue = context.getUniversalQueue();
4114 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
4116 const VkCommandPoolCreateInfo cmdPoolParams =
4118 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
4119 DE_NULL, // const void* pNext;
4120 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
4121 queueFamilyIndex, // deUint32 queueFamilyIndex;
4123 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
4126 const VkCommandBufferAllocateInfo cmdBufParams =
4128 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
4129 DE_NULL, // const void* pNext;
4130 *cmdPool, // VkCommandPool pool;
4131 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
4132 1u, // uint32_t bufferCount;
4134 const Unique<VkCommandBuffer> primCmdBufOne (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
4135 const Unique<VkCommandBuffer> primCmdBufTwo (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
4137 // Secondary Command buffers params
4138 const VkCommandBufferAllocateInfo secCmdBufParams =
4140 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
4141 DE_NULL, // const void* pNext;
4142 *cmdPool, // VkCommandPool pool;
4143 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
4144 BUFFER_COUNT, // uint32_t bufferCount;
4146 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
4147 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &secCmdBufParams, cmdBuffers));
4149 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
4151 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
4154 (const VkCommandBufferInheritanceInfo*)DE_NULL,
4157 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
4159 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
4161 (VkRenderPass)0u, // renderPass
4163 (VkFramebuffer)0u, // framebuffer
4164 VK_FALSE, // occlusionQueryEnable
4165 (VkQueryControlFlags)0u, // queryFlags
4166 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
4168 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
4170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
4172 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
4173 &secCmdBufInheritInfo,
4176 // Fill create info struct for event
4177 const VkEventCreateInfo eventCreateInfo =
4179 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
4184 // create event that will be used to check if secondary command buffer has been executed
4185 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice, &eventCreateInfo));
4188 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
4190 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
4192 // record secondary command buffer
4193 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &secCmdBufBeginInfo));
4195 // allow execution of event during every stage of pipeline
4196 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
4199 vk.cmdWaitEvents(cmdBuffers[ndx], 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
4201 // end recording of secondary buffers
4202 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
4205 // record primary command buffer one
4206 VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
4208 // execute one secondary buffer
4209 vk.cmdExecuteCommands(*primCmdBufOne, 1, cmdBuffers );
4211 VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
4213 // record primary command buffer two
4214 VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
4216 // execute one secondary buffer with all buffers
4217 vk.cmdExecuteCommands(*primCmdBufTwo, BUFFER_COUNT, cmdBuffers );
4219 VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
4221 const VkFenceCreateInfo fenceCreateInfo =
4223 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
4228 // create fence to wait for execution of queue
4229 const Unique<VkFence> fenceOne (createFence(vk, vkDevice, &fenceCreateInfo));
4230 const Unique<VkFence> fenceTwo (createFence(vk, vkDevice, &fenceCreateInfo));
4232 const VkSubmitInfo submitInfoOne =
4234 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
4236 0u, // waitSemaphoreCount
4237 DE_NULL, // pWaitSemaphores
4238 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
4239 1, // commandBufferCount
4240 &primCmdBufOne.get(), // pCommandBuffers
4241 0u, // signalSemaphoreCount
4242 DE_NULL, // pSignalSemaphores
4245 // submit primary buffer, the secondary should be executed too
4246 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoOne, *fenceOne));
4248 // wait for buffer to stop at event for 100 microseconds
4249 vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
4251 const VkSubmitInfo submitInfoTwo =
4253 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
4255 0u, // waitSemaphoreCount
4256 DE_NULL, // pWaitSemaphores
4257 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
4258 1, // commandBufferCount
4259 &primCmdBufTwo.get(), // pCommandBuffers
4260 0u, // signalSemaphoreCount
4261 DE_NULL, // pSignalSemaphores
4264 // submit second primary buffer, the secondary should be executed too
4265 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoTwo, *fenceTwo));
4267 // wait for all buffers to stop at event for 100 microseconds
4268 vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
4270 // now all buffers are waiting at eventOne
4271 // set event eventOne
4272 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
4274 // wait for end of execution of fenceOne
4275 VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, INFINITE_TIMEOUT));
4277 // wait for end of execution of second queue
4278 VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceTwo.get(), 0u, INFINITE_TIMEOUT));
4280 return tcu::TestStatus::pass("executeSecondaryBufferTwiceTest succeeded");
4283 /******** 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) **/
4284 tcu::TestStatus orderBindPipelineTest(Context& context)
4286 const DeviceInterface& vk = context.getDeviceInterface();
4287 const VkDevice device = context.getDevice();
4288 const VkQueue queue = context.getUniversalQueue();
4289 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
4290 Allocator& allocator = context.getDefaultAllocator();
4291 const ComputeInstanceResultBuffer result (vk, device, allocator);
4295 ADDRESSABLE_SIZE = 256, // allocate a lot more than required
4298 const tcu::Vec4 colorA1 = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
4299 const tcu::Vec4 colorA2 = tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f);
4300 const tcu::Vec4 colorB1 = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
4301 const tcu::Vec4 colorB2 = tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f);
4303 const deUint32 dataOffsetA = (0u);
4304 const deUint32 dataOffsetB = (0u);
4305 const deUint32 viewOffsetA = (0u);
4306 const deUint32 viewOffsetB = (0u);
4307 const deUint32 bufferSizeA = dataOffsetA + ADDRESSABLE_SIZE;
4308 const deUint32 bufferSizeB = dataOffsetB + ADDRESSABLE_SIZE;
4310 de::MovePtr<Allocation> bufferMemA;
4311 const Unique<VkBuffer> bufferA (createColorDataBuffer(dataOffsetA, bufferSizeA, colorA1, colorA2, &bufferMemA, context));
4313 de::MovePtr<Allocation> bufferMemB;
4314 const Unique<VkBuffer> bufferB (createColorDataBuffer(dataOffsetB, bufferSizeB, colorB1, colorB2, &bufferMemB, context));
4316 const Unique<VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout(context));
4317 const Unique<VkDescriptorPool> descriptorPool (createDescriptorPool(context));
4318 const Unique<VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout, *bufferA, viewOffsetA, *bufferB, viewOffsetB, result.getBuffer(), context));
4319 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
4320 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
4322 const VkPipelineLayoutCreateInfo layoutCreateInfo =
4324 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
4326 (VkPipelineLayoutCreateFlags)0,
4327 numDescriptorSets, // setLayoutCount
4328 &descriptorSetLayout.get(), // pSetLayouts
4329 0u, // pushConstantRangeCount
4330 DE_NULL, // pPushConstantRanges
4332 Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, device, &layoutCreateInfo));
4334 const Unique<VkShaderModule> computeModuleGood (createShaderModule(vk, device, context.getBinaryCollection().get("compute_good"), (VkShaderModuleCreateFlags)0u));
4335 const Unique<VkShaderModule> computeModuleBad (createShaderModule(vk, device, context.getBinaryCollection().get("compute_bad"), (VkShaderModuleCreateFlags)0u));
4337 const VkPipelineShaderStageCreateInfo shaderCreateInfoGood =
4339 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
4341 (VkPipelineShaderStageCreateFlags)0,
4342 VK_SHADER_STAGE_COMPUTE_BIT, // stage
4343 *computeModuleGood, // shader
4345 DE_NULL, // pSpecializationInfo
4348 const VkPipelineShaderStageCreateInfo shaderCreateInfoBad =
4350 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
4352 (vk::VkPipelineShaderStageCreateFlags)0,
4353 vk::VK_SHADER_STAGE_COMPUTE_BIT, // stage
4354 *computeModuleBad, // shader
4356 DE_NULL, // pSpecializationInfo
4359 const VkComputePipelineCreateInfo createInfoGood =
4361 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
4364 shaderCreateInfoGood, // cs
4365 *pipelineLayout, // layout
4366 (vk::VkPipeline)0, // basePipelineHandle
4367 0u, // basePipelineIndex
4370 const VkComputePipelineCreateInfo createInfoBad =
4372 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
4375 shaderCreateInfoBad, // cs
4376 *pipelineLayout, // descriptorSetLayout.get()
4377 (VkPipeline)0, // basePipelineHandle
4378 0u, // basePipelineIndex
4381 const Unique<VkPipeline> pipelineGood (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoGood));
4382 const Unique<VkPipeline> pipelineBad (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoBad));
4384 const VkAccessFlags inputBit = (VK_ACCESS_UNIFORM_READ_BIT);
4385 const VkBufferMemoryBarrier bufferBarriers[] =
4388 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
4390 VK_ACCESS_HOST_WRITE_BIT, // outputMask
4391 inputBit, // inputMask
4392 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
4393 VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
4395 (VkDeviceSize)0u, // offset
4396 (VkDeviceSize)bufferSizeA, // size
4399 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
4401 VK_ACCESS_HOST_WRITE_BIT, // outputMask
4402 inputBit, // inputMask
4403 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
4404 VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
4406 (VkDeviceSize)0u, // offset
4407 (VkDeviceSize)bufferSizeB, // size
4411 const deUint32 numSrcBuffers = 1u;
4413 const deUint32* const dynamicOffsets = (DE_NULL);
4414 const deUint32 numDynamicOffsets = (0);
4415 const int numPreBarriers = numSrcBuffers;
4416 const vk::VkBufferMemoryBarrier* const postBarriers = result.getResultReadBarrier();
4417 const int numPostBarriers = 1;
4418 const tcu::Vec4 refQuadrantValue14 = (colorA2);
4419 const tcu::Vec4 refQuadrantValue23 = (colorA1);
4420 const tcu::Vec4 references[4] =
4427 tcu::Vec4 results[4];
4429 // submit and wait begin
4431 const tcu::UVec3 numWorkGroups = tcu::UVec3(4, 1u, 1);
4433 const VkCommandPoolCreateInfo cmdPoolCreateInfo =
4435 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
4437 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags
4438 queueFamilyIndex, // queueFamilyIndex
4440 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, &cmdPoolCreateInfo));
4442 const VkFenceCreateInfo fenceCreateInfo =
4444 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
4449 const VkCommandBufferAllocateInfo cmdBufCreateInfo =
4451 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType
4453 *cmdPool, // commandPool
4454 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level
4458 const VkCommandBufferBeginInfo cmdBufBeginInfo =
4460 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
4463 (const VkCommandBufferInheritanceInfo*)DE_NULL,
4466 const Unique<VkFence> cmdCompleteFence (createFence(vk, device, &fenceCreateInfo));
4467 const Unique<VkCommandBuffer> cmd (allocateCommandBuffer(vk, device, &cmdBufCreateInfo));
4469 VK_CHECK(vk.beginCommandBuffer(*cmd, &cmdBufBeginInfo));
4471 vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineBad);
4472 vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineGood);
4473 vk.cmdBindDescriptorSets(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, numDynamicOffsets, dynamicOffsets);
4476 vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
4477 0, (const VkMemoryBarrier*)DE_NULL,
4478 numPreBarriers, bufferBarriers,
4479 0, (const VkImageMemoryBarrier*)DE_NULL);
4481 vk.cmdDispatch(*cmd, numWorkGroups.x(), numWorkGroups.y(), numWorkGroups.z());
4482 vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
4483 0, (const VkMemoryBarrier*)DE_NULL,
4484 numPostBarriers, postBarriers,
4485 0, (const VkImageMemoryBarrier*)DE_NULL);
4486 VK_CHECK(vk.endCommandBuffer(*cmd));
4489 // submit second primary buffer, the secondary should be executed too
4490 const VkSubmitInfo submitInfo =
4492 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
4494 0u, // waitSemaphoreCount
4495 DE_NULL, // pWaitSemaphores
4496 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
4497 1, // commandBufferCount
4498 &cmd.get(), // pCommandBuffers
4499 0u, // signalSemaphoreCount
4500 DE_NULL, // pSignalSemaphores
4502 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *cmdCompleteFence));
4504 VK_CHECK(vk.waitForFences(device, 1u, &cmdCompleteFence.get(), 0u, INFINITE_TIMEOUT)); // \note: timeout is failure
4505 VK_CHECK(vk.resetFences(device, 1u, &cmdCompleteFence.get()));
4507 // submit and wait end
4508 result.readResultContentsTo(&results);
4511 if (results[0] == references[0] &&
4512 results[1] == references[1] &&
4513 results[2] == references[2] &&
4514 results[3] == references[3])
4516 return tcu::TestStatus::pass("Pass");
4518 else if (results[0] == tcu::Vec4(-1.0f) &&
4519 results[1] == tcu::Vec4(-1.0f) &&
4520 results[2] == tcu::Vec4(-1.0f) &&
4521 results[3] == tcu::Vec4(-1.0f))
4523 context.getTestContext().getLog()
4524 << tcu::TestLog::Message
4525 << "Result buffer was not written to."
4526 << tcu::TestLog::EndMessage;
4527 return tcu::TestStatus::fail("Result buffer was not written to");
4531 context.getTestContext().getLog()
4532 << tcu::TestLog::Message
4533 << "Error expected ["
4534 << references[0] << ", "
4535 << references[1] << ", "
4536 << references[2] << ", "
4537 << references[3] << "], got ["
4538 << results[0] << ", "
4539 << results[1] << ", "
4540 << results[2] << ", "
4541 << results[3] << "]"
4542 << tcu::TestLog::EndMessage;
4543 return tcu::TestStatus::fail("Invalid result values");
4548 void genComputeSource (SourceCollections& programCollection)
4550 const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
4551 std::ostringstream bufGood;
4553 bufGood << versionDecl << "\n"
4555 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4556 << "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
4558 << " highp vec4 colorA;\n"
4559 << " highp vec4 colorB;\n"
4560 << "} b_instance;\n"
4561 << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
4563 << " highp vec4 read_colors[4];\n"
4565 << "void main(void)\n"
4567 << " highp int quadrant_id = int(gl_WorkGroupID.x);\n"
4568 << " highp vec4 result_color;\n"
4569 << " if (quadrant_id == 1 || quadrant_id == 2)\n"
4570 << " result_color = b_instance.colorA;\n"
4572 << " result_color = b_instance.colorB;\n"
4573 << " b_out.read_colors[gl_WorkGroupID.x] = result_color;\n"
4576 programCollection.glslSources.add("compute_good") << glu::ComputeSource(bufGood.str());
4578 std::ostringstream bufBad;
4580 bufBad << versionDecl << "\n"
4582 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4583 << "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
4585 << " highp vec4 colorA;\n"
4586 << " highp vec4 colorB;\n"
4587 << "} b_instance;\n"
4588 << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
4590 << " highp vec4 read_colors[4];\n"
4592 << "void main(void)\n"
4594 << " highp int quadrant_id = int(gl_WorkGroupID.x);\n"
4595 << " highp vec4 result_color;\n"
4596 << " if (quadrant_id == 1 || quadrant_id == 2)\n"
4597 << " result_color = b_instance.colorA;\n"
4599 << " result_color = b_instance.colorB;\n"
4600 << " b_out.read_colors[gl_WorkGroupID.x] = vec4(0.0, 0.0, 0.0, 0.0);\n"
4603 programCollection.glslSources.add("compute_bad") << glu::ComputeSource(bufBad.str());
4606 void genComputeIncrementSource (SourceCollections& programCollection)
4608 const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
4609 std::ostringstream bufIncrement;
4611 bufIncrement << versionDecl << "\n"
4613 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4614 << "layout(set = 0, binding = 0, std140) buffer InOutBuf\n"
4616 << " coherent uint count;\n"
4618 << "void main(void)\n"
4620 << " atomicAdd(b_in_out.count, 1u);\n"
4623 programCollection.glslSources.add("compute_increment") << glu::ComputeSource(bufIncrement.str());
4628 tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx)
4630 de::MovePtr<tcu::TestCaseGroup> commandBuffersTests (new tcu::TestCaseGroup(testCtx, "command_buffers", "Command Buffers Tests"));
4632 /* 19.1. Command Pools (5.1 in VK 1.0 Spec) */
4633 addFunctionCase (commandBuffersTests.get(), "pool_create_null_params", "", createPoolNullParamsTest);
4634 addFunctionCase (commandBuffersTests.get(), "pool_create_non_null_allocator", "", createPoolNonNullAllocatorTest);
4635 addFunctionCase (commandBuffersTests.get(), "pool_create_transient_bit", "", createPoolTransientBitTest);
4636 addFunctionCase (commandBuffersTests.get(), "pool_create_reset_bit", "", createPoolResetBitTest);
4637 addFunctionCase (commandBuffersTests.get(), "pool_reset_release_res", "", resetPoolReleaseResourcesBitTest);
4638 addFunctionCase (commandBuffersTests.get(), "pool_reset_no_flags_res", "", resetPoolNoFlagsTest);
4639 addFunctionCase (commandBuffersTests.get(), "pool_reset_reuse", "", resetPoolReuseTest);
4640 /* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */
4641 addFunctionCase (commandBuffersTests.get(), "allocate_single_primary", "", allocatePrimaryBufferTest);
4642 addFunctionCase (commandBuffersTests.get(), "allocate_many_primary", "", allocateManyPrimaryBuffersTest);
4643 addFunctionCase (commandBuffersTests.get(), "allocate_single_secondary", "", allocateSecondaryBufferTest);
4644 addFunctionCase (commandBuffersTests.get(), "allocate_many_secondary", "", allocateManySecondaryBuffersTest);
4645 addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", executePrimaryBufferTest);
4646 addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", executeLargePrimaryBufferTest);
4647 addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", resetBufferImplicitlyTest);
4648 addFunctionCase (commandBuffersTests.get(), "trim_command_pool", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
4649 addFunctionCase (commandBuffersTests.get(), "trim_command_pool_secondary", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4650 /* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */
4651 addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", recordSinglePrimaryBufferTest);
4652 addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", recordLargePrimaryBufferTest);
4653 addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", recordSingleSecondaryBufferTest);
4654 addFunctionCase (commandBuffersTests.get(), "record_many_secondary", "", recordLargeSecondaryBufferTest);
4655 addFunctionCase (commandBuffersTests.get(), "submit_twice_primary", "", submitPrimaryBufferTwiceTest);
4656 addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", submitSecondaryBufferTwiceTest);
4657 addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", oneTimeSubmitFlagPrimaryBufferTest);
4658 addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", oneTimeSubmitFlagSecondaryBufferTest);
4659 addFunctionCase (commandBuffersTests.get(), "render_pass_continue", "", renderPassContinueTest);
4660 addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", simultaneousUsePrimaryBufferTest);
4661 addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", simultaneousUseSecondaryBufferTest);
4662 addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_one_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferOnePrimaryBufferTest);
4663 addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_two_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferTwoPrimaryBuffersTest);
4664 addFunctionCase (commandBuffersTests.get(), "record_query_precise_w_flag", "", recordBufferQueryPreciseWithFlagTest);
4665 addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_w_flag", "", recordBufferQueryImpreciseWithFlagTest);
4666 addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_wo_flag", "", recordBufferQueryImpreciseWithoutFlagTest);
4667 /* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */
4668 addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", submitBufferCountNonZero);
4669 addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", submitBufferCountEqualZero);
4670 addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", submitBufferWaitSingleSemaphore);
4671 addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", submitBufferWaitManySemaphores);
4672 addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", submitBufferNullFence);
4673 /* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */
4674 addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", executeSecondaryBufferTest);
4675 addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", executeSecondaryBufferTwiceTest);
4676 /* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */
4677 addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline", "", genComputeSource, orderBindPipelineTest);
4679 return commandBuffersTests.release();