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 m_commandPool = createCommandPool(m_vkd, m_device, commandPoolCreateFlags, m_queueFamilyIndex);
93 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
95 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
96 DE_NULL, // const void* pNext;
97 *m_commandPool, // VkCommandPool commandPool;
98 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
99 NumBuffers // deUint32 commandBufferCount;
102 VK_CHECK(m_vkd.allocateCommandBuffers(m_device, &cmdBufferAllocateInfo, m_primaryCommandBuffers));
105 template <deUint32 NumBuffers>
106 VkCommandBuffer CommandBufferBareTestEnvironment<NumBuffers>::getCommandBuffer(deUint32 bufferIndex) const
108 DE_ASSERT(bufferIndex < NumBuffers);
109 return m_primaryCommandBuffers[bufferIndex];
112 class CommandBufferRenderPassTestEnvironment : public CommandBufferBareTestEnvironment<1>
115 CommandBufferRenderPassTestEnvironment (Context& context,
116 VkCommandPoolCreateFlags commandPoolCreateFlags);
118 VkRenderPass getRenderPass (void) const { return *m_renderPass; }
119 VkFramebuffer getFrameBuffer (void) const { return *m_frameBuffer; }
120 VkCommandBuffer getPrimaryCommandBuffer (void) const { return getCommandBuffer(0); }
121 VkCommandBuffer getSecondaryCommandBuffer (void) const { return *m_secondaryCommandBuffer; }
123 void beginPrimaryCommandBuffer (VkCommandBufferUsageFlags usageFlags);
124 void beginSecondaryCommandBuffer (VkCommandBufferUsageFlags usageFlags);
125 void beginRenderPass (VkSubpassContents content);
126 void submitPrimaryCommandBuffer (void);
127 de::MovePtr<tcu::TextureLevel> readColorAttachment (void);
129 static const VkImageType DEFAULT_IMAGE_TYPE;
130 static const VkFormat DEFAULT_IMAGE_FORMAT;
131 static const VkExtent3D DEFAULT_IMAGE_SIZE;
132 static const VkRect2D DEFAULT_IMAGE_AREA;
136 Move<VkImage> m_colorImage;
137 Move<VkImageView> m_colorImageView;
138 Move<VkRenderPass> m_renderPass;
139 Move<VkFramebuffer> m_frameBuffer;
140 de::MovePtr<Allocation> m_colorImageMemory;
141 Move<VkCommandBuffer> m_secondaryCommandBuffer;
145 const VkImageType CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_TYPE = VK_IMAGE_TYPE_2D;
146 const VkFormat CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_FORMAT = VK_FORMAT_R8G8B8A8_UINT;
147 const VkExtent3D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE = {255, 255, 1};
148 const VkRect2D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA =
150 { 0u, 0u, }, // VkOffset2D offset;
151 { DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height }, // VkExtent2D extent;
154 CommandBufferRenderPassTestEnvironment::CommandBufferRenderPassTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags)
155 : CommandBufferBareTestEnvironment<1> (context, commandPoolCreateFlags)
158 const VkAttachmentDescription colorAttDesc =
160 0u, // VkAttachmentDescriptionFlags flags;
161 DEFAULT_IMAGE_FORMAT, // VkFormat format;
162 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
163 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
164 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
165 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
166 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
167 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
168 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
171 const VkAttachmentDescription attachments[1] =
176 const VkAttachmentReference colorAttRef =
178 0u, // deUint32 attachment;
179 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
182 const VkSubpassDescription subpassDesc[1] =
185 0u, // VkSubpassDescriptionFlags flags;
186 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
187 0u, // deUint32 inputAttachmentCount;
188 DE_NULL, // const VkAttachmentReference* pInputAttachments;
189 1u, // deUint32 colorAttachmentCount;
190 &colorAttRef, // const VkAttachmentReference* pColorAttachments;
191 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
192 DE_NULL, // const VkAttachmentReference* depthStencilAttachment;
193 0u, // deUint32 preserveAttachmentCount;
194 DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
198 const VkRenderPassCreateInfo renderPassCreateInfo =
200 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
201 DE_NULL, // const void* pNext;
202 0u, // VkRenderPassCreateFlags flags;
203 1u, // deUint32 attachmentCount;
204 attachments, // const VkAttachmentDescription* pAttachments;
205 1u, // deUint32 subpassCount;
206 subpassDesc, // const VkSubpassDescription* pSubpasses;
207 0u, // deUint32 dependencyCount;
208 DE_NULL, // const VkSubpassDependency* pDependencies;
211 m_renderPass = createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
215 const VkImageCreateInfo imageCreateInfo =
217 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
218 DE_NULL, // const void* pNext;
219 0u, // VkImageCreateFlags flags;
220 DEFAULT_IMAGE_TYPE, // VkImageType imageType;
221 DEFAULT_IMAGE_FORMAT, // VkFormat format;
222 DEFAULT_IMAGE_SIZE, // VkExtent3D extent;
223 1, // deUint32 mipLevels;
224 1, // deUint32 arrayLayers;
225 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
226 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
227 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
228 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
229 VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
230 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
231 1, // deUint32 queueFamilyIndexCount;
232 &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
233 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
236 m_colorImage = createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
239 m_colorImageMemory = m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, *m_colorImage), MemoryRequirement::Any);
240 VK_CHECK(m_vkd.bindImageMemory(m_device, *m_colorImage, m_colorImageMemory->getMemory(), m_colorImageMemory->getOffset()));
243 const VkImageViewCreateInfo imageViewCreateInfo =
245 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
246 DE_NULL, // const void* pNext;
247 0u, // VkImageViewCreateFlags flags;
248 *m_colorImage, // VkImage image;
249 VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
250 DEFAULT_IMAGE_FORMAT, // VkFormat format;
252 VK_COMPONENT_SWIZZLE_R,
253 VK_COMPONENT_SWIZZLE_G,
254 VK_COMPONENT_SWIZZLE_B,
255 VK_COMPONENT_SWIZZLE_A
256 }, // VkComponentMapping components;
258 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
259 0u, // deUint32 baseMipLevel;
260 1u, // deUint32 mipLevels;
261 0u, // deUint32 baseArrayLayer;
262 1u, // deUint32 arraySize;
263 }, // VkImageSubresourceRange subresourceRange;
266 m_colorImageView = createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL);
270 const VkImageView attachmentViews[1] =
275 const VkFramebufferCreateInfo framebufferCreateInfo =
277 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
278 DE_NULL, // const void* pNext;
279 0u, // VkFramebufferCreateFlags flags;
280 *m_renderPass, // VkRenderPass renderPass;
281 1, // deUint32 attachmentCount;
282 attachmentViews, // const VkImageView* pAttachments;
283 DEFAULT_IMAGE_SIZE.width, // deUint32 width;
284 DEFAULT_IMAGE_SIZE.height, // deUint32 height;
285 1u, // deUint32 layers;
288 m_frameBuffer = createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL);
292 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
294 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
295 DE_NULL, // const void* pNext;
296 *m_commandPool, // VkCommandPool commandPool;
297 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
298 1u // deUint32 commandBufferCount;
301 m_secondaryCommandBuffer = allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo);
306 void CommandBufferRenderPassTestEnvironment::beginRenderPass(VkSubpassContents content)
308 const VkClearValue clearValues[1] =
310 makeClearValueColorU32(17, 59, 163, 251),
313 const VkRenderPassBeginInfo renderPassBeginInfo =
315 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
316 DE_NULL, // const void* pNext;
317 *m_renderPass, // VkRenderPass renderPass;
318 *m_frameBuffer, // VkFramebuffer framebuffer;
319 DEFAULT_IMAGE_AREA, // VkRect2D renderArea;
320 1u, // deUint32 clearValueCount;
321 clearValues // const VkClearValue* pClearValues;
324 m_vkd.cmdBeginRenderPass(m_primaryCommandBuffers[0], &renderPassBeginInfo, content);
327 void CommandBufferRenderPassTestEnvironment::beginPrimaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
329 const VkCommandBufferBeginInfo commandBufferBeginInfo =
331 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
332 DE_NULL, // const void* pNext;
333 usageFlags, // VkCommandBufferUsageFlags flags;
334 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
337 VK_CHECK(m_vkd.beginCommandBuffer(m_primaryCommandBuffers[0], &commandBufferBeginInfo));
342 void CommandBufferRenderPassTestEnvironment::beginSecondaryCommandBuffer(VkCommandBufferUsageFlags usageFlags)
344 const VkCommandBufferInheritanceInfo commandBufferInheritanceInfo =
346 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
347 DE_NULL, // const void* pNext;
348 *m_renderPass, // VkRenderPass renderPass;
349 0u, // deUint32 subpass;
350 *m_frameBuffer, // VkFramebuffer framebuffer;
351 VK_FALSE, // VkBool32 occlusionQueryEnable;
352 0u, // VkQueryControlFlags queryFlags;
353 0u // VkQueryPipelineStatisticFlags pipelineStatistics;
356 const VkCommandBufferBeginInfo commandBufferBeginInfo =
358 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
359 DE_NULL, // const void* pNext;
360 usageFlags, // VkCommandBufferUsageFlags flags;
361 &commandBufferInheritanceInfo // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
364 VK_CHECK(m_vkd.beginCommandBuffer(*m_secondaryCommandBuffer, &commandBufferBeginInfo));
368 void CommandBufferRenderPassTestEnvironment::submitPrimaryCommandBuffer(void)
370 const Unique<VkFence> fence (createFence(m_vkd, m_device));
371 const VkSubmitInfo submitInfo =
373 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
374 DE_NULL, // const void* pNext;
375 0u, // deUint32 waitSemaphoreCount;
376 DE_NULL, // const VkSemaphore* pWaitSemaphores;
377 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
378 1u, // deUint32 commandBufferCount;
379 m_primaryCommandBuffers, // const VkCommandBuffer* pCommandBuffers;
380 0u, // deUint32 signalSemaphoreCount;
381 DE_NULL // const VkSemaphore* pSignalSemaphores;
384 VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence));
386 VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull));
390 de::MovePtr<tcu::TextureLevel> CommandBufferRenderPassTestEnvironment::readColorAttachment ()
392 Move<VkBuffer> buffer;
393 de::MovePtr<Allocation> bufferAlloc;
394 const tcu::TextureFormat tcuFormat = mapVkFormat(DEFAULT_IMAGE_FORMAT);
395 const VkDeviceSize pixelDataSize = DEFAULT_IMAGE_SIZE.height * DEFAULT_IMAGE_SIZE.height * tcuFormat.getPixelSize();
396 de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(tcuFormat, DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height));
398 // Create destination buffer
400 const VkBufferCreateInfo bufferParams =
402 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
403 DE_NULL, // const void* pNext;
404 0u, // VkBufferCreateFlags flags;
405 pixelDataSize, // VkDeviceSize size;
406 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
407 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
408 0u, // deUint32 queueFamilyIndexCount;
409 DE_NULL // const deUint32* pQueueFamilyIndices;
412 buffer = createBuffer(m_vkd, m_device, &bufferParams);
413 bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible);
414 VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
417 // Barriers for copying image to buffer
419 const VkImageMemoryBarrier imageBarrier =
421 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
422 DE_NULL, // const void* pNext;
423 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
424 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
425 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
426 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
427 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
428 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
429 *m_colorImage, // VkImage image;
430 { // VkImageSubresourceRange subresourceRange;
431 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
432 0u, // deUint32 baseMipLevel;
433 1u, // deUint32 mipLevels;
434 0u, // deUint32 baseArraySlice;
435 1u // deUint32 arraySize;
439 const VkBufferMemoryBarrier bufferBarrier =
441 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
442 DE_NULL, // const void* pNext;
443 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
444 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
445 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
446 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
447 *buffer, // VkBuffer buffer;
448 0u, // VkDeviceSize offset;
449 pixelDataSize // VkDeviceSize size;
452 // Copy image to buffer
454 const VkBufferImageCopy copyRegion =
456 0u, // VkDeviceSize bufferOffset;
457 DEFAULT_IMAGE_SIZE.width, // deUint32 bufferRowLength;
458 DEFAULT_IMAGE_SIZE.height, // deUint32 bufferImageHeight;
459 { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource;
460 { 0, 0, 0 }, // VkOffset3D imageOffset;
461 DEFAULT_IMAGE_SIZE // VkExtent3D imageExtent;
464 beginPrimaryCommandBuffer(0);
465 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);
466 m_vkd.cmdCopyImageToBuffer(m_primaryCommandBuffers[0], *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region);
467 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);
468 VK_CHECK(m_vkd.endCommandBuffer(m_primaryCommandBuffers[0]));
470 submitPrimaryCommandBuffer();
473 invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
474 tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
481 /********* 19.1. Command Pools (5.1 in VK 1.0 Spec) ***************************/
482 tcu::TestStatus createPoolNullParamsTest(Context& context)
484 const VkDevice vkDevice = context.getDevice();
485 const DeviceInterface& vk = context.getDeviceInterface();
486 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
488 createCommandPool(vk, vkDevice, 0u, queueFamilyIndex);
490 return tcu::TestStatus::pass("Command Pool allocated correctly.");
493 tcu::TestStatus createPoolNonNullAllocatorTest(Context& context)
495 const VkDevice vkDevice = context.getDevice();
496 const DeviceInterface& vk = context.getDeviceInterface();
497 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
498 const VkAllocationCallbacks* allocationCallbacks = getSystemAllocator();
500 const VkCommandPoolCreateInfo cmdPoolParams =
502 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
505 queueFamilyIndex, // queueFamilyIndex;
508 createCommandPool(vk, vkDevice, &cmdPoolParams, allocationCallbacks);
510 return tcu::TestStatus::pass("Command Pool allocated correctly.");
513 tcu::TestStatus createPoolTransientBitTest(Context& context)
515 const VkDevice vkDevice = context.getDevice();
516 const DeviceInterface& vk = context.getDeviceInterface();
517 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
519 const VkCommandPoolCreateInfo cmdPoolParams =
521 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
523 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags;
524 queueFamilyIndex, // queueFamilyIndex;
527 createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
529 return tcu::TestStatus::pass("Command Pool allocated correctly.");
532 tcu::TestStatus createPoolResetBitTest(Context& context)
534 const VkDevice vkDevice = context.getDevice();
535 const DeviceInterface& vk = context.getDeviceInterface();
536 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
538 const VkCommandPoolCreateInfo cmdPoolParams =
540 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
542 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
543 queueFamilyIndex, // queueFamilyIndex;
546 createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL);
548 return tcu::TestStatus::pass("Command Pool allocated correctly.");
551 tcu::TestStatus resetPoolReleaseResourcesBitTest(Context& context)
553 const VkDevice vkDevice = context.getDevice();
554 const DeviceInterface& vk = context.getDeviceInterface();
555 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
557 const VkCommandPoolCreateInfo cmdPoolParams =
559 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
562 queueFamilyIndex, // queueFamilyIndex;
565 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
567 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
569 return tcu::TestStatus::pass("Command Pool allocated correctly.");
572 tcu::TestStatus resetPoolNoFlagsTest(Context& context)
574 const VkDevice vkDevice = context.getDevice();
575 const DeviceInterface& vk = context.getDeviceInterface();
576 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
578 const VkCommandPoolCreateInfo cmdPoolParams =
580 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
583 queueFamilyIndex, // queueFamilyIndex;
586 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
588 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, 0u));
590 return tcu::TestStatus::pass("Command Pool allocated correctly.");
593 bool executeCommandBuffer (const VkDevice device,
594 const DeviceInterface& vk,
596 const VkCommandBuffer commandBuffer,
597 const bool exitBeforeEndCommandBuffer = false)
599 const Unique<VkEvent> event (createEvent(vk, device));
600 const VkCommandBufferBeginInfo commandBufferBeginInfo =
602 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, //VkStructureType sType;
603 DE_NULL, //const void* pNext;
604 0u, //VkCommandBufferUsageFlags flags;
605 (const VkCommandBufferInheritanceInfo*)DE_NULL //const VkCommandBufferInheritanceInfo* pInheritanceInfo;
608 VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufferBeginInfo));
610 const VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
611 vk.cmdSetEvent(commandBuffer, *event, stageMask);
612 if (exitBeforeEndCommandBuffer)
613 return exitBeforeEndCommandBuffer;
615 VK_CHECK(vk.endCommandBuffer(commandBuffer));
618 const Unique<VkFence> fence (createFence(vk, device));
619 const VkSubmitInfo submitInfo =
621 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
623 0u, // waitSemaphoreCount
624 DE_NULL, // pWaitSemaphores
625 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
626 1u, // commandBufferCount
627 &commandBuffer, // pCommandBuffers
628 0u, // signalSemaphoreCount
629 DE_NULL // pSignalSemaphores
632 // Submit the command buffer to the queue
633 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
634 // wait for end of execution of queue
635 VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
637 // check if buffer has been executed
638 const VkResult result = vk.getEventStatus(device, *event);
639 return result == VK_EVENT_SET;
642 tcu::TestStatus resetPoolReuseTest (Context& context)
644 const VkDevice vkDevice = context.getDevice();
645 const DeviceInterface& vk = context.getDeviceInterface();
646 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
647 const VkQueue queue = context.getUniversalQueue();
649 const VkCommandPoolCreateInfo cmdPoolParams =
651 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
654 queueFamilyIndex // queueFamilyIndex;
656 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL));
657 const VkCommandBufferAllocateInfo cmdBufParams =
659 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
661 *cmdPool, // commandPool;
662 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
665 const Move<VkCommandBuffer> commandBuffers[] =
667 allocateCommandBuffer(vk, vkDevice, &cmdBufParams),
668 allocateCommandBuffer(vk, vkDevice, &cmdBufParams)
671 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
672 return tcu::TestStatus::fail("Failed");
673 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1]), true))
674 return tcu::TestStatus::fail("Failed");
676 VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT));
678 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0])))
679 return tcu::TestStatus::fail("Failed");
680 if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1])))
681 return tcu::TestStatus::fail("Failed");
684 const Unique<VkCommandBuffer> afterResetCommandBuffers(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
685 if (!executeCommandBuffer(vkDevice, vk, queue, *afterResetCommandBuffers))
686 return tcu::TestStatus::fail("Failed");
689 return tcu::TestStatus::pass("Passed");
692 /******** 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) ******************/
693 tcu::TestStatus allocatePrimaryBufferTest(Context& context)
695 const VkDevice vkDevice = context.getDevice();
696 const DeviceInterface& vk = context.getDeviceInterface();
697 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
699 const VkCommandPoolCreateInfo cmdPoolParams =
701 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
703 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
704 queueFamilyIndex, // queueFamilyIndex;
706 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
709 const VkCommandBufferAllocateInfo cmdBufParams =
711 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
713 *cmdPool, // commandPool;
714 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
717 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
719 return tcu::TestStatus::pass("Buffer was created correctly.");
722 tcu::TestStatus allocateManyPrimaryBuffersTest(Context& context)
725 const VkDevice vkDevice = context.getDevice();
726 const DeviceInterface& vk = context.getDeviceInterface();
727 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
729 const VkCommandPoolCreateInfo cmdPoolParams =
731 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
732 DE_NULL, // const void* pNext;
733 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
734 queueFamilyIndex, // deUint32 queueFamilyIndex;
736 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
738 // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
739 #if (DE_PTR_SIZE == 4)
740 const unsigned minCommandBuffer = 1024;
742 const unsigned minCommandBuffer = 10000;
746 const VkCommandBufferAllocateInfo cmdBufParams =
748 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
749 DE_NULL, // const void* pNext;
750 *cmdPool, // VkCommandPool pool;
751 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
752 minCommandBuffer, // uint32_t bufferCount;
755 // do not keep the handles to buffers, as they will be freed with command pool
757 // allocate the minimum required amount of buffers
758 VkCommandBuffer cmdBuffers[minCommandBuffer];
759 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
761 std::ostringstream out;
762 out << "allocateManyPrimaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
764 return tcu::TestStatus::pass(out.str());
767 tcu::TestStatus allocateSecondaryBufferTest(Context& context)
769 const VkDevice vkDevice = context.getDevice();
770 const DeviceInterface& vk = context.getDeviceInterface();
771 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
773 const VkCommandPoolCreateInfo cmdPoolParams =
775 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
777 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
778 queueFamilyIndex, // queueFamilyIndex;
780 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
783 const VkCommandBufferAllocateInfo cmdBufParams =
785 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
787 *cmdPool, // commandPool;
788 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
791 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
793 return tcu::TestStatus::pass("Buffer was created correctly.");
796 tcu::TestStatus allocateManySecondaryBuffersTest(Context& context)
799 const VkDevice vkDevice = context.getDevice();
800 const DeviceInterface& vk = context.getDeviceInterface();
801 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
803 const VkCommandPoolCreateInfo cmdPoolParams =
805 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
806 DE_NULL, // const void* pNext;
807 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
808 queueFamilyIndex, // deUint32 queueFamilyIndex;
810 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
812 // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities.
813 #if (DE_PTR_SIZE == 4)
814 const unsigned minCommandBuffer = 1024;
816 const unsigned minCommandBuffer = 10000;
820 const VkCommandBufferAllocateInfo cmdBufParams =
822 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
823 DE_NULL, // const void* pNext;
824 *cmdPool, // VkCommandPool pool;
825 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
826 minCommandBuffer, // uint32_t bufferCount;
829 // do not keep the handles to buffers, as they will be freed with command pool
831 // allocate the minimum required amount of buffers
832 VkCommandBuffer cmdBuffers[minCommandBuffer];
833 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
835 std::ostringstream out;
836 out << "allocateManySecondaryBuffersTest succeded: created " << minCommandBuffer << " command buffers";
838 return tcu::TestStatus::pass(out.str());
841 tcu::TestStatus executePrimaryBufferTest(Context& context)
843 const VkDevice vkDevice = context.getDevice();
844 const DeviceInterface& vk = context.getDeviceInterface();
845 const VkQueue queue = context.getUniversalQueue();
846 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
848 const VkCommandPoolCreateInfo cmdPoolParams =
850 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
851 DE_NULL, // const void* pNext;
852 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
853 queueFamilyIndex, // deUint32 queueFamilyIndex;
855 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
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_PRIMARY, // VkCommandBufferLevel level;
864 1u, // uint32_t bufferCount;
866 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
867 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
869 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
872 (const VkCommandBufferInheritanceInfo*)DE_NULL,
875 // create event that will be used to check if secondary command buffer has been executed
876 const Unique<VkEvent> event (createEvent(vk, vkDevice));
879 VK_CHECK(vk.resetEvent(vkDevice, *event));
881 // record primary command buffer
882 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
884 // allow execution of event during every stage of pipeline
885 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
887 // record setting event
888 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
890 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
892 // create fence to wait for execution of queue
893 const Unique<VkFence> fence (createFence(vk, vkDevice));
895 const VkSubmitInfo submitInfo =
897 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
899 0u, // waitSemaphoreCount
900 DE_NULL, // pWaitSemaphores
901 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
902 1, // commandBufferCount
903 &primCmdBuf.get(), // pCommandBuffers
904 0u, // signalSemaphoreCount
905 DE_NULL, // pSignalSemaphores
908 // Submit the command buffer to the queue
909 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
911 // wait for end of execution of queue
912 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
914 // check if buffer has been executed
915 VkResult result = vk.getEventStatus(vkDevice,*event);
916 if (result == VK_EVENT_SET)
917 return tcu::TestStatus::pass("Execute Primary Command Buffer succeeded");
919 return tcu::TestStatus::fail("Execute Primary Command Buffer FAILED");
922 tcu::TestStatus executeLargePrimaryBufferTest(Context& context)
924 const VkDevice vkDevice = context.getDevice();
925 const DeviceInterface& vk = context.getDeviceInterface();
926 const VkQueue queue = context.getUniversalQueue();
927 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
928 const deUint32 LARGE_BUFFER_SIZE = 10000;
930 const VkCommandPoolCreateInfo cmdPoolParams =
932 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
933 DE_NULL, // const void* pNext;
934 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
935 queueFamilyIndex, // deUint32 queueFamilyIndex;
937 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
940 const VkCommandBufferAllocateInfo cmdBufParams =
942 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
943 DE_NULL, // const void* pNext;
944 *cmdPool, // VkCommandPool pool;
945 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
946 1u, // uint32_t bufferCount;
948 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
949 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
951 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
954 (const VkCommandBufferInheritanceInfo*)DE_NULL,
957 std::vector<VkEventSp> events;
958 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
959 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
961 // record primary command buffer
962 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
964 // set all the events
965 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
967 vk.cmdSetEvent(*primCmdBuf, events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
970 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
972 // create fence to wait for execution of queue
973 const Unique<VkFence> fence (createFence(vk, vkDevice));
975 const VkSubmitInfo submitInfo =
977 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
979 0u, // waitSemaphoreCount
980 DE_NULL, // pWaitSemaphores
981 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
982 1, // commandBufferCount
983 &primCmdBuf.get(), // pCommandBuffers
984 0u, // signalSemaphoreCount
985 DE_NULL, // pSignalSemaphores
988 // Submit the command buffer to the queue
989 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
991 // wait for end of execution of queue
992 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
994 // check if the buffer was executed correctly - all events had their status
996 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
998 for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx)
1000 if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
1002 testResult = tcu::TestStatus::fail("An event was not set.");
1007 if (!testResult.isComplete())
1008 testResult = tcu::TestStatus::pass("All events set correctly.");
1013 tcu::TestStatus resetBufferImplicitlyTest(Context& context)
1015 const VkDevice vkDevice = context.getDevice();
1016 const DeviceInterface& vk = context.getDeviceInterface();
1017 const VkQueue queue = context.getUniversalQueue();
1018 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1020 const VkCommandPoolCreateInfo cmdPoolParams =
1022 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
1024 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
1025 queueFamilyIndex, // queueFamilyIndex;
1027 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1030 const VkCommandBufferAllocateInfo cmdBufParams =
1032 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
1035 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
1038 const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1040 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1042 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1045 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1048 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1050 // Put the command buffer in recording state.
1051 VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
1054 vk.cmdSetEvent(*cmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1056 VK_CHECK(vk.endCommandBuffer(*cmdBuf));
1058 // We'll use a fence to wait for the execution of the queue
1059 const Unique<VkFence> fence (createFence(vk, vkDevice));
1061 const VkSubmitInfo submitInfo =
1063 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1065 0u, // waitSemaphoreCount
1066 DE_NULL, // pWaitSemaphores
1067 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1068 1u, // commandBufferCount
1069 &cmdBuf.get(), // pCommandBuffers
1070 0u, // signalSemaphoreCount
1071 DE_NULL, // pSignalSemaphores
1074 // Submitting the command buffer that sets the event to the queue
1075 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1077 // Waiting for the queue to finish executing
1078 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1079 // Reset the fence so that we can reuse it
1080 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1082 // Check if the buffer was executed
1083 if (vk.getEventStatus(vkDevice, *event) != VK_EVENT_SET)
1084 return tcu::TestStatus::fail("Failed to set the event.");
1087 vk.resetEvent(vkDevice, *event);
1088 if(vk.getEventStatus(vkDevice, *event) != VK_EVENT_RESET)
1089 return tcu::TestStatus::fail("Failed to reset the event.");
1091 // Reset the command buffer by putting it in recording state again. This
1092 // should empty the command buffer.
1093 VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo));
1094 VK_CHECK(vk.endCommandBuffer(*cmdBuf));
1096 // Submit the command buffer after resetting. It should have no commands
1097 // recorded, so the event should remain unsignaled.
1098 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1099 // Waiting for the queue to finish executing
1100 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1102 // Check if the event remained unset.
1103 if(vk.getEventStatus(vkDevice, *event) == VK_EVENT_RESET)
1104 return tcu::TestStatus::pass("Buffer was reset correctly.");
1106 return tcu::TestStatus::fail("Buffer was not reset correctly.");
1109 using de::SharedPtr;
1110 typedef SharedPtr<Unique<VkEvent> > VkEventShared;
1112 template<typename T>
1113 inline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move)
1115 return SharedPtr<Unique<T> >(new Unique<T>(move));
1118 bool submitAndCheck (Context& context, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
1120 const VkDevice vkDevice = context.getDevice();
1121 const DeviceInterface& vk = context.getDeviceInterface();
1122 const VkQueue queue = context.getUniversalQueue();
1123 const Unique<VkFence> fence (createFence(vk, vkDevice));
1125 const VkSubmitInfo submitInfo =
1127 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1129 0u, // waitSemaphoreCount
1130 DE_NULL, // pWaitSemaphores
1131 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1132 static_cast<deUint32>(cmdBuffers.size()), // commandBufferCount
1133 &cmdBuffers[0], // pCommandBuffers
1134 0u, // signalSemaphoreCount
1135 DE_NULL, // pSignalSemaphores
1138 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
1139 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT));
1141 for(int eventNdx = 0; eventNdx < static_cast<int>(events.size()); ++eventNdx)
1143 if (vk.getEventStatus(vkDevice, **events[eventNdx]) != VK_EVENT_SET)
1145 vk.resetEvent(vkDevice, **events[eventNdx]);
1151 void createCommadBuffers (const DeviceInterface& vk,
1152 const VkDevice vkDevice,
1153 deUint32 bufferCount,
1155 const VkCommandBufferLevel cmdBufferLevel,
1156 VkCommandBuffer* pCommandBuffers)
1158 const VkCommandBufferAllocateInfo cmdBufParams =
1160 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1161 DE_NULL, // const void* pNext;
1162 pool, // VkCommandPool pool;
1163 cmdBufferLevel, // VkCommandBufferLevel level;
1164 bufferCount, // uint32_t bufferCount;
1166 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, pCommandBuffers));
1169 void addCommandsToBuffer (const DeviceInterface& vk, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events)
1171 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1173 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1175 (VkRenderPass)0u, // renderPass
1177 (VkFramebuffer)0u, // framebuffer
1178 VK_FALSE, // occlusionQueryEnable
1179 (VkQueryControlFlags)0u, // queryFlags
1180 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1183 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1185 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1188 &secCmdBufInheritInfo, // pInheritanceInfo;
1191 for(int bufferNdx = 0; bufferNdx < static_cast<int>(cmdBuffers.size()); ++bufferNdx)
1193 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[bufferNdx], &cmdBufBeginInfo));
1194 vk.cmdSetEvent(cmdBuffers[bufferNdx], **events[bufferNdx % events.size()], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1195 VK_CHECK(vk.endCommandBuffer(cmdBuffers[bufferNdx]));
1199 bool executeSecondaryCmdBuffer (Context& context,
1201 std::vector<VkCommandBuffer>& cmdBuffersSecondary,
1202 std::vector <VkEventShared>& events)
1204 const VkDevice vkDevice = context.getDevice();
1205 const DeviceInterface& vk = context.getDeviceInterface();
1206 std::vector<VkCommandBuffer> cmdBuffer (1);
1207 const VkCommandBufferBeginInfo cmdBufBeginInfo =
1209 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
1212 (const VkCommandBufferInheritanceInfo*)DE_NULL, // pInheritanceInfo;
1215 createCommadBuffers(vk, vkDevice, 1u, pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, &cmdBuffer[0]);
1216 VK_CHECK(vk.beginCommandBuffer(cmdBuffer[0], &cmdBufBeginInfo));
1217 vk.cmdExecuteCommands(cmdBuffer[0], static_cast<deUint32>(cmdBuffersSecondary.size()), &cmdBuffersSecondary[0]);
1218 VK_CHECK(vk.endCommandBuffer(cmdBuffer[0]));
1220 bool returnValue = submitAndCheck(context, cmdBuffer, events);
1221 vk.freeCommandBuffers(vkDevice, pool, 1u, &cmdBuffer[0]);
1225 tcu::TestStatus trimCommandPoolTest (Context& context, const VkCommandBufferLevel cmdBufferLevel)
1227 if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance1"))
1228 TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported");
1230 const VkDevice vkDevice = context.getDevice();
1231 const DeviceInterface& vk = context.getDeviceInterface();
1232 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1235 const deUint32 cmdBufferIterationCount = 300u;
1236 const deUint32 cmdBufferCount = 10u;
1238 const VkCommandPoolCreateInfo cmdPoolParams =
1240 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
1242 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
1243 queueFamilyIndex, // queueFamilyIndex;
1245 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1247 std::vector <VkEventShared> events;
1248 for (deUint32 ndx = 0u; ndx < cmdBufferCount; ++ndx)
1249 events.push_back(makeSharedPtr(createEvent(vk, vkDevice)));
1252 std::vector<VkCommandBuffer> cmdBuffers(cmdBufferCount);
1253 createCommadBuffers(vk, vkDevice, cmdBufferCount, *cmdPool, cmdBufferLevel, &cmdBuffers[0]);
1255 for (deUint32 cmdBufferIterationrNdx = 0; cmdBufferIterationrNdx < cmdBufferIterationCount; ++cmdBufferIterationrNdx)
1257 addCommandsToBuffer(vk, cmdBuffers, events);
1259 //Peak, situation when we use a lot more command buffers
1260 if (cmdBufferIterationrNdx % 10u == 0)
1262 std::vector<VkCommandBuffer> cmdBuffersPeak(cmdBufferCount * 10u);
1263 createCommadBuffers(vk, vkDevice, static_cast<deUint32>(cmdBuffersPeak.size()), *cmdPool, cmdBufferLevel, &cmdBuffersPeak[0]);
1264 addCommandsToBuffer(vk, cmdBuffersPeak, events);
1266 switch(cmdBufferLevel)
1268 case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
1269 if (!submitAndCheck(context, cmdBuffersPeak, events))
1270 return tcu::TestStatus::fail("Fail");
1272 case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
1273 if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffersPeak, events))
1274 return tcu::TestStatus::fail("Fail");
1279 vk.freeCommandBuffers(vkDevice, *cmdPool, static_cast<deUint32>(cmdBuffersPeak.size()), &cmdBuffersPeak[0]);
1282 vk.trimCommandPoolKHR(vkDevice, *cmdPool, (VkCommandPoolTrimFlagsKHR)0);
1284 switch(cmdBufferLevel)
1286 case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
1287 if (!submitAndCheck(context, cmdBuffers, events))
1288 return tcu::TestStatus::fail("Fail");
1290 case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
1291 if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffers, events))
1292 return tcu::TestStatus::fail("Fail");
1298 for (deUint32 bufferNdx = cmdBufferIterationrNdx % 3u; bufferNdx < cmdBufferCount; bufferNdx+=2u)
1300 vk.freeCommandBuffers(vkDevice, *cmdPool, 1u, &cmdBuffers[bufferNdx]);
1301 createCommadBuffers(vk, vkDevice, 1u, *cmdPool, cmdBufferLevel, &cmdBuffers[bufferNdx]);
1306 return tcu::TestStatus::pass("Pass");
1309 /******** 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) *****************/
1310 tcu::TestStatus recordSinglePrimaryBufferTest(Context& context)
1312 const VkDevice vkDevice = context.getDevice();
1313 const DeviceInterface& vk = context.getDeviceInterface();
1314 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1316 const VkCommandPoolCreateInfo cmdPoolParams =
1318 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1319 DE_NULL, // const void* pNext;
1320 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1321 queueFamilyIndex, // deUint32 queueFamilyIndex;
1323 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1326 const VkCommandBufferAllocateInfo cmdBufParams =
1328 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1329 DE_NULL, // const void* pNext;
1330 *cmdPool, // VkCommandPool pool;
1331 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1332 1u, // uint32_t bufferCount;
1334 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1336 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1338 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1341 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1344 // create event that will be used to check if secondary command buffer has been executed
1345 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1347 // record primary command buffer
1348 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1350 // record setting event
1351 vk.cmdSetEvent(*primCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1353 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1355 return tcu::TestStatus::pass("Primary buffer recorded successfully.");
1358 tcu::TestStatus recordLargePrimaryBufferTest(Context &context)
1361 const VkDevice vkDevice = context.getDevice();
1362 const DeviceInterface& vk = context.getDeviceInterface();
1363 const VkQueue queue = context.getUniversalQueue();
1364 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1366 const VkCommandPoolCreateInfo cmdPoolParams =
1368 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1369 DE_NULL, // const void* pNext;
1370 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1371 queueFamilyIndex, // deUint32 queueFamilyIndex;
1373 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1376 const VkCommandBufferAllocateInfo cmdBufParams =
1378 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1379 DE_NULL, // const void* pNext;
1380 *cmdPool, // VkCommandPool pool;
1381 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1382 1u, // uint32_t bufferCount;
1384 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1385 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1387 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1390 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1393 // create event that will be used to check if secondary command buffer has been executed
1394 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1397 VK_CHECK(vk.resetEvent(vkDevice, *event));
1399 // record primary command buffer
1400 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1402 // allow execution of event during every stage of pipeline
1403 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1405 // define minimal amount of commands to accept
1406 const long long unsigned minNumCommands = 10000llu;
1408 for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
1410 // record setting event
1411 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1413 // record resetting event
1414 vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
1418 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1420 // create fence to wait for execution of queue
1421 const Unique<VkFence> fence (createFence(vk, vkDevice));
1423 const VkSubmitInfo submitInfo =
1425 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1427 0u, // waitSemaphoreCount
1428 DE_NULL, // pWaitSemaphores
1429 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1430 1, // commandBufferCount
1431 &primCmdBuf.get(), // pCommandBuffers
1432 0u, // signalSemaphoreCount
1433 DE_NULL, // pSignalSemaphores
1436 // Submit the command buffer to the queue
1437 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1439 // wait for end of execution of queue
1440 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1442 return tcu::TestStatus::pass("hugeTest succeeded");
1445 tcu::TestStatus recordSingleSecondaryBufferTest(Context& context)
1447 const VkDevice vkDevice = context.getDevice();
1448 const DeviceInterface& vk = context.getDeviceInterface();
1449 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1451 const VkCommandPoolCreateInfo cmdPoolParams =
1453 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1454 DE_NULL, // const void* pNext;
1455 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1456 queueFamilyIndex, // deUint32 queueFamilyIndex;
1458 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1461 const VkCommandBufferAllocateInfo cmdBufParams =
1463 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1464 DE_NULL, // const void* pNext;
1465 *cmdPool, // VkCommandPool pool;
1466 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
1467 1u, // uint32_t bufferCount;
1469 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1471 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1473 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1475 (VkRenderPass)0u, // renderPass
1477 (VkFramebuffer)0u, // framebuffer
1478 VK_FALSE, // occlusionQueryEnable
1479 (VkQueryControlFlags)0u, // queryFlags
1480 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1482 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
1484 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1487 &secCmdBufInheritInfo,
1490 // create event that will be used to check if secondary command buffer has been executed
1491 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1493 // record primary command buffer
1494 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
1496 // record setting event
1497 vk.cmdSetEvent(*secCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1499 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
1501 return tcu::TestStatus::pass("Secondary buffer recorded successfully.");
1504 tcu::TestStatus recordLargeSecondaryBufferTest(Context &context)
1507 const VkDevice vkDevice = context.getDevice();
1508 const DeviceInterface& vk = context.getDeviceInterface();
1509 const VkQueue queue = context.getUniversalQueue();
1510 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1512 const VkCommandPoolCreateInfo cmdPoolParams =
1514 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1515 DE_NULL, // const void* pNext;
1516 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1517 queueFamilyIndex, // deUint32 queueFamilyIndex;
1519 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1522 const VkCommandBufferAllocateInfo cmdBufParams =
1524 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1525 DE_NULL, // const void* pNext;
1526 *cmdPool, // VkCommandPool pool;
1527 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1528 1u, // uint32_t bufferCount;
1530 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1531 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1533 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1536 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1539 // create event that will be used to check if secondary command buffer has been executed
1540 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1543 VK_CHECK(vk.resetEvent(vkDevice, *event));
1545 // record primary command buffer
1546 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1548 // allow execution of event during every stage of pipeline
1549 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1551 // define minimal amount of commands to accept
1552 const long long unsigned minNumCommands = 10000llu;
1554 for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands )
1556 // record setting event
1557 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1559 // record resetting event
1560 vk.cmdResetEvent(*primCmdBuf, *event,stageMask);
1565 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1567 // create fence to wait for execution of queue
1568 const Unique<VkFence> fence (createFence(vk, vkDevice));
1570 const VkSubmitInfo submitInfo =
1572 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1574 0u, // waitSemaphoreCount
1575 DE_NULL, // pWaitSemaphores
1576 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1577 1, // commandBufferCount
1578 &primCmdBuf.get(), // pCommandBuffers
1579 0u, // signalSemaphoreCount
1580 DE_NULL, // pSignalSemaphores
1583 // Submit the command buffer to the queue
1584 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1586 // wait for end of execution of queue
1587 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1589 return tcu::TestStatus::pass("hugeTest succeeded");
1592 tcu::TestStatus submitPrimaryBufferTwiceTest(Context& context)
1595 const VkDevice vkDevice = context.getDevice();
1596 const DeviceInterface& vk = context.getDeviceInterface();
1597 const VkQueue queue = context.getUniversalQueue();
1598 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1600 const VkCommandPoolCreateInfo cmdPoolParams =
1602 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1603 DE_NULL, // const void* pNext;
1604 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1605 queueFamilyIndex, // deUint32 queueFamilyIndex;
1607 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1610 const VkCommandBufferAllocateInfo cmdBufParams =
1612 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1613 DE_NULL, // const void* pNext;
1614 *cmdPool, // VkCommandPool pool;
1615 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1616 1u, // uint32_t bufferCount;
1618 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1619 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1621 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1624 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1627 // create event that will be used to check if secondary command buffer has been executed
1628 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1631 VK_CHECK(vk.resetEvent(vkDevice, *event));
1633 // record primary command buffer
1634 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1636 // allow execution of event during every stage of pipeline
1637 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1639 // record setting event
1640 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1642 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1644 // create fence to wait for execution of queue
1645 const Unique<VkFence> fence (createFence(vk, vkDevice));
1647 const VkSubmitInfo submitInfo =
1649 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1651 0u, // waitSemaphoreCount
1652 DE_NULL, // pWaitSemaphores
1653 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1654 1, // commandBufferCount
1655 &primCmdBuf.get(), // pCommandBuffers
1656 0u, // signalSemaphoreCount
1657 DE_NULL, // pSignalSemaphores
1660 // submit primary buffer
1661 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1663 // wait for end of execution of queue
1664 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1665 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1666 // check if buffer has been executed
1667 VkResult result = vk.getEventStatus(vkDevice,*event);
1668 if (result != VK_EVENT_SET)
1669 return tcu::TestStatus::fail("Submit Twice Test FAILED");
1672 VK_CHECK(vk.resetEvent(vkDevice, *event));
1674 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1676 // wait for end of execution of queue
1677 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1679 // check if buffer has been executed
1680 result = vk.getEventStatus(vkDevice,*event);
1681 if (result != VK_EVENT_SET)
1682 return tcu::TestStatus::fail("Submit Twice Test FAILED");
1684 return tcu::TestStatus::pass("Submit Twice Test succeeded");
1687 tcu::TestStatus submitSecondaryBufferTwiceTest(Context& context)
1690 const VkDevice vkDevice = context.getDevice();
1691 const DeviceInterface& vk = context.getDeviceInterface();
1692 const VkQueue queue = context.getUniversalQueue();
1693 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1695 const VkCommandPoolCreateInfo cmdPoolParams =
1697 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1698 DE_NULL, // const void* pNext;
1699 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1700 queueFamilyIndex, // deUint32 queueFamilyIndex;
1703 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1706 const VkCommandBufferAllocateInfo cmdBufParams =
1708 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1709 DE_NULL, // const void* pNext;
1710 *cmdPool, // VkCommandPool pool;
1711 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1712 1u, // uint32_t bufferCount;
1715 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1716 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1718 // Secondary Command buffer
1719 const VkCommandBufferAllocateInfo secCmdBufParams =
1721 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1722 DE_NULL, // const void* pNext;
1723 *cmdPool, // VkCommandPool pool;
1724 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
1725 1u, // uint32_t bufferCount;
1727 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
1729 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1731 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1734 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1737 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
1739 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1741 (VkRenderPass)0u, // renderPass
1743 (VkFramebuffer)0u, // framebuffer
1744 VK_FALSE, // occlusionQueryEnable
1745 (VkQueryControlFlags)0u, // queryFlags
1746 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
1748 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
1750 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1753 &secCmdBufInheritInfo,
1756 // create event that will be used to check if secondary command buffer has been executed
1757 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1760 VK_CHECK(vk.resetEvent(vkDevice, *event));
1762 // record first primary command buffer
1763 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
1765 // record secondary command buffer
1766 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
1768 // allow execution of event during every stage of pipeline
1769 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1771 // record setting event
1772 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
1775 // end recording of secondary buffers
1776 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
1778 // execute secondary buffer
1779 vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
1781 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
1783 // create fence to wait for execution of queue
1784 const Unique<VkFence> fence (createFence(vk, vkDevice));
1786 const VkSubmitInfo submitInfo1 =
1788 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1790 0u, // waitSemaphoreCount
1791 DE_NULL, // pWaitSemaphores
1792 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1793 1, // commandBufferCount
1794 &primCmdBuf1.get(), // pCommandBuffers
1795 0u, // signalSemaphoreCount
1796 DE_NULL, // pSignalSemaphores
1799 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
1801 // wait for end of execution of queue
1802 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1803 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1805 // check if secondary buffer has been executed
1806 VkResult result = vk.getEventStatus(vkDevice,*event);
1807 if (result != VK_EVENT_SET)
1808 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
1810 // reset first primary buffer
1811 vk.resetCommandBuffer( *primCmdBuf1, 0u);
1813 // reset event to allow receiving it again
1814 VK_CHECK(vk.resetEvent(vkDevice, *event));
1816 // record second primary command buffer
1817 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
1819 // execute secondary buffer
1820 vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
1823 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
1825 // submit second primary buffer, the secondary should be executed too
1826 const VkSubmitInfo submitInfo2 =
1828 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1830 0u, // waitSemaphoreCount
1831 DE_NULL, // pWaitSemaphores
1832 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1833 1, // commandBufferCount
1834 &primCmdBuf2.get(), // pCommandBuffers
1835 0u, // signalSemaphoreCount
1836 DE_NULL, // pSignalSemaphores
1838 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
1840 // wait for end of execution of queue
1841 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1843 // check if secondary buffer has been executed
1844 result = vk.getEventStatus(vkDevice,*event);
1845 if (result != VK_EVENT_SET)
1846 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
1848 return tcu::TestStatus::pass("Submit Twice Secondary Command Buffer succeeded");
1851 tcu::TestStatus oneTimeSubmitFlagPrimaryBufferTest(Context& context)
1854 const VkDevice vkDevice = context.getDevice();
1855 const DeviceInterface& vk = context.getDeviceInterface();
1856 const VkQueue queue = context.getUniversalQueue();
1857 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1859 const VkCommandPoolCreateInfo cmdPoolParams =
1861 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1862 DE_NULL, // const void* pNext;
1863 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1864 queueFamilyIndex, // deUint32 queueFamilyIndex;
1866 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1869 const VkCommandBufferAllocateInfo cmdBufParams =
1871 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1872 DE_NULL, // const void* pNext;
1873 *cmdPool, // VkCommandPool pool;
1874 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1875 1u, // uint32_t bufferCount;
1877 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1878 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
1880 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1882 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
1883 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1886 // create event that will be used to check if secondary command buffer has been executed
1887 const Unique<VkEvent> event (createEvent(vk, vkDevice));
1890 VK_CHECK(vk.resetEvent(vkDevice, *event));
1892 // record primary command buffer
1893 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1895 // allow execution of event during every stage of pipeline
1896 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1898 // record setting event
1899 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1901 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1903 // create fence to wait for execution of queue
1904 const Unique<VkFence> fence (createFence(vk, vkDevice));
1906 const VkSubmitInfo submitInfo =
1908 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
1910 0u, // waitSemaphoreCount
1911 DE_NULL, // pWaitSemaphores
1912 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
1913 1, // commandBufferCount
1914 &primCmdBuf.get(), // pCommandBuffers
1915 0u, // signalSemaphoreCount
1916 DE_NULL, // pSignalSemaphores
1919 // submit primary buffer
1920 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1922 // wait for end of execution of queue
1923 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1924 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
1926 // check if buffer has been executed
1927 VkResult result = vk.getEventStatus(vkDevice,*event);
1928 if (result != VK_EVENT_SET)
1929 return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
1931 // record primary command buffer again - implicit reset because of VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
1932 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
1934 // allow execution of event during every stage of pipeline
1935 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1937 // record setting event
1938 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
1940 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
1943 VK_CHECK(vk.resetEvent(vkDevice, *event));
1945 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
1947 // wait for end of execution of queue
1948 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
1950 // check if buffer has been executed
1951 result = vk.getEventStatus(vkDevice,*event);
1952 if (result != VK_EVENT_SET)
1953 return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED");
1955 return tcu::TestStatus::pass("oneTimeSubmitFlagPrimaryBufferTest succeeded");
1958 tcu::TestStatus oneTimeSubmitFlagSecondaryBufferTest(Context& context)
1961 const VkDevice vkDevice = context.getDevice();
1962 const DeviceInterface& vk = context.getDeviceInterface();
1963 const VkQueue queue = context.getUniversalQueue();
1964 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
1966 const VkCommandPoolCreateInfo cmdPoolParams =
1968 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1969 DE_NULL, // const void* pNext;
1970 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
1971 queueFamilyIndex, // deUint32 queueFamilyIndex;
1974 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
1977 const VkCommandBufferAllocateInfo cmdBufParams =
1979 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1980 DE_NULL, // const void* pNext;
1981 *cmdPool, // VkCommandPool pool;
1982 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1983 1u, // uint32_t bufferCount;
1986 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1987 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
1989 // Secondary Command buffer
1990 const VkCommandBufferAllocateInfo secCmdBufParams =
1992 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1993 DE_NULL, // const void* pNext;
1994 *cmdPool, // VkCommandPool pool;
1995 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
1996 1u, // uint32_t bufferCount;
1998 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2000 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2002 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2005 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2008 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2010 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2012 (VkRenderPass)0u, // renderPass
2014 (VkFramebuffer)0u, // framebuffer
2015 VK_FALSE, // occlusionQueryEnable
2016 (VkQueryControlFlags)0u, // queryFlags
2017 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2019 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2021 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2023 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
2024 &secCmdBufInheritInfo,
2027 // create event that will be used to check if secondary command buffer has been executed
2028 const Unique<VkEvent> event (createEvent(vk, vkDevice));
2031 VK_CHECK(vk.resetEvent(vkDevice, *event));
2033 // record first primary command buffer
2034 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
2036 // record secondary command buffer
2037 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2039 // allow execution of event during every stage of pipeline
2040 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2042 // record setting event
2043 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
2046 // end recording of secondary buffers
2047 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2049 // execute secondary buffer
2050 vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get());
2052 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
2054 // create fence to wait for execution of queue
2055 const Unique<VkFence> fence (createFence(vk, vkDevice));
2057 const VkSubmitInfo submitInfo1 =
2059 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2061 0u, // waitSemaphoreCount
2062 DE_NULL, // pWaitSemaphores
2063 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2064 1, // commandBufferCount
2065 &primCmdBuf1.get(), // pCommandBuffers
2066 0u, // signalSemaphoreCount
2067 DE_NULL, // pSignalSemaphores
2070 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
2072 // wait for end of execution of queue
2073 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2074 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
2076 // check if secondary buffer has been executed
2077 VkResult result = vk.getEventStatus(vkDevice,*event);
2078 if (result != VK_EVENT_SET)
2079 return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED");
2081 // reset first primary buffer
2082 vk.resetCommandBuffer( *primCmdBuf1, 0u);
2084 // reset event to allow receiving it again
2085 VK_CHECK(vk.resetEvent(vkDevice, *event));
2087 // record secondary command buffer again
2088 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2090 // allow execution of event during every stage of pipeline
2091 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2093 // record setting event
2094 vk.cmdSetEvent(*secCmdBuf, *event,stageMask);
2096 // end recording of secondary buffers
2097 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2099 // record second primary command buffer
2100 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
2102 // execute secondary buffer
2103 vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get());
2106 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
2108 // submit second primary buffer, the secondary should be executed too
2109 const VkSubmitInfo submitInfo2 =
2111 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2113 0u, // waitSemaphoreCount
2114 DE_NULL, // pWaitSemaphores
2115 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2116 1, // commandBufferCount
2117 &primCmdBuf2.get(), // pCommandBuffers
2118 0u, // signalSemaphoreCount
2119 DE_NULL, // pSignalSemaphores
2121 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
2123 // wait for end of execution of queue
2124 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2126 // check if secondary buffer has been executed
2127 result = vk.getEventStatus(vkDevice,*event);
2128 if (result != VK_EVENT_SET)
2129 return tcu::TestStatus::fail("oneTimeSubmitFlagSecondaryBufferTest FAILED");
2131 return tcu::TestStatus::pass("oneTimeSubmitFlagSecondaryBufferTest succeeded");
2134 tcu::TestStatus renderPassContinueTest(Context& context)
2136 const DeviceInterface& vkd = context.getDeviceInterface();
2137 CommandBufferRenderPassTestEnvironment env (context, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
2139 VkCommandBuffer primaryCommandBuffer = env.getPrimaryCommandBuffer();
2140 VkCommandBuffer secondaryCommandBuffer = env.getSecondaryCommandBuffer();
2141 const deUint32 clearColor[4] = { 2, 47, 131, 211 };
2143 const VkClearAttachment clearAttachment =
2145 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2146 0, // deUint32 colorAttachment;
2147 makeClearValueColorU32(clearColor[0],
2150 clearColor[3]) // VkClearValue clearValue;
2153 const VkClearRect clearRect =
2155 CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA, // VkRect2D rect;
2156 0u, // deUint32 baseArrayLayer;
2157 1u // deUint32 layerCount;
2160 env.beginSecondaryCommandBuffer(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT);
2161 vkd.cmdClearAttachments(secondaryCommandBuffer, 1, &clearAttachment, 1, &clearRect);
2162 VK_CHECK(vkd.endCommandBuffer(secondaryCommandBuffer));
2165 env.beginPrimaryCommandBuffer(0);
2166 env.beginRenderPass(VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
2167 vkd.cmdExecuteCommands(primaryCommandBuffer, 1, &secondaryCommandBuffer);
2168 vkd.cmdEndRenderPass(primaryCommandBuffer);
2170 VK_CHECK(vkd.endCommandBuffer(primaryCommandBuffer));
2172 env.submitPrimaryCommandBuffer();
2174 de::MovePtr<tcu::TextureLevel> result = env.readColorAttachment();
2175 tcu::PixelBufferAccess pixelBufferAccess = result->getAccess();
2177 for (deUint32 i = 0; i < (CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.width * CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.height); ++i)
2179 deUint8* colorData = reinterpret_cast<deUint8*>(pixelBufferAccess.getDataPtr());
2180 for (int colorComponent = 0; colorComponent < 4; ++colorComponent)
2181 if (colorData[i * 4 + colorComponent] != clearColor[colorComponent])
2182 return tcu::TestStatus::fail("clear value mismatch");
2185 return tcu::TestStatus::pass("render pass continue test passed");
2188 tcu::TestStatus simultaneousUsePrimaryBufferTest(Context& context)
2191 const VkDevice vkDevice = context.getDevice();
2192 const DeviceInterface& vk = context.getDeviceInterface();
2193 const VkQueue queue = context.getUniversalQueue();
2194 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2196 const VkCommandPoolCreateInfo cmdPoolParams =
2198 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2199 DE_NULL, // const void* pNext;
2200 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2201 queueFamilyIndex, // deUint32 queueFamilyIndex;
2203 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2206 const VkCommandBufferAllocateInfo cmdBufParams =
2208 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2209 DE_NULL, // const void* pNext;
2210 *cmdPool, // VkCommandPool pool;
2211 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2212 1u, // uint32_t bufferCount;
2214 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2215 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2217 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2219 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2220 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2223 // create event that will be used to check if secondary command buffer has been executed
2224 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice));
2225 const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice));
2228 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
2230 // record primary command buffer
2231 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2234 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);
2236 // Set the second event
2237 vk.cmdSetEvent(*primCmdBuf, eventTwo.get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
2239 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2241 // create fence to wait for execution of queue
2242 const Unique<VkFence> fence1 (createFence(vk, vkDevice));
2243 const Unique<VkFence> fence2 (createFence(vk, vkDevice));
2246 const VkSubmitInfo submitInfo =
2248 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2250 0u, // waitSemaphoreCount
2251 DE_NULL, // pWaitSemaphores
2252 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2253 1, // commandBufferCount
2254 &primCmdBuf.get(), // pCommandBuffers
2255 0u, // signalSemaphoreCount
2256 DE_NULL, // pSignalSemaphores
2259 // submit first buffer
2260 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence1));
2262 // submit second buffer
2263 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence2));
2265 // wait for both buffer to stop at event for 100 microseconds
2266 vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, 100000);
2267 vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, 100000);
2270 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
2272 // wait for end of execution of the first buffer
2273 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, INFINITE_TIMEOUT));
2274 // wait for end of execution of the second buffer
2275 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, INFINITE_TIMEOUT));
2277 // TODO: this will be true if the command buffer was executed only once
2278 // TODO: add some test that will say if it was executed twice
2280 // check if buffer has been executed
2281 VkResult result = vk.getEventStatus(vkDevice, *eventTwo);
2282 if (result == VK_EVENT_SET)
2283 return tcu::TestStatus::pass("simultaneous use - primary buffers test succeeded");
2285 return tcu::TestStatus::fail("simultaneous use - primary buffers test FAILED");
2288 tcu::TestStatus simultaneousUseSecondaryBufferTest(Context& context)
2290 const VkDevice vkDevice = context.getDevice();
2291 const DeviceInterface& vk = context.getDeviceInterface();
2292 const VkQueue queue = context.getUniversalQueue();
2293 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2295 const VkCommandPoolCreateInfo cmdPoolParams =
2297 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2298 DE_NULL, // const void* pNext;
2299 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2300 queueFamilyIndex, // deUint32 queueFamilyIndex;
2302 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2305 const VkCommandBufferAllocateInfo cmdBufParams =
2307 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2308 DE_NULL, // const void* pNext;
2309 *cmdPool, // VkCommandPool pool;
2310 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2311 1u, // uint32_t bufferCount;
2313 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2315 // Secondary Command buffer params
2316 const VkCommandBufferAllocateInfo secCmdBufParams =
2318 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2319 DE_NULL, // const void* pNext;
2320 *cmdPool, // VkCommandPool pool;
2321 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2322 1u, // uint32_t bufferCount;
2324 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2326 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2328 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2331 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2334 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2336 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2338 (VkRenderPass)0u, // renderPass
2340 (VkFramebuffer)0u, // framebuffer
2341 VK_FALSE, // occlusionQueryEnable
2342 (VkQueryControlFlags)0u, // queryFlags
2343 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2345 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2347 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2349 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2350 &secCmdBufInheritInfo,
2353 // create event that will be used to check if secondary command buffer has been executed
2354 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice));
2355 const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice));
2358 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
2359 VK_CHECK(vk.resetEvent(vkDevice, *eventTwo));
2361 // record secondary command buffer
2362 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2364 // allow execution of event during every stage of pipeline
2365 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
2368 vk.cmdWaitEvents(*secCmdBuf, 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
2371 vk.cmdSetEvent(*secCmdBuf, *eventTwo, stageMask);
2373 // end recording of secondary buffers
2374 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2376 // record primary command buffer
2377 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2379 // execute secondary buffer
2380 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2382 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2384 // create fence to wait for execution of queue
2385 const Unique<VkFence> fence (createFence(vk, vkDevice));
2387 const VkSubmitInfo submitInfo =
2389 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2391 0u, // waitSemaphoreCount
2392 DE_NULL, // pWaitSemaphores
2393 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2394 1, // commandBufferCount
2395 &primCmdBuf.get(), // pCommandBuffers
2396 0u, // signalSemaphoreCount
2397 DE_NULL, // pSignalSemaphores
2400 // submit primary buffer, the secondary should be executed too
2401 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2403 // wait for both buffers to stop at event for 100 microseconds
2404 vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 100000);
2407 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
2409 // wait for end of execution of queue
2410 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2412 // TODO: this will be true if the command buffer was executed only once
2413 // TODO: add some test that will say if it was executed twice
2415 // check if secondary buffer has been executed
2416 VkResult result = vk.getEventStatus(vkDevice,*eventTwo);
2417 if (result == VK_EVENT_SET)
2418 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
2420 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
2423 tcu::TestStatus simultaneousUseSecondaryBufferOnePrimaryBufferTest(Context& context)
2425 const VkDevice vkDevice = context.getDevice();
2426 const DeviceInterface& vk = context.getDeviceInterface();
2427 const VkQueue queue = context.getUniversalQueue();
2428 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2429 Allocator& allocator = context.getDefaultAllocator();
2430 const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f);
2432 const VkCommandPoolCreateInfo cmdPoolParams =
2434 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2435 DE_NULL, // const void* pNext;
2436 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2437 queueFamilyIndex, // deUint32 queueFamilyIndex;
2439 const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
2442 const VkCommandBufferAllocateInfo cmdBufParams =
2444 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2445 DE_NULL, // const void* pNext;
2446 *cmdPool, // VkCommandPool pool;
2447 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2448 1u, // uint32_t bufferCount;
2450 const Unique<VkCommandBuffer> primCmdBuf(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2452 // Secondary Command buffer params
2453 const VkCommandBufferAllocateInfo secCmdBufParams =
2455 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2456 DE_NULL, // const void* pNext;
2457 *cmdPool, // VkCommandPool pool;
2458 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2459 1u, // uint32_t bufferCount;
2461 const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2463 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2465 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2468 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2471 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2473 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2478 VK_FALSE, // occlusionQueryEnable
2479 (VkQueryControlFlags)0u,
2480 (VkQueryPipelineStatisticFlags)0u,
2482 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2484 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2486 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2487 &secCmdBufInheritInfo,
2490 const deUint32 offset = (0u);
2491 const deUint32 addressableSize = 256;
2492 const deUint32 dataSize = 8;
2493 de::MovePtr<Allocation> bufferMem;
2494 const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
2495 // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
2496 const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context));
2497 const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context));
2498 const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
2499 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
2500 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
2502 const VkPipelineLayoutCreateInfo layoutCreateInfo =
2504 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
2506 (VkPipelineLayoutCreateFlags)0,
2507 numDescriptorSets, // setLayoutCount
2508 &descriptorSetLayout.get(), // pSetLayouts
2509 0u, // pushConstantRangeCount
2510 DE_NULL, // pPushConstantRanges
2512 Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
2514 const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
2516 const VkPipelineShaderStageCreateInfo shaderCreateInfo =
2518 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2520 (VkPipelineShaderStageCreateFlags)0,
2521 VK_SHADER_STAGE_COMPUTE_BIT, // stage
2522 *computeModule, // shader
2524 DE_NULL, // pSpecializationInfo
2527 const VkComputePipelineCreateInfo pipelineCreateInfo =
2529 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2532 shaderCreateInfo, // cs
2533 *pipelineLayout, // layout
2534 (vk::VkPipeline)0, // basePipelineHandle
2535 0u, // basePipelineIndex
2538 const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
2540 // record secondary command buffer
2541 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2543 vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
2544 vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
2545 vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
2547 // end recording of secondary buffer
2548 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2550 // record primary command buffer
2551 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
2553 // execute secondary buffer twice in same primary
2554 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2555 vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get());
2557 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
2559 // create fence to wait for execution of queue
2560 const Unique<VkFence> fence(createFence(vk, vkDevice));
2562 const VkSubmitInfo submitInfo =
2564 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2566 0u, // waitSemaphoreCount
2567 DE_NULL, // pWaitSemaphores
2568 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2569 1, // commandBufferCount
2570 &primCmdBuf.get(), // pCommandBuffers
2571 0u, // signalSemaphoreCount
2572 DE_NULL, // pSignalSemaphores
2575 // submit primary buffer, the secondary should be executed too
2576 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2578 // wait for end of execution of queue
2579 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2581 deUint32 resultCount;
2582 result.readResultContentsTo(&resultCount);
2583 // check if secondary buffer has been executed
2584 if (resultCount == 2)
2585 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
2587 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
2590 tcu::TestStatus simultaneousUseSecondaryBufferTwoPrimaryBuffersTest(Context& context)
2592 const VkDevice vkDevice = context.getDevice();
2593 const DeviceInterface& vk = context.getDeviceInterface();
2594 const VkQueue queue = context.getUniversalQueue();
2595 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2596 Allocator& allocator = context.getDefaultAllocator();
2597 const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f);
2599 const VkCommandPoolCreateInfo cmdPoolParams =
2601 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2602 DE_NULL, // const void* pNext;
2603 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
2604 queueFamilyIndex, // deUint32 queueFamilyIndex;
2606 const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams));
2609 const VkCommandBufferAllocateInfo cmdBufParams =
2611 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2612 DE_NULL, // const void* pNext;
2613 *cmdPool, // VkCommandPool pool;
2614 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
2615 1u, // uint32_t bufferCount;
2617 // Two separate primary cmd buffers that will be executed with the same secondary cmd buffer
2618 const deUint32 numPrimCmdBufs = 2;
2619 const Unique<VkCommandBuffer> primCmdBufOne(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2620 const Unique<VkCommandBuffer> primCmdBufTwo(allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
2621 VkCommandBuffer primCmdBufs[numPrimCmdBufs];
2622 primCmdBufs[0] = primCmdBufOne.get();
2623 primCmdBufs[1] = primCmdBufTwo.get();
2625 // Secondary Command buffer params
2626 const VkCommandBufferAllocateInfo secCmdBufParams =
2628 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2629 DE_NULL, // const void* pNext;
2630 *cmdPool, // VkCommandPool pool;
2631 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
2632 1u, // uint32_t bufferCount;
2634 const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2636 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
2638 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2641 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2644 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
2646 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2648 (VkRenderPass)0u, // renderPass
2650 (VkFramebuffer)0u, // framebuffer
2651 VK_FALSE, // occlusionQueryEnable
2652 (VkQueryControlFlags)0u, // queryFlags
2653 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2655 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
2657 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2659 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
2660 &secCmdBufInheritInfo,
2663 const deUint32 offset = (0u);
2664 const deUint32 addressableSize = 256;
2665 const deUint32 dataSize = 8;
2666 de::MovePtr<Allocation> bufferMem;
2667 const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem));
2668 // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute
2669 const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context));
2670 const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context));
2671 const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer()));
2672 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
2673 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
2675 const VkPipelineLayoutCreateInfo layoutCreateInfo =
2677 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
2679 (VkPipelineLayoutCreateFlags)0,
2680 numDescriptorSets, // setLayoutCount
2681 &descriptorSetLayout.get(), // pSetLayouts
2682 0u, // pushConstantRangeCount
2683 DE_NULL, // pPushConstantRanges
2685 Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo));
2687 const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u));
2689 const VkPipelineShaderStageCreateInfo shaderCreateInfo =
2691 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2693 (VkPipelineShaderStageCreateFlags)0,
2694 VK_SHADER_STAGE_COMPUTE_BIT, // stage
2695 *computeModule, // shader
2697 DE_NULL, // pSpecializationInfo
2700 const VkComputePipelineCreateInfo pipelineCreateInfo =
2702 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2705 shaderCreateInfo, // cs
2706 *pipelineLayout, // layout
2707 (vk::VkPipeline)0, // basePipelineHandle
2708 0u, // basePipelineIndex
2711 const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo));
2713 // record secondary command buffer
2714 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
2716 vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
2717 vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0);
2718 vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u);
2720 // end recording of secondary buffer
2721 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
2723 // record primary command buffers
2724 // Insert one instance of same secondary command buffer into two separate primary command buffers
2725 VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
2727 vk.cmdExecuteCommands(*primCmdBufOne, 1, &secCmdBuf.get());
2729 VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
2731 VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
2733 vk.cmdExecuteCommands(*primCmdBufTwo, 1, &secCmdBuf.get());
2735 VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
2737 // create fence to wait for execution of queue
2738 const Unique<VkFence> fence(createFence(vk, vkDevice));
2740 const VkSubmitInfo submitInfo =
2742 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
2744 0u, // waitSemaphoreCount
2745 DE_NULL, // pWaitSemaphores
2746 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
2747 numPrimCmdBufs, // commandBufferCount
2748 primCmdBufs, // pCommandBuffers
2749 0u, // signalSemaphoreCount
2750 DE_NULL, // pSignalSemaphores
2753 // submit primary buffers, the secondary should be executed too
2754 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
2756 // wait for end of execution of queue
2757 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
2759 deUint32 resultCount;
2760 result.readResultContentsTo(&resultCount);
2761 // check if secondary buffer has been executed
2762 if (resultCount == 2)
2763 return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded");
2765 return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED");
2768 tcu::TestStatus recordBufferQueryPreciseWithFlagTest(Context& context)
2770 const VkDevice vkDevice = context.getDevice();
2771 const DeviceInterface& vk = context.getDeviceInterface();
2772 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2774 if (!context.getDeviceFeatures().inheritedQueries)
2775 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
2777 const VkCommandPoolCreateInfo cmdPoolParams =
2779 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
2781 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
2782 queueFamilyIndex, // queueFamilyIndex;
2784 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2787 const VkCommandBufferAllocateInfo primCmdBufParams =
2789 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2792 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
2795 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
2797 // Secondary Command buffer params
2798 const VkCommandBufferAllocateInfo secCmdBufParams =
2800 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2803 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
2806 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2808 const VkCommandBufferBeginInfo primBufferBeginInfo =
2810 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
2813 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2816 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
2818 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2823 VK_TRUE, // occlusionQueryEnable
2824 VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags
2825 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2827 const VkCommandBufferBeginInfo secBufferBeginInfo =
2829 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
2832 &secBufferInheritInfo,
2835 const VkQueryPoolCreateInfo queryPoolCreateInfo =
2837 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
2839 (VkQueryPoolCreateFlags)0, // flags
2840 VK_QUERY_TYPE_OCCLUSION, // queryType
2842 0u, // pipelineStatistics
2844 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
2846 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
2847 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
2849 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
2851 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
2852 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
2854 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
2856 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
2858 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
2860 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
2863 tcu::TestStatus recordBufferQueryImpreciseWithFlagTest(Context& context)
2865 const VkDevice vkDevice = context.getDevice();
2866 const DeviceInterface& vk = context.getDeviceInterface();
2867 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2869 if (!context.getDeviceFeatures().inheritedQueries)
2870 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
2872 const VkCommandPoolCreateInfo cmdPoolParams =
2874 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
2876 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
2877 queueFamilyIndex, // queueFamilyIndex;
2879 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2882 const VkCommandBufferAllocateInfo primCmdBufParams =
2884 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2887 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
2890 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
2892 // Secondary Command buffer params
2893 const VkCommandBufferAllocateInfo secCmdBufParams =
2895 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2898 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
2901 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2903 const VkCommandBufferBeginInfo primBufferBeginInfo =
2905 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
2908 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2911 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
2913 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
2918 VK_TRUE, // occlusionQueryEnable
2919 VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags
2920 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
2922 const VkCommandBufferBeginInfo secBufferBeginInfo =
2924 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
2927 &secBufferInheritInfo,
2930 // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
2931 const VkQueryPoolCreateInfo queryPoolCreateInfo =
2933 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
2936 VK_QUERY_TYPE_OCCLUSION, // queryType
2938 0u, // pipelineStatistics
2940 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
2942 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
2943 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
2945 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
2947 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
2948 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
2950 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
2952 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
2954 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
2956 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
2959 tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context)
2961 const VkDevice vkDevice = context.getDevice();
2962 const DeviceInterface& vk = context.getDeviceInterface();
2963 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
2965 if (!context.getDeviceFeatures().inheritedQueries)
2966 TCU_THROW(NotSupportedError, "Inherited queries feature is not supported");
2968 const VkCommandPoolCreateInfo cmdPoolParams =
2970 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
2972 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
2973 queueFamilyIndex, // queueFamilyIndex;
2975 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
2978 const VkCommandBufferAllocateInfo primCmdBufParams =
2980 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2983 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
2986 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams));
2988 // Secondary Command buffer params
2989 const VkCommandBufferAllocateInfo secCmdBufParams =
2991 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
2994 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
2997 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
2999 const VkCommandBufferBeginInfo primBufferBeginInfo =
3001 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3004 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3007 const VkCommandBufferInheritanceInfo secBufferInheritInfo =
3009 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3014 VK_TRUE, // occlusionQueryEnable
3016 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3018 const VkCommandBufferBeginInfo secBufferBeginInfo =
3020 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3023 &secBufferInheritInfo,
3026 // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set
3027 const VkQueryPoolCreateInfo queryPoolCreateInfo =
3029 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType
3031 (VkQueryPoolCreateFlags)0,
3032 VK_QUERY_TYPE_OCCLUSION,
3036 Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo));
3038 VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo));
3039 VK_CHECK(vk.endCommandBuffer(secCmdBuf.get()));
3041 VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo));
3043 vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u);
3044 vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT);
3046 vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get());
3048 vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u);
3050 VK_CHECK(vk.endCommandBuffer(primCmdBuf.get()));
3052 return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query.");
3055 /******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/
3056 tcu::TestStatus submitBufferCountNonZero(Context& context)
3058 const VkDevice vkDevice = context.getDevice();
3059 const DeviceInterface& vk = context.getDeviceInterface();
3060 const VkQueue queue = context.getUniversalQueue();
3061 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3063 const deUint32 BUFFER_COUNT = 5u;
3065 const VkCommandPoolCreateInfo cmdPoolParams =
3067 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3070 queueFamilyIndex, // queueFamilyIndex;
3072 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3075 const VkCommandBufferAllocateInfo cmdBufParams =
3077 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3080 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3081 BUFFER_COUNT, // bufferCount;
3083 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3084 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
3086 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3088 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3091 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3094 std::vector<VkEventSp> events;
3095 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3097 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
3100 // Record the command buffers
3101 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3103 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3105 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3107 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3110 // We'll use a fence to wait for the execution of the queue
3111 const Unique<VkFence> fence (createFence(vk, vkDevice));
3113 const VkSubmitInfo submitInfo =
3115 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3117 0u, // waitSemaphoreCount
3118 DE_NULL, // pWaitSemaphores
3119 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3120 BUFFER_COUNT, // commandBufferCount
3121 cmdBuffers, // pCommandBuffers
3122 0u, // signalSemaphoreCount
3123 DE_NULL, // pSignalSemaphores
3126 // Submit the alpha command buffer to the queue
3127 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
3128 // Wait for the queue
3129 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
3131 // Check if the buffers were executed
3132 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3134 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3136 if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET)
3138 testResult = tcu::TestStatus::fail("Failed to set the event.");
3143 if (!testResult.isComplete())
3144 testResult = tcu::TestStatus::pass("All buffers were submitted and executed correctly.");
3149 tcu::TestStatus submitBufferCountEqualZero(Context& context)
3151 const VkDevice vkDevice = context.getDevice();
3152 const DeviceInterface& vk = context.getDeviceInterface();
3153 const VkQueue queue = context.getUniversalQueue();
3154 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3156 const deUint32 BUFFER_COUNT = 2u;
3158 const VkCommandPoolCreateInfo cmdPoolParams =
3160 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3163 queueFamilyIndex, // queueFamilyIndex;
3165 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3168 const VkCommandBufferAllocateInfo cmdBufParams =
3170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3173 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3174 BUFFER_COUNT, // bufferCount;
3176 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3177 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers));
3179 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3181 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3184 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3187 std::vector<VkEventSp> events;
3188 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3189 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
3191 // Record the command buffers
3192 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3194 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3196 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3198 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3201 // We'll use a fence to wait for the execution of the queue
3202 const Unique<VkFence> fenceZero (createFence(vk, vkDevice));
3203 const Unique<VkFence> fenceOne (createFence(vk, vkDevice));
3205 const VkSubmitInfo submitInfoCountZero =
3207 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3209 0u, // waitSemaphoreCount
3210 DE_NULL, // pWaitSemaphores
3211 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3212 1u, // commandBufferCount
3213 &cmdBuffers[0], // pCommandBuffers
3214 0u, // signalSemaphoreCount
3215 DE_NULL, // pSignalSemaphores
3218 const VkSubmitInfo submitInfoCountOne =
3220 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3222 0u, // waitSemaphoreCount
3223 DE_NULL, // pWaitSemaphores
3224 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3225 1u, // commandBufferCount
3226 &cmdBuffers[1], // pCommandBuffers
3227 0u, // signalSemaphoreCount
3228 DE_NULL, // pSignalSemaphores
3231 // Submit the command buffers to the queue
3232 // We're performing two submits to make sure that the first one has
3233 // a chance to be processed before we check the event's status
3234 VK_CHECK(vk.queueSubmit(queue, 0, &submitInfoCountZero, fenceZero.get()));
3235 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfoCountOne, fenceOne.get()));
3237 const VkFence fences[] =
3243 // Wait for the queue
3244 VK_CHECK(vk.waitForFences(vkDevice, (deUint32)DE_LENGTH_OF_ARRAY(fences), fences, VK_TRUE, INFINITE_TIMEOUT));
3246 // Check if the first buffer was executed
3247 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3249 if (vk.getEventStatus(vkDevice, events[0]->get()) == VK_EVENT_SET)
3250 testResult = tcu::TestStatus::fail("The first event was signaled.");
3252 testResult = tcu::TestStatus::pass("The first submission was ignored.");
3257 tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context)
3259 const VkDevice vkDevice = context.getDevice();
3260 const DeviceInterface& vk = context.getDeviceInterface();
3261 const VkQueue queue = context.getUniversalQueue();
3262 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3264 const VkCommandPoolCreateInfo cmdPoolParams =
3266 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
3267 DE_NULL, // const void* pNext;
3268 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
3269 queueFamilyIndex, // deUint32 queueFamilyIndex;
3271 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3274 const VkCommandBufferAllocateInfo cmdBufParams =
3276 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3277 DE_NULL, // const void* pNext;
3278 *cmdPool, // VkCommandPool pool;
3279 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
3280 1u, // uint32_t bufferCount;
3283 // Create two command buffers
3284 const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3285 const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3287 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3289 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3292 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
3295 // create two events that will be used to check if command buffers has been executed
3296 const Unique<VkEvent> event1 (createEvent(vk, vkDevice));
3297 const Unique<VkEvent> event2 (createEvent(vk, vkDevice));
3300 VK_CHECK(vk.resetEvent(vkDevice, *event1));
3301 VK_CHECK(vk.resetEvent(vkDevice, *event2));
3303 // record first command buffer
3304 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo));
3306 // allow execution of event during every stage of pipeline
3307 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3309 // record setting event
3310 vk.cmdSetEvent(*primCmdBuf1, *event1,stageMask);
3312 VK_CHECK(vk.endCommandBuffer(*primCmdBuf1));
3314 // record second command buffer
3315 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo));
3317 // allow execution of event during every stage of pipeline
3318 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3320 // record setting event
3321 vk.cmdSetEvent(*primCmdBuf2, *event2,stageMask);
3323 VK_CHECK(vk.endCommandBuffer(*primCmdBuf2));
3325 // create fence to wait for execution of queue
3326 const Unique<VkFence> fence (createFence(vk, vkDevice));
3328 // create semaphore for use in this test
3329 const Unique <VkSemaphore> semaphore (createSemaphore(vk, vkDevice));
3331 // create submit info for first buffer - signalling semaphore
3332 const VkSubmitInfo submitInfo1 =
3334 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3336 0u, // waitSemaphoreCount
3337 DE_NULL, // pWaitSemaphores
3338 DE_NULL, // pWaitDstStageMask
3339 1, // commandBufferCount
3340 &primCmdBuf1.get(), // pCommandBuffers
3341 1u, // signalSemaphoreCount
3342 &semaphore.get(), // pSignalSemaphores
3345 // Submit the command buffer to the queue
3346 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
3348 // wait for end of execution of queue
3349 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3351 // check if buffer has been executed
3352 VkResult result = vk.getEventStatus(vkDevice,*event1);
3353 if (result != VK_EVENT_SET)
3354 return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
3356 const VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
3358 // create submit info for second buffer - waiting for semaphore
3359 const VkSubmitInfo submitInfo2 =
3361 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3363 1u, // waitSemaphoreCount
3364 &semaphore.get(), // pWaitSemaphores
3365 &waitDstStageFlags, // pWaitDstStageMask
3366 1, // commandBufferCount
3367 &primCmdBuf2.get(), // pCommandBuffers
3368 0u, // signalSemaphoreCount
3369 DE_NULL, // pSignalSemaphores
3372 // reset fence, so it can be used again
3373 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3375 // Submit the second command buffer to the queue
3376 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
3378 // wait for end of execution of queue
3379 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3381 // check if second buffer has been executed
3382 // if it has been executed, it means that the semaphore was signalled - so test if passed
3383 result = vk.getEventStatus(vkDevice,*event1);
3384 if (result != VK_EVENT_SET)
3385 return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED");
3387 return tcu::TestStatus::pass("Submit Buffer and Wait for Single Semaphore Test succeeded");
3390 tcu::TestStatus submitBufferWaitManySemaphores(Context& context)
3392 // This test will create numSemaphores semaphores, and signal them in NUM_SEMAPHORES submits to queue
3393 // After that the numSubmissions queue submissions will wait for each semaphore
3395 const deUint32 numSemaphores = 10u; // it must be multiply of numSubmission
3396 const deUint32 numSubmissions = 2u;
3397 const VkDevice vkDevice = context.getDevice();
3398 const DeviceInterface& vk = context.getDeviceInterface();
3399 const VkQueue queue = context.getUniversalQueue();
3400 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3402 const VkCommandPoolCreateInfo cmdPoolParams =
3404 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
3405 DE_NULL, // const void* pNext;
3406 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
3407 queueFamilyIndex, // deUint32 queueFamilyIndex;
3409 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3412 const VkCommandBufferAllocateInfo cmdBufParams =
3414 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3415 DE_NULL, // const void* pNext;
3416 *cmdPool, // VkCommandPool pool;
3417 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
3418 1u, // uint32_t bufferCount;
3421 // Create command buffer
3422 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3424 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3426 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3429 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
3432 // create event that will be used to check if command buffers has been executed
3433 const Unique<VkEvent> event (createEvent(vk, vkDevice));
3435 // reset event - at creation state is undefined
3436 VK_CHECK(vk.resetEvent(vkDevice, *event));
3438 // record command buffer
3439 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
3441 // allow execution of event during every stage of pipeline
3442 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3444 // record setting event
3445 vk.cmdSetEvent(*primCmdBuf, *event,stageMask);
3447 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
3449 // create fence to wait for execution of queue
3450 const Unique<VkFence> fence (createFence(vk, vkDevice));
3452 // numSemaphores is declared const, so this array can be static
3453 // the semaphores will be destroyed automatically at end of scope
3454 Move <VkSemaphore> semaphoreArray[numSemaphores];
3455 VkSemaphore semaphores[numSemaphores];
3457 for (deUint32 idx = 0; idx < numSemaphores; ++idx) {
3458 // create semaphores for use in this test
3459 semaphoreArray[idx] = createSemaphore(vk, vkDevice);
3460 semaphores[idx] = semaphoreArray[idx].get();
3464 // create submit info for buffer - signal semaphores
3465 const VkSubmitInfo submitInfo1 =
3467 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3469 0u, // waitSemaphoreCount
3470 DE_NULL, // pWaitSemaphores
3471 DE_NULL, // pWaitDstStageMask
3472 1, // commandBufferCount
3473 &primCmdBuf.get(), // pCommandBuffers
3474 numSemaphores, // signalSemaphoreCount
3475 semaphores // pSignalSemaphores
3477 // Submit the command buffer to the queue
3478 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence));
3480 // wait for end of execution of queue
3481 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3483 // check if buffer has been executed
3484 VkResult result = vk.getEventStatus(vkDevice,*event);
3485 if (result != VK_EVENT_SET)
3486 return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
3488 // reset event, so next buffers can set it again
3489 VK_CHECK(vk.resetEvent(vkDevice, *event));
3491 // reset fence, so it can be used again
3492 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3495 const deUint32 numberOfSemaphoresToBeWaitedByOneSubmission = numSemaphores / numSubmissions;
3496 const std::vector<VkPipelineStageFlags> waitDstStageFlags (numberOfSemaphoresToBeWaitedByOneSubmission, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
3498 // the following code waits for the semaphores set above - numSubmissions queues will wait for each semaphore from above
3499 for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) {
3501 // create submit info for buffer - waiting for semaphore
3502 const VkSubmitInfo submitInfo2 =
3504 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3506 numberOfSemaphoresToBeWaitedByOneSubmission, // waitSemaphoreCount
3507 semaphores + (numberOfSemaphoresToBeWaitedByOneSubmission * idxSubmission), // pWaitSemaphores
3508 waitDstStageFlags.data(), // pWaitDstStageMask
3509 1, // commandBufferCount
3510 &primCmdBuf.get(), // pCommandBuffers
3511 0u, // signalSemaphoreCount
3512 DE_NULL, // pSignalSemaphores
3515 // Submit the second command buffer to the queue
3516 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence));
3518 // wait for 1 second.
3519 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 1000 * 1000 * 1000));
3521 // check if second buffer has been executed
3522 // if it has been executed, it means that the semaphore was signalled - so test if passed
3523 VkResult result = vk.getEventStatus(vkDevice,*event);
3524 if (result != VK_EVENT_SET)
3525 return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED");
3527 // reset fence, so it can be used again
3528 VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get()));
3530 // reset event, so next buffers can set it again
3531 VK_CHECK(vk.resetEvent(vkDevice, *event));
3534 return tcu::TestStatus::pass("Submit Buffer and Wait for Many Semaphores Test succeeded");
3537 tcu::TestStatus submitBufferNullFence(Context& context)
3539 const VkDevice vkDevice = context.getDevice();
3540 const DeviceInterface& vk = context.getDeviceInterface();
3541 const VkQueue queue = context.getUniversalQueue();
3542 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3544 const short BUFFER_COUNT = 2;
3546 const VkCommandPoolCreateInfo cmdPoolParams =
3548 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3551 queueFamilyIndex, // queueFamilyIndex;
3553 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3556 const VkCommandBufferAllocateInfo cmdBufParams =
3558 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3561 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3564 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3565 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3566 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, &cmdBuffers[ndx]));
3568 const VkCommandBufferBeginInfo cmdBufBeginInfo =
3570 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3573 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3576 std::vector<VkEventSp> events;
3577 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3578 events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice))));
3580 // Record the command buffers
3581 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3583 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo));
3585 vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
3587 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3590 // We'll use a fence to wait for the execution of the queue
3591 const Unique<VkFence> fence (createFence(vk, vkDevice));
3593 const VkSubmitInfo submitInfoNullFence =
3595 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3597 0u, // waitSemaphoreCount
3598 DE_NULL, // pWaitSemaphores
3599 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3600 1u, // commandBufferCount
3601 &cmdBuffers[0], // pCommandBuffers
3602 0u, // signalSemaphoreCount
3603 DE_NULL, // pSignalSemaphores
3606 const VkSubmitInfo submitInfoNonNullFence =
3608 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3610 0u, // waitSemaphoreCount
3611 DE_NULL, // pWaitSemaphores
3612 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3613 1u, // commandBufferCount
3614 &cmdBuffers[1], // pCommandBuffers
3615 0u, // signalSemaphoreCount
3616 DE_NULL, // pSignalSemaphores
3619 // Perform two submissions - one with no fence, the other one with a valid
3620 // fence Hoping submitting the other buffer will give the first one time to
3622 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNullFence, DE_NULL));
3623 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNonNullFence, fence.get()));
3625 // Wait for the queue
3626 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT));
3629 tcu::TestStatus testResult = tcu::TestStatus::incomplete();
3631 //Fence guaranteed that all buffers submited before fence were executed
3632 if (vk.getEventStatus(vkDevice, events[0]->get()) != VK_EVENT_SET || vk.getEventStatus(vkDevice, events[1]->get()) != VK_EVENT_SET)
3634 testResult = tcu::TestStatus::fail("One of the buffers was not executed.");
3638 testResult = tcu::TestStatus::pass("Buffers have been submitted and executed correctly.");
3641 vk.queueWaitIdle(queue);
3645 /******** 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) *******/
3646 tcu::TestStatus executeSecondaryBufferTest(Context& context)
3648 const VkDevice vkDevice = context.getDevice();
3649 const DeviceInterface& vk = context.getDeviceInterface();
3650 const VkQueue queue = context.getUniversalQueue();
3651 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3653 const VkCommandPoolCreateInfo cmdPoolParams =
3655 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
3657 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags;
3658 queueFamilyIndex, // queueFamilyIndex;
3660 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3663 const VkCommandBufferAllocateInfo cmdBufParams =
3665 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3667 *cmdPool, // commandPool;
3668 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level;
3671 const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3673 // Secondary Command buffer
3674 const VkCommandBufferAllocateInfo secCmdBufParams =
3676 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType;
3678 *cmdPool, // commandPool;
3679 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level;
3682 const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams));
3684 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3686 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3689 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3692 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
3694 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3696 DE_NULL, // renderPass
3698 DE_NULL, // framebuffer
3699 VK_FALSE, // occlusionQueryEnable
3700 (VkQueryControlFlags)0u, // queryFlags
3701 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3703 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
3705 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
3708 &secCmdBufInheritInfo,
3711 // create event that will be used to check if secondary command buffer has been executed
3712 const Unique<VkEvent> event (createEvent(vk, vkDevice));
3715 VK_CHECK(vk.resetEvent(vkDevice, *event));
3717 // record secondary command buffer
3718 VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo));
3720 // allow execution of event during every stage of pipeline
3721 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3722 // record setting event
3723 vk.cmdSetEvent(*secCmdBuf, *event, stageMask);
3725 // end recording of the secondary buffer
3726 VK_CHECK(vk.endCommandBuffer(*secCmdBuf));
3728 // record primary command buffer
3729 VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo));
3731 // execute secondary buffer
3732 vk.cmdExecuteCommands(*primCmdBuf, 1u, &secCmdBuf.get());
3734 VK_CHECK(vk.endCommandBuffer(*primCmdBuf));
3736 // create fence to wait for execution of queue
3737 const Unique<VkFence> fence (createFence(vk, vkDevice));
3738 const VkSubmitInfo submitInfo =
3740 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3742 0u, // waitSemaphoreCount
3743 DE_NULL, // pWaitSemaphores
3744 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3745 1u, // commandBufferCount
3746 &primCmdBuf.get(), // pCommandBuffers
3747 0u, // signalSemaphoreCount
3748 DE_NULL, // pSignalSemaphores
3751 // submit primary buffer, the secondary should be executed too
3752 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get()));
3754 // wait for end of execution of queue
3755 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT));
3757 // check if secondary buffer has been executed
3758 VkResult result = vk.getEventStatus(vkDevice, *event);
3759 if (result == VK_EVENT_SET)
3760 return tcu::TestStatus::pass("executeSecondaryBufferTest succeeded");
3762 return tcu::TestStatus::fail("executeSecondaryBufferTest FAILED");
3765 tcu::TestStatus executeSecondaryBufferTwiceTest(Context& context)
3767 const deUint32 BUFFER_COUNT = 10u;
3768 const VkDevice vkDevice = context.getDevice();
3769 const DeviceInterface& vk = context.getDeviceInterface();
3770 const VkQueue queue = context.getUniversalQueue();
3771 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3773 const VkCommandPoolCreateInfo cmdPoolParams =
3775 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
3776 DE_NULL, // const void* pNext;
3777 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags;
3778 queueFamilyIndex, // deUint32 queueFamilyIndex;
3780 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
3783 const VkCommandBufferAllocateInfo cmdBufParams =
3785 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3786 DE_NULL, // const void* pNext;
3787 *cmdPool, // VkCommandPool pool;
3788 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
3789 1u, // uint32_t bufferCount;
3791 const Unique<VkCommandBuffer> primCmdBufOne (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3792 const Unique<VkCommandBuffer> primCmdBufTwo (allocateCommandBuffer(vk, vkDevice, &cmdBufParams));
3794 // Secondary Command buffers params
3795 const VkCommandBufferAllocateInfo secCmdBufParams =
3797 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3798 DE_NULL, // const void* pNext;
3799 *cmdPool, // VkCommandPool pool;
3800 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
3801 BUFFER_COUNT, // uint32_t bufferCount;
3803 VkCommandBuffer cmdBuffers[BUFFER_COUNT];
3804 VK_CHECK(vk.allocateCommandBuffers(vkDevice, &secCmdBufParams, cmdBuffers));
3806 const VkCommandBufferBeginInfo primCmdBufBeginInfo =
3808 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
3811 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3814 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
3816 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
3818 (VkRenderPass)0u, // renderPass
3820 (VkFramebuffer)0u, // framebuffer
3821 VK_FALSE, // occlusionQueryEnable
3822 (VkQueryControlFlags)0u, // queryFlags
3823 (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics
3825 const VkCommandBufferBeginInfo secCmdBufBeginInfo =
3827 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
3829 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags
3830 &secCmdBufInheritInfo,
3833 // create event that will be used to check if secondary command buffer has been executed
3834 const Unique<VkEvent> eventOne (createEvent(vk, vkDevice));
3837 VK_CHECK(vk.resetEvent(vkDevice, *eventOne));
3839 for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx)
3841 // record secondary command buffer
3842 VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &secCmdBufBeginInfo));
3844 // allow execution of event during every stage of pipeline
3845 VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
3848 vk.cmdWaitEvents(cmdBuffers[ndx], 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
3850 // end recording of secondary buffers
3851 VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx]));
3854 // record primary command buffer one
3855 VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo));
3857 // execute one secondary buffer
3858 vk.cmdExecuteCommands(*primCmdBufOne, 1, cmdBuffers );
3860 VK_CHECK(vk.endCommandBuffer(*primCmdBufOne));
3862 // record primary command buffer two
3863 VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo));
3865 // execute one secondary buffer with all buffers
3866 vk.cmdExecuteCommands(*primCmdBufTwo, BUFFER_COUNT, cmdBuffers );
3868 VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo));
3870 // create fence to wait for execution of queue
3871 const Unique<VkFence> fenceOne (createFence(vk, vkDevice));
3872 const Unique<VkFence> fenceTwo (createFence(vk, vkDevice));
3874 const VkSubmitInfo submitInfoOne =
3876 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3878 0u, // waitSemaphoreCount
3879 DE_NULL, // pWaitSemaphores
3880 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3881 1, // commandBufferCount
3882 &primCmdBufOne.get(), // pCommandBuffers
3883 0u, // signalSemaphoreCount
3884 DE_NULL, // pSignalSemaphores
3887 // submit primary buffer, the secondary should be executed too
3888 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoOne, *fenceOne));
3890 // wait for buffer to stop at event for 100 microseconds
3891 vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
3893 const VkSubmitInfo submitInfoTwo =
3895 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
3897 0u, // waitSemaphoreCount
3898 DE_NULL, // pWaitSemaphores
3899 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
3900 1, // commandBufferCount
3901 &primCmdBufTwo.get(), // pCommandBuffers
3902 0u, // signalSemaphoreCount
3903 DE_NULL, // pSignalSemaphores
3906 // submit second primary buffer, the secondary should be executed too
3907 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoTwo, *fenceTwo));
3909 // wait for all buffers to stop at event for 100 microseconds
3910 vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000);
3912 // now all buffers are waiting at eventOne
3913 // set event eventOne
3914 VK_CHECK(vk.setEvent(vkDevice, *eventOne));
3916 // wait for end of execution of fenceOne
3917 VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, INFINITE_TIMEOUT));
3919 // wait for end of execution of second queue
3920 VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceTwo.get(), 0u, INFINITE_TIMEOUT));
3922 return tcu::TestStatus::pass("executeSecondaryBufferTwiceTest succeeded");
3925 /******** 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) **/
3926 tcu::TestStatus orderBindPipelineTest(Context& context)
3928 const DeviceInterface& vk = context.getDeviceInterface();
3929 const VkDevice device = context.getDevice();
3930 const VkQueue queue = context.getUniversalQueue();
3931 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
3932 Allocator& allocator = context.getDefaultAllocator();
3933 const ComputeInstanceResultBuffer result (vk, device, allocator);
3937 ADDRESSABLE_SIZE = 256, // allocate a lot more than required
3940 const tcu::Vec4 colorA1 = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
3941 const tcu::Vec4 colorA2 = tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f);
3942 const tcu::Vec4 colorB1 = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
3943 const tcu::Vec4 colorB2 = tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f);
3945 const deUint32 dataOffsetA = (0u);
3946 const deUint32 dataOffsetB = (0u);
3947 const deUint32 viewOffsetA = (0u);
3948 const deUint32 viewOffsetB = (0u);
3949 const deUint32 bufferSizeA = dataOffsetA + ADDRESSABLE_SIZE;
3950 const deUint32 bufferSizeB = dataOffsetB + ADDRESSABLE_SIZE;
3952 de::MovePtr<Allocation> bufferMemA;
3953 const Unique<VkBuffer> bufferA (createColorDataBuffer(dataOffsetA, bufferSizeA, colorA1, colorA2, &bufferMemA, context));
3955 de::MovePtr<Allocation> bufferMemB;
3956 const Unique<VkBuffer> bufferB (createColorDataBuffer(dataOffsetB, bufferSizeB, colorB1, colorB2, &bufferMemB, context));
3958 const Unique<VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout(context));
3959 const Unique<VkDescriptorPool> descriptorPool (createDescriptorPool(context));
3960 const Unique<VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout, *bufferA, viewOffsetA, *bufferB, viewOffsetB, result.getBuffer(), context));
3961 const VkDescriptorSet descriptorSets[] = { *descriptorSet };
3962 const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets);
3964 const VkPipelineLayoutCreateInfo layoutCreateInfo =
3966 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
3968 (VkPipelineLayoutCreateFlags)0,
3969 numDescriptorSets, // setLayoutCount
3970 &descriptorSetLayout.get(), // pSetLayouts
3971 0u, // pushConstantRangeCount
3972 DE_NULL, // pPushConstantRanges
3974 Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, device, &layoutCreateInfo));
3976 const Unique<VkShaderModule> computeModuleGood (createShaderModule(vk, device, context.getBinaryCollection().get("compute_good"), (VkShaderModuleCreateFlags)0u));
3977 const Unique<VkShaderModule> computeModuleBad (createShaderModule(vk, device, context.getBinaryCollection().get("compute_bad"), (VkShaderModuleCreateFlags)0u));
3979 const VkPipelineShaderStageCreateInfo shaderCreateInfoGood =
3981 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
3983 (VkPipelineShaderStageCreateFlags)0,
3984 VK_SHADER_STAGE_COMPUTE_BIT, // stage
3985 *computeModuleGood, // shader
3987 DE_NULL, // pSpecializationInfo
3990 const VkPipelineShaderStageCreateInfo shaderCreateInfoBad =
3992 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
3994 (vk::VkPipelineShaderStageCreateFlags)0,
3995 vk::VK_SHADER_STAGE_COMPUTE_BIT, // stage
3996 *computeModuleBad, // shader
3998 DE_NULL, // pSpecializationInfo
4001 const VkComputePipelineCreateInfo createInfoGood =
4003 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
4006 shaderCreateInfoGood, // cs
4007 *pipelineLayout, // layout
4008 (vk::VkPipeline)0, // basePipelineHandle
4009 0u, // basePipelineIndex
4012 const VkComputePipelineCreateInfo createInfoBad =
4014 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
4017 shaderCreateInfoBad, // cs
4018 *pipelineLayout, // descriptorSetLayout.get()
4019 (VkPipeline)0, // basePipelineHandle
4020 0u, // basePipelineIndex
4023 const Unique<VkPipeline> pipelineGood (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoGood));
4024 const Unique<VkPipeline> pipelineBad (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoBad));
4026 const VkAccessFlags inputBit = (VK_ACCESS_UNIFORM_READ_BIT);
4027 const VkBufferMemoryBarrier bufferBarriers[] =
4030 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
4032 VK_ACCESS_HOST_WRITE_BIT, // outputMask
4033 inputBit, // inputMask
4034 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
4035 VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
4037 (VkDeviceSize)0u, // offset
4038 (VkDeviceSize)bufferSizeA, // size
4041 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
4043 VK_ACCESS_HOST_WRITE_BIT, // outputMask
4044 inputBit, // inputMask
4045 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
4046 VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
4048 (VkDeviceSize)0u, // offset
4049 (VkDeviceSize)bufferSizeB, // size
4053 const deUint32 numSrcBuffers = 1u;
4055 const deUint32* const dynamicOffsets = (DE_NULL);
4056 const deUint32 numDynamicOffsets = (0);
4057 const int numPreBarriers = numSrcBuffers;
4058 const vk::VkBufferMemoryBarrier* const postBarriers = result.getResultReadBarrier();
4059 const int numPostBarriers = 1;
4060 const tcu::Vec4 refQuadrantValue14 = (colorA2);
4061 const tcu::Vec4 refQuadrantValue23 = (colorA1);
4062 const tcu::Vec4 references[4] =
4069 tcu::Vec4 results[4];
4071 // submit and wait begin
4073 const tcu::UVec3 numWorkGroups = tcu::UVec3(4, 1u, 1);
4075 const VkCommandPoolCreateInfo cmdPoolCreateInfo =
4077 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType;
4079 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags
4080 queueFamilyIndex, // queueFamilyIndex
4082 const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, &cmdPoolCreateInfo));
4083 const VkCommandBufferAllocateInfo cmdBufCreateInfo =
4085 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType
4087 *cmdPool, // commandPool
4088 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level
4092 const VkCommandBufferBeginInfo cmdBufBeginInfo =
4094 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType
4097 (const VkCommandBufferInheritanceInfo*)DE_NULL,
4100 const Unique<VkFence> cmdCompleteFence (createFence(vk, device));
4101 const Unique<VkCommandBuffer> cmd (allocateCommandBuffer(vk, device, &cmdBufCreateInfo));
4103 VK_CHECK(vk.beginCommandBuffer(*cmd, &cmdBufBeginInfo));
4105 vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineBad);
4106 vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineGood);
4107 vk.cmdBindDescriptorSets(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, numDynamicOffsets, dynamicOffsets);
4110 vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
4111 0, (const VkMemoryBarrier*)DE_NULL,
4112 numPreBarriers, bufferBarriers,
4113 0, (const VkImageMemoryBarrier*)DE_NULL);
4115 vk.cmdDispatch(*cmd, numWorkGroups.x(), numWorkGroups.y(), numWorkGroups.z());
4116 vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0,
4117 0, (const VkMemoryBarrier*)DE_NULL,
4118 numPostBarriers, postBarriers,
4119 0, (const VkImageMemoryBarrier*)DE_NULL);
4120 VK_CHECK(vk.endCommandBuffer(*cmd));
4123 // submit second primary buffer, the secondary should be executed too
4124 const VkSubmitInfo submitInfo =
4126 VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
4128 0u, // waitSemaphoreCount
4129 DE_NULL, // pWaitSemaphores
4130 (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask
4131 1, // commandBufferCount
4132 &cmd.get(), // pCommandBuffers
4133 0u, // signalSemaphoreCount
4134 DE_NULL, // pSignalSemaphores
4136 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *cmdCompleteFence));
4138 VK_CHECK(vk.waitForFences(device, 1u, &cmdCompleteFence.get(), 0u, INFINITE_TIMEOUT)); // \note: timeout is failure
4139 VK_CHECK(vk.resetFences(device, 1u, &cmdCompleteFence.get()));
4141 // submit and wait end
4142 result.readResultContentsTo(&results);
4145 if (results[0] == references[0] &&
4146 results[1] == references[1] &&
4147 results[2] == references[2] &&
4148 results[3] == references[3])
4150 return tcu::TestStatus::pass("Pass");
4152 else if (results[0] == tcu::Vec4(-1.0f) &&
4153 results[1] == tcu::Vec4(-1.0f) &&
4154 results[2] == tcu::Vec4(-1.0f) &&
4155 results[3] == tcu::Vec4(-1.0f))
4157 context.getTestContext().getLog()
4158 << tcu::TestLog::Message
4159 << "Result buffer was not written to."
4160 << tcu::TestLog::EndMessage;
4161 return tcu::TestStatus::fail("Result buffer was not written to");
4165 context.getTestContext().getLog()
4166 << tcu::TestLog::Message
4167 << "Error expected ["
4168 << references[0] << ", "
4169 << references[1] << ", "
4170 << references[2] << ", "
4171 << references[3] << "], got ["
4172 << results[0] << ", "
4173 << results[1] << ", "
4174 << results[2] << ", "
4175 << results[3] << "]"
4176 << tcu::TestLog::EndMessage;
4177 return tcu::TestStatus::fail("Invalid result values");
4182 void genComputeSource (SourceCollections& programCollection)
4184 const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
4185 std::ostringstream bufGood;
4187 bufGood << versionDecl << "\n"
4189 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4190 << "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
4192 << " highp vec4 colorA;\n"
4193 << " highp vec4 colorB;\n"
4194 << "} b_instance;\n"
4195 << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
4197 << " highp vec4 read_colors[4];\n"
4199 << "void main(void)\n"
4201 << " highp int quadrant_id = int(gl_WorkGroupID.x);\n"
4202 << " highp vec4 result_color;\n"
4203 << " if (quadrant_id == 1 || quadrant_id == 2)\n"
4204 << " result_color = b_instance.colorA;\n"
4206 << " result_color = b_instance.colorB;\n"
4207 << " b_out.read_colors[gl_WorkGroupID.x] = result_color;\n"
4210 programCollection.glslSources.add("compute_good") << glu::ComputeSource(bufGood.str());
4212 std::ostringstream bufBad;
4214 bufBad << versionDecl << "\n"
4216 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4217 << "layout(set = 0, binding = 1u, std140) uniform BufferName\n"
4219 << " highp vec4 colorA;\n"
4220 << " highp vec4 colorB;\n"
4221 << "} b_instance;\n"
4222 << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n"
4224 << " highp vec4 read_colors[4];\n"
4226 << "void main(void)\n"
4228 << " highp int quadrant_id = int(gl_WorkGroupID.x);\n"
4229 << " highp vec4 result_color;\n"
4230 << " if (quadrant_id == 1 || quadrant_id == 2)\n"
4231 << " result_color = b_instance.colorA;\n"
4233 << " result_color = b_instance.colorB;\n"
4234 << " b_out.read_colors[gl_WorkGroupID.x] = vec4(0.0, 0.0, 0.0, 0.0);\n"
4237 programCollection.glslSources.add("compute_bad") << glu::ComputeSource(bufBad.str());
4240 void genComputeIncrementSource (SourceCollections& programCollection)
4242 const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
4243 std::ostringstream bufIncrement;
4245 bufIncrement << versionDecl << "\n"
4247 << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n"
4248 << "layout(set = 0, binding = 0, std140) buffer InOutBuf\n"
4250 << " coherent uint count;\n"
4252 << "void main(void)\n"
4254 << " atomicAdd(b_in_out.count, 1u);\n"
4257 programCollection.glslSources.add("compute_increment") << glu::ComputeSource(bufIncrement.str());
4262 tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx)
4264 de::MovePtr<tcu::TestCaseGroup> commandBuffersTests (new tcu::TestCaseGroup(testCtx, "command_buffers", "Command Buffers Tests"));
4266 /* 19.1. Command Pools (5.1 in VK 1.0 Spec) */
4267 addFunctionCase (commandBuffersTests.get(), "pool_create_null_params", "", createPoolNullParamsTest);
4268 addFunctionCase (commandBuffersTests.get(), "pool_create_non_null_allocator", "", createPoolNonNullAllocatorTest);
4269 addFunctionCase (commandBuffersTests.get(), "pool_create_transient_bit", "", createPoolTransientBitTest);
4270 addFunctionCase (commandBuffersTests.get(), "pool_create_reset_bit", "", createPoolResetBitTest);
4271 addFunctionCase (commandBuffersTests.get(), "pool_reset_release_res", "", resetPoolReleaseResourcesBitTest);
4272 addFunctionCase (commandBuffersTests.get(), "pool_reset_no_flags_res", "", resetPoolNoFlagsTest);
4273 addFunctionCase (commandBuffersTests.get(), "pool_reset_reuse", "", resetPoolReuseTest);
4274 /* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */
4275 addFunctionCase (commandBuffersTests.get(), "allocate_single_primary", "", allocatePrimaryBufferTest);
4276 addFunctionCase (commandBuffersTests.get(), "allocate_many_primary", "", allocateManyPrimaryBuffersTest);
4277 addFunctionCase (commandBuffersTests.get(), "allocate_single_secondary", "", allocateSecondaryBufferTest);
4278 addFunctionCase (commandBuffersTests.get(), "allocate_many_secondary", "", allocateManySecondaryBuffersTest);
4279 addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", executePrimaryBufferTest);
4280 addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", executeLargePrimaryBufferTest);
4281 addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", resetBufferImplicitlyTest);
4282 addFunctionCase (commandBuffersTests.get(), "trim_command_pool", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
4283 addFunctionCase (commandBuffersTests.get(), "trim_command_pool_secondary", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4284 /* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */
4285 addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", recordSinglePrimaryBufferTest);
4286 addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", recordLargePrimaryBufferTest);
4287 addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", recordSingleSecondaryBufferTest);
4288 addFunctionCase (commandBuffersTests.get(), "record_many_secondary", "", recordLargeSecondaryBufferTest);
4289 addFunctionCase (commandBuffersTests.get(), "submit_twice_primary", "", submitPrimaryBufferTwiceTest);
4290 addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", submitSecondaryBufferTwiceTest);
4291 addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", oneTimeSubmitFlagPrimaryBufferTest);
4292 addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", oneTimeSubmitFlagSecondaryBufferTest);
4293 addFunctionCase (commandBuffersTests.get(), "render_pass_continue", "", renderPassContinueTest);
4294 addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", simultaneousUsePrimaryBufferTest);
4295 addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", simultaneousUseSecondaryBufferTest);
4296 addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_one_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferOnePrimaryBufferTest);
4297 addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_two_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferTwoPrimaryBuffersTest);
4298 addFunctionCase (commandBuffersTests.get(), "record_query_precise_w_flag", "", recordBufferQueryPreciseWithFlagTest);
4299 addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_w_flag", "", recordBufferQueryImpreciseWithFlagTest);
4300 addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_wo_flag", "", recordBufferQueryImpreciseWithoutFlagTest);
4301 /* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */
4302 addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", submitBufferCountNonZero);
4303 addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", submitBufferCountEqualZero);
4304 addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", submitBufferWaitSingleSemaphore);
4305 addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", submitBufferWaitManySemaphores);
4306 addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", submitBufferNullFence);
4307 /* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */
4308 addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", executeSecondaryBufferTest);
4309 addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", executeSecondaryBufferTwiceTest);
4310 /* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */
4311 addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline", "", genComputeSource, orderBindPipelineTest);
4313 return commandBuffersTests.release();