17a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski/*------------------------------------------------------------------------- 27a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * Vulkan Conformance Tests 37a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * ------------------------ 47a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * 57a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * Copyright (c) 2015 The Khronos Group Inc. 67a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * Copyright (c) 2015 Samsung Electronics Co., Ltd. 7b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski * Copyright (c) 2015 Google Inc. 87a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 127a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 147a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 207a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski * 217a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski *//*--------------------------------------------------------------------*/ 227a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 2369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include "vkDefs.hpp" 247a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vktTestCaseUtil.hpp" 257a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkBuilderUtil.hpp" 267a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkPlatform.hpp" 277a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkRefUtil.hpp" 287a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkQueryUtil.hpp" 297a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkMemUtil.hpp" 307a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkDeviceUtil.hpp" 31a7d993643d59be88684d97427e386e8ee350e12fPeter Siket#include "tcuTextureUtil.hpp" 32a7d993643d59be88684d97427e386e8ee350e12fPeter Siket#include "vkImageUtil.hpp" 337a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkPrograms.hpp" 347a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski#include "vkTypeUtil.hpp" 3569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include "vkAllocationCallbackUtil.hpp" 3669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include "vktApiCommandBuffersTests.hpp" 3769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include "vktApiBufferComputeInstance.hpp" 3869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include "vktApiComputeInstanceResultBuffer.hpp" 39663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket#include "deSharedPtr.hpp" 4069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski#include <sstream> 417a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 427a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskinamespace vkt 437a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 447a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskinamespace api 457a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 467a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskinamespace 477a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 487a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 497a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskiusing namespace vk; 507a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 51663b7ac6f3f69a93ab937b6f28417f142420596fPeter Sikettypedef de::SharedPtr<vk::Unique<vk::VkEvent> > VkEventSp; 52663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket 53b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski// Global variables 547a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskiconst deUint64 INFINITE_TIMEOUT = ~(deUint64)0u; 557a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 56a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 57a7d993643d59be88684d97427e386e8ee350e12fPeter Sikettemplate <deUint32 NumBuffers> 58a7d993643d59be88684d97427e386e8ee350e12fPeter Siketclass CommandBufferBareTestEnvironment 59a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 60a7d993643d59be88684d97427e386e8ee350e12fPeter Siketpublic: 61a7d993643d59be88684d97427e386e8ee350e12fPeter Siket CommandBufferBareTestEnvironment (Context& context, 62a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandPoolCreateFlags commandPoolCreateFlags); 63a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 64a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandPool getCommandPool (void) const { return *m_commandPool; } 65a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer getCommandBuffer (deUint32 bufferIndex) const; 66a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 67a7d993643d59be88684d97427e386e8ee350e12fPeter Siketprotected: 68a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Context& m_context; 69a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkDevice m_device; 70a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const DeviceInterface& m_vkd; 71a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkQueue m_queue; 72a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const deUint32 m_queueFamilyIndex; 73a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Allocator& m_allocator; 74a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 75bf7746a5df03bb6ca5a7adf0f433de6c5ef4e38aPyry Haulos // \note All VkCommandBuffers are allocated from m_commandPool so there is no need 76bf7746a5df03bb6ca5a7adf0f433de6c5ef4e38aPyry Haulos // to free them separately as the auto-generated dtor will do that through 77bf7746a5df03bb6ca5a7adf0f433de6c5ef4e38aPyry Haulos // destroying the pool. 78a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkCommandPool> m_commandPool; 79a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer m_primaryCommandBuffers[NumBuffers]; 80a7d993643d59be88684d97427e386e8ee350e12fPeter Siket}; 81a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 82a7d993643d59be88684d97427e386e8ee350e12fPeter Sikettemplate <deUint32 NumBuffers> 83a7d993643d59be88684d97427e386e8ee350e12fPeter SiketCommandBufferBareTestEnvironment<NumBuffers>::CommandBufferBareTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags) 84a7d993643d59be88684d97427e386e8ee350e12fPeter Siket : m_context (context) 85a7d993643d59be88684d97427e386e8ee350e12fPeter Siket , m_device (context.getDevice()) 86a7d993643d59be88684d97427e386e8ee350e12fPeter Siket , m_vkd (context.getDeviceInterface()) 87a7d993643d59be88684d97427e386e8ee350e12fPeter Siket , m_queue (context.getUniversalQueue()) 88a7d993643d59be88684d97427e386e8ee350e12fPeter Siket , m_queueFamilyIndex (context.getUniversalQueueFamilyIndex()) 89a7d993643d59be88684d97427e386e8ee350e12fPeter Siket , m_allocator (context.getDefaultAllocator()) 90a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 91da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi m_commandPool = createCommandPool(m_vkd, m_device, commandPoolCreateFlags, m_queueFamilyIndex); 92a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 93a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = 94a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 95a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 96a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 97a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_commandPool, // VkCommandPool commandPool; 98a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 99a7d993643d59be88684d97427e386e8ee350e12fPeter Siket NumBuffers // deUint32 commandBufferCount; 100a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 101a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 102a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.allocateCommandBuffers(m_device, &cmdBufferAllocateInfo, m_primaryCommandBuffers)); 103a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 104a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 105a7d993643d59be88684d97427e386e8ee350e12fPeter Sikettemplate <deUint32 NumBuffers> 106a7d993643d59be88684d97427e386e8ee350e12fPeter SiketVkCommandBuffer CommandBufferBareTestEnvironment<NumBuffers>::getCommandBuffer(deUint32 bufferIndex) const 107a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 108a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_ASSERT(bufferIndex < NumBuffers); 109a7d993643d59be88684d97427e386e8ee350e12fPeter Siket return m_primaryCommandBuffers[bufferIndex]; 110a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 111a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 112a7d993643d59be88684d97427e386e8ee350e12fPeter Siketclass CommandBufferRenderPassTestEnvironment : public CommandBufferBareTestEnvironment<1> 113a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 114a7d993643d59be88684d97427e386e8ee350e12fPeter Siketpublic: 115a7d993643d59be88684d97427e386e8ee350e12fPeter Siket CommandBufferRenderPassTestEnvironment (Context& context, 116a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandPoolCreateFlags commandPoolCreateFlags); 117a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 118a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkRenderPass getRenderPass (void) const { return *m_renderPass; } 119a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkFramebuffer getFrameBuffer (void) const { return *m_frameBuffer; } 120a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer getPrimaryCommandBuffer (void) const { return getCommandBuffer(0); } 121a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer getSecondaryCommandBuffer (void) const { return *m_secondaryCommandBuffer; } 122a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 123a7d993643d59be88684d97427e386e8ee350e12fPeter Siket void beginPrimaryCommandBuffer (VkCommandBufferUsageFlags usageFlags); 124a7d993643d59be88684d97427e386e8ee350e12fPeter Siket void beginSecondaryCommandBuffer (VkCommandBufferUsageFlags usageFlags); 125a7d993643d59be88684d97427e386e8ee350e12fPeter Siket void beginRenderPass (VkSubpassContents content); 126a7d993643d59be88684d97427e386e8ee350e12fPeter Siket void submitPrimaryCommandBuffer (void); 127a7d993643d59be88684d97427e386e8ee350e12fPeter Siket de::MovePtr<tcu::TextureLevel> readColorAttachment (void); 128a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 129a7d993643d59be88684d97427e386e8ee350e12fPeter Siket static const VkImageType DEFAULT_IMAGE_TYPE; 130a7d993643d59be88684d97427e386e8ee350e12fPeter Siket static const VkFormat DEFAULT_IMAGE_FORMAT; 131a7d993643d59be88684d97427e386e8ee350e12fPeter Siket static const VkExtent3D DEFAULT_IMAGE_SIZE; 132a7d993643d59be88684d97427e386e8ee350e12fPeter Siket static const VkRect2D DEFAULT_IMAGE_AREA; 133a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 134a7d993643d59be88684d97427e386e8ee350e12fPeter Siketprotected: 135a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 136a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkImage> m_colorImage; 137a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkImageView> m_colorImageView; 138a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkRenderPass> m_renderPass; 139a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkFramebuffer> m_frameBuffer; 140a7d993643d59be88684d97427e386e8ee350e12fPeter Siket de::MovePtr<Allocation> m_colorImageMemory; 141a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkCommandBuffer> m_secondaryCommandBuffer; 142a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 143a7d993643d59be88684d97427e386e8ee350e12fPeter Siket}; 144a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 145a7d993643d59be88684d97427e386e8ee350e12fPeter Siketconst VkImageType CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_TYPE = VK_IMAGE_TYPE_2D; 146a7d993643d59be88684d97427e386e8ee350e12fPeter Siketconst VkFormat CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_FORMAT = VK_FORMAT_R8G8B8A8_UINT; 147a7d993643d59be88684d97427e386e8ee350e12fPeter Siketconst VkExtent3D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE = {255, 255, 1}; 148a7d993643d59be88684d97427e386e8ee350e12fPeter Siketconst VkRect2D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA = 149a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 150a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 0u, 0u, }, // VkOffset2D offset; 151a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height }, // VkExtent2D extent; 152a7d993643d59be88684d97427e386e8ee350e12fPeter Siket}; 153a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 154a7d993643d59be88684d97427e386e8ee350e12fPeter SiketCommandBufferRenderPassTestEnvironment::CommandBufferRenderPassTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags) 155a7d993643d59be88684d97427e386e8ee350e12fPeter Siket : CommandBufferBareTestEnvironment<1> (context, commandPoolCreateFlags) 156a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 157a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 158a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkAttachmentDescription colorAttDesc = 159a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 160a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkAttachmentDescriptionFlags flags; 161a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_FORMAT, // VkFormat format; 162a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 163a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 164a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 165a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 166a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 167a446be2b665a526c947afd436303715bf54a5b8escygan VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 168a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 169a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 170a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 171a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkAttachmentDescription attachments[1] = 172a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 173a7d993643d59be88684d97427e386e8ee350e12fPeter Siket colorAttDesc 174a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 175a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 176a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkAttachmentReference colorAttRef = 177a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 178a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 attachment; 179a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; 180a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 181a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 182a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkSubpassDescription subpassDesc[1] = 183a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 184a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 185a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkSubpassDescriptionFlags flags; 186a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 187a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 inputAttachmentCount; 188a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkAttachmentReference* pInputAttachments; 189a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 colorAttachmentCount; 190a7d993643d59be88684d97427e386e8ee350e12fPeter Siket &colorAttRef, // const VkAttachmentReference* pColorAttachments; 191a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkAttachmentReference* pResolveAttachments; 192a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkAttachmentReference* depthStencilAttachment; 193a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 preserveAttachmentCount; 194a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkAttachmentReference* pPreserveAttachments; 195a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 196a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 197a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 198a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkRenderPassCreateInfo renderPassCreateInfo = 199a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 200a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 201a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 202a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkRenderPassCreateFlags flags; 203a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 attachmentCount; 204a7d993643d59be88684d97427e386e8ee350e12fPeter Siket attachments, // const VkAttachmentDescription* pAttachments; 205a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 subpassCount; 206a7d993643d59be88684d97427e386e8ee350e12fPeter Siket subpassDesc, // const VkSubpassDescription* pSubpasses; 207a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 dependencyCount; 208a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkSubpassDependency* pDependencies; 209a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 210a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 211a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_renderPass = createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL); 212a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 213a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 214a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 215a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkImageCreateInfo imageCreateInfo = 216a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 217a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 218a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 219a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkImageCreateFlags flags; 220a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_TYPE, // VkImageType imageType; 221a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_FORMAT, // VkFormat format; 222a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE, // VkExtent3D extent; 223a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1, // deUint32 mipLevels; 224a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1, // deUint32 arrayLayers; 225a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 226a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 227a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | 228a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_USAGE_TRANSFER_SRC_BIT | 229a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage; 230a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 231a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1, // deUint32 queueFamilyIndexCount; 232a7d993643d59be88684d97427e386e8ee350e12fPeter Siket &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 233a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 234a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 235a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 236a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_colorImage = createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL); 237a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 238a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 239a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_colorImageMemory = m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, *m_colorImage), MemoryRequirement::Any); 240a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.bindImageMemory(m_device, *m_colorImage, m_colorImageMemory->getMemory(), m_colorImageMemory->getOffset())); 241a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 242a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 243a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkImageViewCreateInfo imageViewCreateInfo = 244a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 245a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 246a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 247a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkImageViewCreateFlags flags; 248a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_colorImage, // VkImage image; 249a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 250a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_FORMAT, // VkFormat format; 251a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 252a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMPONENT_SWIZZLE_R, 253a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMPONENT_SWIZZLE_G, 254a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMPONENT_SWIZZLE_B, 255a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMPONENT_SWIZZLE_A 256a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }, // VkComponentMapping components; 257a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 258a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 259a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 baseMipLevel; 260a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 mipLevels; 261a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 baseArrayLayer; 262a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 arraySize; 263a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }, // VkImageSubresourceRange subresourceRange; 264a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 265a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 266a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_colorImageView = createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL); 267a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 268a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 269a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 270a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkImageView attachmentViews[1] = 271a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 272a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_colorImageView 273a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 274a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 275a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkFramebufferCreateInfo framebufferCreateInfo = 276a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 277a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 278a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 279a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkFramebufferCreateFlags flags; 280a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_renderPass, // VkRenderPass renderPass; 281a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1, // deUint32 attachmentCount; 282a7d993643d59be88684d97427e386e8ee350e12fPeter Siket attachmentViews, // const VkImageView* pAttachments; 283a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE.width, // deUint32 width; 284a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE.height, // deUint32 height; 285a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 layers; 286a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 287a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 288a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_frameBuffer = createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL); 289a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 290a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 291a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 292a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = 293a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 294a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 295a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 296a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_commandPool, // VkCommandPool commandPool; 297a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 298a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u // deUint32 commandBufferCount; 299a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 300a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 301a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_secondaryCommandBuffer = allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo); 302a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 303a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 304a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 305a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 306a7d993643d59be88684d97427e386e8ee350e12fPeter Siketvoid CommandBufferRenderPassTestEnvironment::beginRenderPass(VkSubpassContents content) 307a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 308a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkClearValue clearValues[1] = 309a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 310a7d993643d59be88684d97427e386e8ee350e12fPeter Siket makeClearValueColorU32(17, 59, 163, 251), 311a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 312a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 313a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkRenderPassBeginInfo renderPassBeginInfo = 314a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 315a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 316a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 317a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_renderPass, // VkRenderPass renderPass; 318a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_frameBuffer, // VkFramebuffer framebuffer; 319a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_AREA, // VkRect2D renderArea; 320a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 clearValueCount; 321a7d993643d59be88684d97427e386e8ee350e12fPeter Siket clearValues // const VkClearValue* pClearValues; 322a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 323a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 324a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_vkd.cmdBeginRenderPass(m_primaryCommandBuffers[0], &renderPassBeginInfo, content); 325a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 326a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 327a7d993643d59be88684d97427e386e8ee350e12fPeter Siketvoid CommandBufferRenderPassTestEnvironment::beginPrimaryCommandBuffer(VkCommandBufferUsageFlags usageFlags) 328a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 329a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkCommandBufferBeginInfo commandBufferBeginInfo = 330a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 331a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 332a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 333a7d993643d59be88684d97427e386e8ee350e12fPeter Siket usageFlags, // VkCommandBufferUsageFlags flags; 334a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; 335a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 336a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 337a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.beginCommandBuffer(m_primaryCommandBuffers[0], &commandBufferBeginInfo)); 338a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 339a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 340a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 341a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 342a7d993643d59be88684d97427e386e8ee350e12fPeter Siketvoid CommandBufferRenderPassTestEnvironment::beginSecondaryCommandBuffer(VkCommandBufferUsageFlags usageFlags) 343a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 344a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkCommandBufferInheritanceInfo commandBufferInheritanceInfo = 345a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 346a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType; 347a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 348a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_renderPass, // VkRenderPass renderPass; 349a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 subpass; 350a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_frameBuffer, // VkFramebuffer framebuffer; 351a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_FALSE, // VkBool32 occlusionQueryEnable; 352a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkQueryControlFlags queryFlags; 353a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u // VkQueryPipelineStatisticFlags pipelineStatistics; 354a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 355a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 356a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkCommandBufferBeginInfo commandBufferBeginInfo = 357a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 358a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 359a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 360a7d993643d59be88684d97427e386e8ee350e12fPeter Siket usageFlags, // VkCommandBufferUsageFlags flags; 361a7d993643d59be88684d97427e386e8ee350e12fPeter Siket &commandBufferInheritanceInfo // const VkCommandBufferInheritanceInfo* pInheritanceInfo; 362a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 363a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 364a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.beginCommandBuffer(*m_secondaryCommandBuffer, &commandBufferBeginInfo)); 365a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 366a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 367a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 368a7d993643d59be88684d97427e386e8ee350e12fPeter Siketvoid CommandBufferRenderPassTestEnvironment::submitPrimaryCommandBuffer(void) 369a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 370da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(m_vkd, m_device)); 371a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkSubmitInfo submitInfo = 372a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 373a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; 374a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 375a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 waitSemaphoreCount; 376a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkSemaphore* pWaitSemaphores; 377a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask; 378a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 commandBufferCount; 379a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_primaryCommandBuffers, // const VkCommandBuffer* pCommandBuffers; 380a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 signalSemaphoreCount; 381a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL // const VkSemaphore* pSignalSemaphores; 382a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 383a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 384a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence)); 385a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 386a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull)); 387a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 388a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 389a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 390a7d993643d59be88684d97427e386e8ee350e12fPeter Siketde::MovePtr<tcu::TextureLevel> CommandBufferRenderPassTestEnvironment::readColorAttachment () 391a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 392a7d993643d59be88684d97427e386e8ee350e12fPeter Siket Move<VkBuffer> buffer; 393a7d993643d59be88684d97427e386e8ee350e12fPeter Siket de::MovePtr<Allocation> bufferAlloc; 394a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const tcu::TextureFormat tcuFormat = mapVkFormat(DEFAULT_IMAGE_FORMAT); 395a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkDeviceSize pixelDataSize = DEFAULT_IMAGE_SIZE.height * DEFAULT_IMAGE_SIZE.height * tcuFormat.getPixelSize(); 396a7d993643d59be88684d97427e386e8ee350e12fPeter Siket de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(tcuFormat, DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height)); 397a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 398a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // Create destination buffer 399a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 400a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkBufferCreateInfo bufferParams = 401a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 402a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 403a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 404a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkBufferCreateFlags flags; 405a7d993643d59be88684d97427e386e8ee350e12fPeter Siket pixelDataSize, // VkDeviceSize size; 406a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage; 407a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 408a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 queueFamilyIndexCount; 409a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL // const deUint32* pQueueFamilyIndices; 410a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 411a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 412a7d993643d59be88684d97427e386e8ee350e12fPeter Siket buffer = createBuffer(m_vkd, m_device, &bufferParams); 413a7d993643d59be88684d97427e386e8ee350e12fPeter Siket bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible); 414a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset())); 415a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 416a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 417a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // Barriers for copying image to buffer 418a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 419a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkImageMemoryBarrier imageBarrier = 420a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 421a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 422a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 423a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; 424a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask; 425a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout; 426a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout; 427a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 428a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 429a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *m_colorImage, // VkImage image; 430a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { // VkImageSubresourceRange subresourceRange; 431a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 432a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 baseMipLevel; 433a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u, // deUint32 mipLevels; 434a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 baseArraySlice; 435a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u // deUint32 arraySize; 436a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 437a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 438a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 439a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkBufferMemoryBarrier bufferBarrier = 440a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 441a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; 442a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // const void* pNext; 443a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask; 444a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask; 445a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 446a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 447a7d993643d59be88684d97427e386e8ee350e12fPeter Siket *buffer, // VkBuffer buffer; 448a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkDeviceSize offset; 449a7d993643d59be88684d97427e386e8ee350e12fPeter Siket pixelDataSize // VkDeviceSize size; 450a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 451a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 452a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // Copy image to buffer 453a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 454a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkBufferImageCopy copyRegion = 455a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 456a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // VkDeviceSize bufferOffset; 457a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE.width, // deUint32 bufferRowLength; 458a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE.height, // deUint32 bufferImageHeight; 459a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource; 460a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 0, 0, 0 }, // VkOffset3D imageOffset; 461a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DEFAULT_IMAGE_SIZE // VkExtent3D imageExtent; 462a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 463a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 464a7d993643d59be88684d97427e386e8ee350e12fPeter Siket beginPrimaryCommandBuffer(0); 465a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 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); 466a7d993643d59be88684d97427e386e8ee350e12fPeter Siket m_vkd.cmdCopyImageToBuffer(m_primaryCommandBuffers[0], *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region); 467a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 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); 468a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(m_vkd.endCommandBuffer(m_primaryCommandBuffers[0])); 469a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 470a7d993643d59be88684d97427e386e8ee350e12fPeter Siket submitPrimaryCommandBuffer(); 471a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 472a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // Read buffer data 473a7d993643d59be88684d97427e386e8ee350e12fPeter Siket invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize); 474a7d993643d59be88684d97427e386e8ee350e12fPeter Siket tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr())); 475a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 476a7d993643d59be88684d97427e386e8ee350e12fPeter Siket return resultLevel; 477a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 478a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 479a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 480b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski// Testcases 481a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/********* 19.1. Command Pools (5.1 in VK 1.0 Spec) ***************************/ 48269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus createPoolNullParamsTest(Context& context) 4837a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 4847a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkDevice vkDevice = context.getDevice(); 4857a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 4867a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 4877a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 488da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi createCommandPool(vk, vkDevice, 0u, queueFamilyIndex); 48969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 49069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 49169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 49269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 49369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus createPoolNonNullAllocatorTest(Context& context) 49469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 49569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 49669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 49769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 49869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkAllocationCallbacks* allocationCallbacks = getSystemAllocator(); 49969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 50069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 5017a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 50269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 50369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 50469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 50569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 5067a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 50769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 5085780bb0906393148fbca93b0432269e50f8b521ePeter Siket createCommandPool(vk, vkDevice, &cmdPoolParams, allocationCallbacks); 5097a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 51069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 5117a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 5127a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 51369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus createPoolTransientBitTest(Context& context) 514b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 515b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 516b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 517b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 518b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 51969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 52069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 52169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 52269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 52369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags; 52469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 52569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 526b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 5275780bb0906393148fbca93b0432269e50f8b521ePeter Siket createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL); 528b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 52969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 53069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 531b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 53269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus createPoolResetBitTest(Context& context) 53369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 53469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 53569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 53669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 537b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 53869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 539b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 54069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 54169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 54269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 54369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 54469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 545b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 5465780bb0906393148fbca93b0432269e50f8b521ePeter Siket createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL); 547b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 54869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 54969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 550b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 55169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus resetPoolReleaseResourcesBitTest(Context& context) 55269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 55369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 55469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 55569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 556b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 55769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 55869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 55969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 56069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 56169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 56269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 56369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 564b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 5655780bb0906393148fbca93b0432269e50f8b521ePeter Siket const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL)); 5665780bb0906393148fbca93b0432269e50f8b521ePeter Siket 5675780bb0906393148fbca93b0432269e50f8b521ePeter Siket VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT)); 568b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 56969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 570b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 571b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 57269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus resetPoolNoFlagsTest(Context& context) 573b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 57469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 57569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 57669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 57769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 57869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 57969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 58069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 58169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 58269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 58369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 58469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 58569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 5865780bb0906393148fbca93b0432269e50f8b521ePeter Siket const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL)); 5875780bb0906393148fbca93b0432269e50f8b521ePeter Siket 5885780bb0906393148fbca93b0432269e50f8b521ePeter Siket VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, 0u)); 58969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 59069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Command Pool allocated correctly."); 59169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 592b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 5939ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwabool executeCommandBuffer (const VkDevice device, 5949ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const DeviceInterface& vk, 5959ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkQueue queue, 5969ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkCommandBuffer commandBuffer, 5979ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const bool exitBeforeEndCommandBuffer = false) 5989ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa{ 599da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, device)); 6009ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkCommandBufferBeginInfo commandBufferBeginInfo = 6019ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6029ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, //VkStructureType sType; 6039ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL, //const void* pNext; 6049ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 0u, //VkCommandBufferUsageFlags flags; 6059ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa (const VkCommandBufferInheritanceInfo*)DE_NULL //const VkCommandBufferInheritanceInfo* pInheritanceInfo; 6069ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa }; 6079ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6089ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufferBeginInfo)); 6099ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6109ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 6119ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa vk.cmdSetEvent(commandBuffer, *event, stageMask); 6129ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (exitBeforeEndCommandBuffer) 6139ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return exitBeforeEndCommandBuffer; 6149ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa } 6159ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_CHECK(vk.endCommandBuffer(commandBuffer)); 6169ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6179ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 618da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, device)); 6199ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkSubmitInfo submitInfo = 6209ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6219ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 6229ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL, // pNext 6239ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 0u, // waitSemaphoreCount 6249ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL, // pWaitSemaphores 6259ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 6269ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 1u, // commandBufferCount 6279ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa &commandBuffer, // pCommandBuffers 6289ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 0u, // signalSemaphoreCount 6299ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL // pSignalSemaphores 6309ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa }; 6319ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6329ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa // Submit the command buffer to the queue 6339ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 6349ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa // wait for end of execution of queue 6359ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), 0u, INFINITE_TIMEOUT)); 6369ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa } 6379ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa // check if buffer has been executed 6389ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkResult result = vk.getEventStatus(device, *event); 6399ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return result == VK_EVENT_SET; 6409ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa} 6419ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6429ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwatcu::TestStatus resetPoolReuseTest (Context& context) 6439ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa{ 6449ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkDevice vkDevice = context.getDevice(); 6459ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const DeviceInterface& vk = context.getDeviceInterface(); 6469ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 6479ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkQueue queue = context.getUniversalQueue(); 6489ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6499ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkCommandPoolCreateInfo cmdPoolParams = 6509ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6519ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 6529ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL, // pNext; 6539ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 0u, // flags; 6549ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa queueFamilyIndex // queueFamilyIndex; 6559ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa }; 6569ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams, DE_NULL)); 6579ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const VkCommandBufferAllocateInfo cmdBufParams = 6589ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6599ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 6609ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa DE_NULL, // pNext; 6619ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa *cmdPool, // commandPool; 6629ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 6639ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 1u // bufferCount; 6649ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa }; 6659ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const Move<VkCommandBuffer> commandBuffers[] = 6669ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6679ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa allocateCommandBuffer(vk, vkDevice, &cmdBufParams), 6689ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa allocateCommandBuffer(vk, vkDevice, &cmdBufParams) 6699ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa }; 6709ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6719ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0]))) 6729ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::fail("Failed"); 6739ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1]), true)) 6749ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::fail("Failed"); 6759ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6769ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa VK_CHECK(vk.resetCommandPool(vkDevice, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT)); 6779ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6789ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[0]))) 6799ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::fail("Failed"); 6809ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (!executeCommandBuffer(vkDevice, vk, queue, *(commandBuffers[1]))) 6819ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::fail("Failed"); 6829ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6839ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa { 6849ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa const Unique<VkCommandBuffer> afterResetCommandBuffers(allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 6859ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa if (!executeCommandBuffer(vkDevice, vk, queue, *afterResetCommandBuffers)) 6869ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::fail("Failed"); 6879ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa } 6889ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 6899ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa return tcu::TestStatus::pass("Passed"); 6909ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa} 6919ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa 692a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/******** 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) ******************/ 69369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus allocatePrimaryBufferTest(Context& context) 69469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 695b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 696b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 697b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 698b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 69969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 70069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 70169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 70269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 70369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 70469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 70569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 70669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 707b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 708b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // Command buffer 70969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 71069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 71169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 71269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 71369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // commandPool; 71469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 71569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 71669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 71769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 718b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 71969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Buffer was created correctly."); 72069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 721b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 72269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus allocateManyPrimaryBuffersTest(Context& context) 72369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 724b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 72569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 72669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 72769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 728b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 72969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 730b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 73169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 73269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 73369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 73469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 73569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 73669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 737b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 738a906008de4b9e96e13d383082f21f5745788530eMais Alnasser // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities. 739a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#if (DE_PTR_SIZE == 4) 740a906008de4b9e96e13d383082f21f5745788530eMais Alnasser const unsigned minCommandBuffer = 1024; 741a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#else 74269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const unsigned minCommandBuffer = 10000; 743a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#endif 744b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 74569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 74669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 74769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 74869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 74969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 75069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 75169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 75269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski minCommandBuffer, // uint32_t bufferCount; 75369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 754b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 75569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // do not keep the handles to buffers, as they will be freed with command pool 756b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 75769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allocate the minimum required amount of buffers 75869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[minCommandBuffer]; 75969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers)); 760b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 76169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski std::ostringstream out; 76269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski out << "allocateManyPrimaryBuffersTest succeded: created " << minCommandBuffer << " command buffers"; 763b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 76469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass(out.str()); 76569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 76669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 76769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus allocateSecondaryBufferTest(Context& context) 76869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 76969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 77069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 77169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 772b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 77369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 77469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 77569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 77669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 77769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 77869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 77969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 78069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 78169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 78269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 78369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 78469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 78569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 78669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 78769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // commandPool; 78869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level; 78969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 79069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 79169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 79269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 79369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Buffer was created correctly."); 794b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 7957a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 79669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus allocateManySecondaryBuffersTest(Context& context) 7977a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 7987a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 7997a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkDevice vkDevice = context.getDevice(); 8007a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 8017a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 8027a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 80369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 8047a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 80569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 80669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 80769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 80869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 8097a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 81069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 81169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 812a906008de4b9e96e13d383082f21f5745788530eMais Alnasser // \todo Determining the minimum number of command buffers should be a function of available system memory and driver capabilities. 813a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#if (DE_PTR_SIZE == 4) 814a906008de4b9e96e13d383082f21f5745788530eMais Alnasser const unsigned minCommandBuffer = 1024; 815a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#else 81669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const unsigned minCommandBuffer = 10000; 817a906008de4b9e96e13d383082f21f5745788530eMais Alnasser#endif 8187a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 8197a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Command buffer 82069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 8217a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 82269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 82369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 82469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 82569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 82669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski minCommandBuffer, // uint32_t bufferCount; 8277a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 8287a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 82969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // do not keep the handles to buffers, as they will be freed with command pool 83069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 83169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allocate the minimum required amount of buffers 83269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[minCommandBuffer]; 83369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers)); 83469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 83569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski std::ostringstream out; 83669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski out << "allocateManySecondaryBuffersTest succeded: created " << minCommandBuffer << " command buffers"; 83769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 83869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass(out.str()); 83969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 84069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 84169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus executePrimaryBufferTest(Context& context) 84269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 84369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 84469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 84569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 84669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 84769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 84869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 84969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 85069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 85169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 85269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 85369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 8547a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 85569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 8567a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 85769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 85869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 85969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 86069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 86169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 86269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 86369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 86469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 86569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 86669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 86769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 8687a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 86969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 8707a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski DE_NULL, 87169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 872689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 8737a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 8747a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 8757a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 876da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 8777a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 8787a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // reset event 879b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.resetEvent(vkDevice, *event)); 8807a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 8817a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // record primary command buffer 882b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 8837a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 88469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 88569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 8867a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 88769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 88869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 8897a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 890b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 8917a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 8927a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // create fence to wait for execution of queue 893da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 894b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 89569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 89669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 89769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 89869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 89969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 90069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 901689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 90269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 90369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 90469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 90569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 90669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 90769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 90869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffer to the queue 90969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 910b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 911b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // wait for end of execution of queue 912b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 913b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 91469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if buffer has been executed 915b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VkResult result = vk.getEventStatus(vkDevice,*event); 916b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski if (result == VK_EVENT_SET) 91769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Execute Primary Command Buffer succeeded"); 918b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 91969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Execute Primary Command Buffer FAILED"); 920b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 921b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 92269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus executeLargePrimaryBufferTest(Context& context) 923b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 924b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 925b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 926b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkQueue queue = context.getUniversalQueue(); 927b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 92869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 LARGE_BUFFER_SIZE = 10000; 929b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 93069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 93169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 93269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 93369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 93469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 93569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 93669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 93769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 938b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 939b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // Command buffer 94069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 94169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 94269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 94369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 94469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 94569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 94669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 94769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 94869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 94969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 95069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 95169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 95269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 95369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 954689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 95569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 956b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 957663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket std::vector<VkEventSp> events; 95869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx) 959da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice)))); 960b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 96169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 96269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 96369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 964663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket // set all the events 96569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx) 96669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 967663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket vk.cmdSetEvent(*primCmdBuf, events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 96869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 96969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 97069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 97169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 97269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 973da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 97469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 97569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 97669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 97769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 97869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 97969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 98069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 981689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 98269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 98369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 98469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 98569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 98669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 98769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 98869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffer to the queue 98969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 99069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 99169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 99269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 99369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 99469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if the buffer was executed correctly - all events had their status 99569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // changed 996ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo tcu::TestStatus testResult = tcu::TestStatus::incomplete(); 997ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 99869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < LARGE_BUFFER_SIZE; ++ndx) 99969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 1000663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET) 1001ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo { 1002ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::fail("An event was not set."); 1003ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo break; 1004ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo } 100569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 100669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1007ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo if (!testResult.isComplete()) 1008ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::pass("All events set correctly."); 1009ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 1010ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo return testResult; 101169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 101269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 101369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus resetBufferImplicitlyTest(Context& context) 101469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 101569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 101669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 101769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 101869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 101969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 102069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 102169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 102269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 102369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 102469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 102569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 102669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 102769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 102869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 102969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 103069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 103169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 103269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 103369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 103469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 103569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 103669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 103769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 103869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> cmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 103969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 104069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo cmdBufBeginInfo = 104169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 104269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 104369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 104469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 1045689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 104669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 104769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1048da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 104969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 105069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Put the command buffer in recording state. 105169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo)); 105269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 105369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Set the event 105469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*cmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 105569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 105669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*cmdBuf)); 105769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 105869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // We'll use a fence to wait for the execution of the queue 1059da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 106069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 106169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 106269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 106369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 106469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 106569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 106669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1067689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 106869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 106969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmdBuf.get(), // pCommandBuffers 107069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 107169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 107269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 107369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 107469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submitting the command buffer that sets the event to the queue 107569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get())); 107669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 107769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Waiting for the queue to finish executing 107869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT)); 107969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Reset the fence so that we can reuse it 108069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 108169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 108269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Check if the buffer was executed 108369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (vk.getEventStatus(vkDevice, *event) != VK_EVENT_SET) 108469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Failed to set the event."); 108569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 108669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Reset the event 108769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.resetEvent(vkDevice, *event); 108869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if(vk.getEventStatus(vkDevice, *event) != VK_EVENT_RESET) 108969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Failed to reset the event."); 109069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 109169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Reset the command buffer by putting it in recording state again. This 109269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // should empty the command buffer. 109369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginInfo)); 109469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*cmdBuf)); 109569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 109669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffer after resetting. It should have no commands 109769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // recorded, so the event should remain unsignaled. 109869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get())); 109969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Waiting for the queue to finish executing 110069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT)); 110169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 110269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Check if the event remained unset. 110369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if(vk.getEventStatus(vkDevice, *event) == VK_EVENT_RESET) 110469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Buffer was reset correctly."); 110569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else 110669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Buffer was not reset correctly."); 110769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 110869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 11097d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwausing de::SharedPtr; 11107d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwatypedef SharedPtr<Unique<VkEvent> > VkEventShared; 11117d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11127d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwatemplate<typename T> 11137d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwainline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move) 11147d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 11157d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return SharedPtr<Unique<T> >(new Unique<T>(move)); 11167d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 11177d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11187d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwabool submitAndCheck (Context& context, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events) 11197d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 1120da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const VkDevice vkDevice = context.getDevice(); 1121da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const DeviceInterface& vk = context.getDeviceInterface(); 1122da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const VkQueue queue = context.getUniversalQueue(); 1123da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 11247d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 1125da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const VkSubmitInfo submitInfo = 11267d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11277d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 11287d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pNext 11297d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 0u, // waitSemaphoreCount 11307d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pWaitSemaphores 11317d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 11327d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa static_cast<deUint32>(cmdBuffers.size()), // commandBufferCount 11337d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa &cmdBuffers[0], // pCommandBuffers 11347d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 0u, // signalSemaphoreCount 11357d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pSignalSemaphores 11367d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 11377d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11387d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get())); 11397d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), 0u, INFINITE_TIMEOUT)); 11407d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11417d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa for(int eventNdx = 0; eventNdx < static_cast<int>(events.size()); ++eventNdx) 11427d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11437d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (vk.getEventStatus(vkDevice, **events[eventNdx]) != VK_EVENT_SET) 11447d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return false; 11457d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.resetEvent(vkDevice, **events[eventNdx]); 11467d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 11477d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11487d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return true; 11497d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 11507d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11517d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwavoid createCommadBuffers (const DeviceInterface& vk, 11527d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkDevice vkDevice, 11537d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa deUint32 bufferCount, 11547d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VkCommandPool pool, 11557d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandBufferLevel cmdBufferLevel, 11567d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VkCommandBuffer* pCommandBuffers) 11577d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 11587d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandBufferAllocateInfo cmdBufParams = 11597d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11607d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 11617d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // const void* pNext; 11627d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa pool, // VkCommandPool pool; 11637d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa cmdBufferLevel, // VkCommandBufferLevel level; 11647d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa bufferCount, // uint32_t bufferCount; 11657d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 11667d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, pCommandBuffers)); 11677d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 11687d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11697d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwavoid addCommandsToBuffer (const DeviceInterface& vk, std::vector<VkCommandBuffer>& cmdBuffers, std::vector <VkEventShared>& events) 11707d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 11717d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 11727d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11737d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 11747d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, 11757d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (VkRenderPass)0u, // renderPass 11767d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 0u, // subpass 11777d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (VkFramebuffer)0u, // framebuffer 11787d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_FALSE, // occlusionQueryEnable 11797d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (VkQueryControlFlags)0u, // queryFlags 11807d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 11817d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 11827d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11837d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandBufferBeginInfo cmdBufBeginInfo = 11847d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11857d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 11867d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pNext 11877d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 0u, // flags 11887d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa &secCmdBufInheritInfo, // pInheritanceInfo; 11897d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 11907d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11917d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa for(int bufferNdx = 0; bufferNdx < static_cast<int>(cmdBuffers.size()); ++bufferNdx) 11927d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 11937d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.beginCommandBuffer(cmdBuffers[bufferNdx], &cmdBufBeginInfo)); 11947d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.cmdSetEvent(cmdBuffers[bufferNdx], **events[bufferNdx % events.size()], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 11957d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.endCommandBuffer(cmdBuffers[bufferNdx])); 11967d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 11977d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 11987d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 11997d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwabool executeSecondaryCmdBuffer (Context& context, 12007d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VkCommandPool pool, 12017d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector<VkCommandBuffer>& cmdBuffersSecondary, 12027d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector <VkEventShared>& events) 12037d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 12047d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkDevice vkDevice = context.getDevice(); 12057d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const DeviceInterface& vk = context.getDeviceInterface(); 12067d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector<VkCommandBuffer> cmdBuffer (1); 12077d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandBufferBeginInfo cmdBufBeginInfo = 12087d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12097d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 12107d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pNext 12117d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 0u, // flags 12127d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa (const VkCommandBufferInheritanceInfo*)DE_NULL, // pInheritanceInfo; 12137d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 12147d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12157d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa createCommadBuffers(vk, vkDevice, 1u, pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, &cmdBuffer[0]); 12167d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.beginCommandBuffer(cmdBuffer[0], &cmdBufBeginInfo)); 12177d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.cmdExecuteCommands(cmdBuffer[0], static_cast<deUint32>(cmdBuffersSecondary.size()), &cmdBuffersSecondary[0]); 12187d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_CHECK(vk.endCommandBuffer(cmdBuffer[0])); 12197d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12207d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa bool returnValue = submitAndCheck(context, cmdBuffer, events); 12217d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.freeCommandBuffers(vkDevice, pool, 1u, &cmdBuffer[0]); 12227d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return returnValue; 12237d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 12247d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12257d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwatcu::TestStatus trimCommandPoolTest (Context& context, const VkCommandBufferLevel cmdBufferLevel) 12267d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa{ 1227e808b407039c05dc9822e81973a3aecb2c7dab47Alexander Galazin if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_maintenance1")) 12287d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported"); 12297d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12307d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkDevice vkDevice = context.getDevice(); 12317d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const DeviceInterface& vk = context.getDeviceInterface(); 12327d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 12337d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12347d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa //test parameters 12357d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const deUint32 cmdBufferIterationCount = 300u; 12367d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const deUint32 cmdBufferCount = 10u; 12377d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12387d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const VkCommandPoolCreateInfo cmdPoolParams = 12397d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12407d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 12417d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_NULL, // pNext; 12427d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 12437d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa queueFamilyIndex, // queueFamilyIndex; 12447d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa }; 12457d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 12467d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12477d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector <VkEventShared> events; 12487d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa for (deUint32 ndx = 0u; ndx < cmdBufferCount; ++ndx) 1249da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi events.push_back(makeSharedPtr(createEvent(vk, vkDevice))); 12507d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12517d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12527d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector<VkCommandBuffer> cmdBuffers(cmdBufferCount); 12537d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa createCommadBuffers(vk, vkDevice, cmdBufferCount, *cmdPool, cmdBufferLevel, &cmdBuffers[0]); 12547d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12557d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa for (deUint32 cmdBufferIterationrNdx = 0; cmdBufferIterationrNdx < cmdBufferIterationCount; ++cmdBufferIterationrNdx) 12567d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12577d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa addCommandsToBuffer(vk, cmdBuffers, events); 12587d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12597d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa //Peak, situation when we use a lot more command buffers 12607d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (cmdBufferIterationrNdx % 10u == 0) 12617d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12627d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa std::vector<VkCommandBuffer> cmdBuffersPeak(cmdBufferCount * 10u); 12637d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa createCommadBuffers(vk, vkDevice, static_cast<deUint32>(cmdBuffersPeak.size()), *cmdPool, cmdBufferLevel, &cmdBuffersPeak[0]); 12647d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa addCommandsToBuffer(vk, cmdBuffersPeak, events); 12657d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12667d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa switch(cmdBufferLevel) 12677d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12687d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa case VK_COMMAND_BUFFER_LEVEL_PRIMARY: 12697d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (!submitAndCheck(context, cmdBuffersPeak, events)) 12707d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return tcu::TestStatus::fail("Fail"); 12717d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa break; 12727d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa case VK_COMMAND_BUFFER_LEVEL_SECONDARY: 12737d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffersPeak, events)) 12747d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return tcu::TestStatus::fail("Fail"); 12757d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa break; 12767d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa default: 12777d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_ASSERT(0); 12787d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 12797d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.freeCommandBuffers(vkDevice, *cmdPool, static_cast<deUint32>(cmdBuffersPeak.size()), &cmdBuffersPeak[0]); 12807d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 12817d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 128233b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin vk.trimCommandPool(vkDevice, *cmdPool, (VkCommandPoolTrimFlags)0); 12837d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12847d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa switch(cmdBufferLevel) 12857d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 12867d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa case VK_COMMAND_BUFFER_LEVEL_PRIMARY: 12877d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (!submitAndCheck(context, cmdBuffers, events)) 12887d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return tcu::TestStatus::fail("Fail"); 12897d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa break; 12907d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa case VK_COMMAND_BUFFER_LEVEL_SECONDARY: 12917d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa if (!executeSecondaryCmdBuffer(context, *cmdPool, cmdBuffers, events)) 12927d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return tcu::TestStatus::fail("Fail"); 12937d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa break; 12947d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa default: 12957d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa DE_ASSERT(0); 12967d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 12977d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 12987d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa for (deUint32 bufferNdx = cmdBufferIterationrNdx % 3u; bufferNdx < cmdBufferCount; bufferNdx+=2u) 12997d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa { 13007d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa vk.freeCommandBuffers(vkDevice, *cmdPool, 1u, &cmdBuffers[bufferNdx]); 13017d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa createCommadBuffers(vk, vkDevice, 1u, *cmdPool, cmdBufferLevel, &cmdBuffers[bufferNdx]); 13027d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 13037d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 13047d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa } 13057d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 13067d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa return tcu::TestStatus::pass("Pass"); 13077d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa} 13087d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa 1309a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/******** 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) *****************/ 131069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordSinglePrimaryBufferTest(Context& context) 131169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 131269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 131369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 131469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 131569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 131669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 131769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 131869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 131969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 132069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 132169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 132269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 132369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 132469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 132569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 132669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 132769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 132869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 132969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 133069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 133169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 133269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 133369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 133469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 133569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 133669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 133769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 133869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 133969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 134069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 1341689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 134269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 134369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 134469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1345da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 134669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 134769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 134869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 134969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 135069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 135169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 135269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 135369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 135469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 135569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Primary buffer recorded successfully."); 135669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 135769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 135869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordLargePrimaryBufferTest(Context &context) 135969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 136069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 136169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 136269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 136369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 136469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 136569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 136669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 136769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 136869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 136969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 137069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 137169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 137269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 137369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 137469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 137569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 137669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 137769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 137869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 137969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 138069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 138169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 138269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 138369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 138469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 138569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 138669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 138769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 138869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 138969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 1390689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 139169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 139269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 139369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1394da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 139569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 139669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 139769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 139869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 139969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 140069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 140169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 140269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 140369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 140469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 140569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // define minimal amount of commands to accept 140669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const long long unsigned minNumCommands = 10000llu; 140769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 140869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands ) 140969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 141069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 141169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 141269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 141369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record resetting event 141469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdResetEvent(*primCmdBuf, *event,stageMask); 141569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 141669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 141769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 141869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 141969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 142069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 1421da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 142269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 142369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 142469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 142569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 142669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 142769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 142869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1429689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 143069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 143169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 143269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 143369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 143469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 143569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 143669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffer to the queue 143769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 143869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 143969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 144069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 144169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 144269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("hugeTest succeeded"); 144369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 144469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 144569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordSingleSecondaryBufferTest(Context& context) 144669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 144769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 144869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 144969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 145069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 145169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 145269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 145369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 145469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 145569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 145669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 145769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 145869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 145969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 146069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 146169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 146269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 146369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 146469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 146569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 146669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 146769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 146869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 146969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 147069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1471689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 147269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 1473689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 147469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 147569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkRenderPass)0u, // renderPass 147669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 147769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkFramebuffer)0u, // framebuffer 147869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 147969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 148069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 148169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 1482689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferBeginInfo secCmdBufBeginInfo = 1483689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 1484689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 1485689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 1486689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, // flags 1487689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 1488689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 148969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 149069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1491da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 149269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 149369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 149469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 149569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 149669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 149769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 149869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 149969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 150069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 150169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Secondary buffer recorded successfully."); 150269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 150369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 150469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordLargeSecondaryBufferTest(Context &context) 150569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 150669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 150769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 150869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 150969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 151069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 151169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 151269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 151369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 151469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 151569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 151669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 151769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 151869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 151969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 152069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 152169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 152269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 152369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 152469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 152569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 152669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 152769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 152869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // uint32_t bufferCount; 152969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 153069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 153169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 153269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 153369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 153469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 153569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 1536689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 153769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 153869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 153969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1540da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 154169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 154269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 154369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 154469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 154569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 154669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 154769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 154869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 154969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 155069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 155169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // define minimal amount of commands to accept 155269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const long long unsigned minNumCommands = 10000llu; 155369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 155469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for ( long long unsigned currentCommands = 0; currentCommands < minNumCommands / 2; ++currentCommands ) 155569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 155669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 155769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 155869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 155969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record resetting event 156069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdResetEvent(*primCmdBuf, *event,stageMask); 156169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 156269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 156369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 156469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 156569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 156669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 156769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 1568da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 156969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 157069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 157169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 157269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 157369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 157469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 157569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1576689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 157769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 157869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 157969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 158069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 158169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 158269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 158369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffer to the queue 158469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 158569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 158669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 158769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 158869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 158969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("hugeTest succeeded"); 159069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 159169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 159269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus submitPrimaryBufferTwiceTest(Context& context) 159369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 159469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 159569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 159669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 159769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 159869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 159969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 160069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 160169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 160269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 160369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 160469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 160569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 160669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 160769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 160869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 160969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 161069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 161169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 161269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 161369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 161469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 161569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 1616c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 161769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 161869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 161969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 162069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 162169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 162269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 162369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 1624689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 162569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 162669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 162769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1628da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 162969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 163069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 163169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 163269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 163369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 163469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 163569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 163669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 163769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 163869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 163969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 164069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 164169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 164269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 164369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 164469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 1645da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 164669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 164769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 164869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 164969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 165069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 165169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 165269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1653689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 165469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 165569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 165669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 165769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 165869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 165969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 166069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit primary buffer 166169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 166269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 166369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 166469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 166569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 166669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if buffer has been executed 166769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice,*event); 166869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 166969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Submit Twice Test FAILED"); 167069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 167169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 167269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 167369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 167469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 167569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 167669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 167769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 167869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 167969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if buffer has been executed 168069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski result = vk.getEventStatus(vkDevice,*event); 168169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 168269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Submit Twice Test FAILED"); 168369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else 168469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Submit Twice Test succeeded"); 168569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 168669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 168769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus submitSecondaryBufferTwiceTest(Context& context) 168869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 168969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 169069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 169169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 169269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 169369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 169469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 169569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 169669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 169769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 169869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 169969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 170069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 170169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 170269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 170369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 170469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 170569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 170669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 170769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 170869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 170969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 171069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 171169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 1712c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 171369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 171469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 171569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 171669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 171769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 171869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer 171969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 172069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 172169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 172269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 172369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 172469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 1725c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 172669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 172769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 172869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 172969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 173069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 173169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 173269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 173369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 1734689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 1735689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 1736689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 1737689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 1738689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 1739689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 1740689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 174169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkRenderPass)0u, // renderPass 174269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 174369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkFramebuffer)0u, // framebuffer 174469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 174569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 174669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 174769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 174869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secCmdBufBeginInfo = 174969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 175069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 175169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 175269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 1753689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 175469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 175569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 175669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1757da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 175869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 175969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 176069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 176169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 176269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record first primary command buffer 176369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo)); 176469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 176569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer 176669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 176769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 176869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 176969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 177069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 177169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 177269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *event,stageMask); 177369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 177469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 177569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of secondary buffers 177669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 177769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 177869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute secondary buffer 177969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get()); 178069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 178169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf1)); 178269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 178369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 1784da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 178569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 178669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo1 = 178769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 178869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 178969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 179069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 179169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1792689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 179369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 179469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf1.get(), // pCommandBuffers 179569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 179669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 179769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 179869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 179969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence)); 180069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 180169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 180269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 180369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 180469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 180569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if secondary buffer has been executed 180669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice,*event); 180769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 180869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED"); 180969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 181069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset first primary buffer 181169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.resetCommandBuffer( *primCmdBuf1, 0u); 181269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 181369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event to allow receiving it again 181469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 181569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 181669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record second primary command buffer 181769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo)); 181869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 181969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute secondary buffer 182069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get()); 182169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 182269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording 182369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf2)); 182469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 182569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit second primary buffer, the secondary should be executed too 182669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo2 = 182769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 182869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 182969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 183069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 183169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1832689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 183369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 183469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf2.get(), // pCommandBuffers 183569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 183669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 183769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 183869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); 183969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 184069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 184169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 184269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 184369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if secondary buffer has been executed 184469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski result = vk.getEventStatus(vkDevice,*event); 184569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 184669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED"); 184769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else 184869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Submit Twice Secondary Command Buffer succeeded"); 184969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 185069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 185169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus oneTimeSubmitFlagPrimaryBufferTest(Context& context) 185269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 185369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 185469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 185569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 185669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 185769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 185869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 18595780bb0906393148fbca93b0432269e50f8b521ePeter Siket const VkCommandPoolCreateInfo cmdPoolParams = 186069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 186169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 186269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 186369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 186469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 186569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 18665780bb0906393148fbca93b0432269e50f8b521ePeter Siket const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 186769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 186869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 18695780bb0906393148fbca93b0432269e50f8b521ePeter Siket const VkCommandBufferAllocateInfo cmdBufParams = 187069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 187169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 187269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 187369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 187469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 1875c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 187669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 18775780bb0906393148fbca93b0432269e50f8b521ePeter Siket const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 18785780bb0906393148fbca93b0432269e50f8b521ePeter Siket const VkCommandBufferBeginInfo primCmdBufBeginInfo = 187969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 188069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 188169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 188269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags 1883689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 188469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 188569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 188669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 1887da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 188869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 188969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 189069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 1891b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 1892b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // record primary command buffer 1893b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 189469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 189569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 189669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 1897b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 189869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 189969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 190069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 1901b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 1902b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 190369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 1904da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 190569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 190669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 190769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 190869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 190969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 191069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 191169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 1912689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 191369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 191469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 191569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 191669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 191769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 191869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 191969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit primary buffer 192069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 192169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 192269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 192369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 192469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 1925b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 192669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if buffer has been executed 192769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice,*event); 192869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 192969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED"); 193069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 193169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer again - implicit reset because of VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT 193269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 1933b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 1934b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // allow execution of event during every stage of pipeline 193569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 1936b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 193769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 193869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 1939b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski } 194069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 1941b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 194269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 194369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 194469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 194569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 1946b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 194769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 194869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 1949b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 195069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if buffer has been executed 195169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski result = vk.getEventStatus(vkDevice,*event); 195269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 195369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("oneTimeSubmitFlagPrimaryBufferTest FAILED"); 195469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else 195569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("oneTimeSubmitFlagPrimaryBufferTest succeeded"); 195669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 1957b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 195869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus oneTimeSubmitFlagSecondaryBufferTest(Context& context) 195969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 196069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 196169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 196269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 196369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 196469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 196569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 196669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 196769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 196869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 196969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 197069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 197169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 197269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 197369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 197469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 197569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 197669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 197769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 197869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 197969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 198069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 198169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 198269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 1983c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 198469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 198569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 198669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 198769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 198869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 198969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer 199069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 199169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 199269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 199369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 199469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 199569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 1996c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 199769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 199869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 199969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 200069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 200169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 200269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 200369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 200469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 2005689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 2006689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 2007689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 2008689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 2009689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 2010689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 2011689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 201269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkRenderPass)0u, // renderPass 201369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 201469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkFramebuffer)0u, // framebuffer 201569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 201669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 201769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 201869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 201969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secCmdBufBeginInfo = 202069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 202169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 202269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 202369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags 2024689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 202569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 202669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 202769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 2028da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 202969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 203069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 203169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 203269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 203369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record first primary command buffer 203469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo)); 203569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 203669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer 203769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 2038b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 203969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 204069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 204169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 204269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 204369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *event,stageMask); 204469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 204569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 204669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of secondary buffers 204769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 204869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 204969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute secondary buffer 205069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf1, 1, &secCmdBuf.get()); 205169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 205269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf1)); 205369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 2054b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // create fence to wait for execution of queue 2055da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 2056b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 205769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo1 = 205869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 205969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 206069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 206169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 206269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 2063689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 206469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 206569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf1.get(), // pCommandBuffers 206669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 206769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 206869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 2069b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 207069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence)); 2071b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2072b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // wait for end of execution of queue 2073b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 207469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 2075b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2076b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // check if secondary buffer has been executed 2077b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VkResult result = vk.getEventStatus(vkDevice,*event); 2078b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski if (result != VK_EVENT_SET) 207969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Submit Twice Secondary Command Buffer FAILED"); 208069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 208169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset first primary buffer 208269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.resetCommandBuffer( *primCmdBuf1, 0u); 208369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 208469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event to allow receiving it again 208569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 208669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 208769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer again 208869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 208969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 209069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 209169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 209269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 209369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 209469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *event,stageMask); 209569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 209669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of secondary buffers 209769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 209869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 209969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record second primary command buffer 210069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo)); 210169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 210269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute secondary buffer 210369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf2, 1, &secCmdBuf.get()); 210469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 210569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording 210669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf2)); 210769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 210869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit second primary buffer, the secondary should be executed too 210969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo2 = 211069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 211169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 211269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 211369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 211469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 2115689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 211669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 211769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf2.get(), // pCommandBuffers 211869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 211969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 212069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 212169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); 212269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 212369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 212469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 212569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 212669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if secondary buffer has been executed 212769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski result = vk.getEventStatus(vkDevice,*event); 212869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result != VK_EVENT_SET) 212969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("oneTimeSubmitFlagSecondaryBufferTest FAILED"); 2130b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski else 213169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("oneTimeSubmitFlagSecondaryBufferTest succeeded"); 2132b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 2133b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2134a7d993643d59be88684d97427e386e8ee350e12fPeter Sikettcu::TestStatus renderPassContinueTest(Context& context) 2135a7d993643d59be88684d97427e386e8ee350e12fPeter Siket{ 2136a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const DeviceInterface& vkd = context.getDeviceInterface(); 2137a7d993643d59be88684d97427e386e8ee350e12fPeter Siket CommandBufferRenderPassTestEnvironment env (context, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); 2138a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2139a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer primaryCommandBuffer = env.getPrimaryCommandBuffer(); 2140a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkCommandBuffer secondaryCommandBuffer = env.getSecondaryCommandBuffer(); 2141a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const deUint32 clearColor[4] = { 2, 47, 131, 211 }; 2142a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2143a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkClearAttachment clearAttachment = 2144a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 2145a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 2146a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0, // deUint32 colorAttachment; 2147a7d993643d59be88684d97427e386e8ee350e12fPeter Siket makeClearValueColorU32(clearColor[0], 2148a7d993643d59be88684d97427e386e8ee350e12fPeter Siket clearColor[1], 2149a7d993643d59be88684d97427e386e8ee350e12fPeter Siket clearColor[2], 2150a7d993643d59be88684d97427e386e8ee350e12fPeter Siket clearColor[3]) // VkClearValue clearValue; 2151a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 2152a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2153a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkClearRect clearRect = 2154a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 2155a7d993643d59be88684d97427e386e8ee350e12fPeter Siket CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA, // VkRect2D rect; 2156a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // deUint32 baseArrayLayer; 2157a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1u // deUint32 layerCount; 2158a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 2159a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2160a7d993643d59be88684d97427e386e8ee350e12fPeter Siket env.beginSecondaryCommandBuffer(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT); 2161a7d993643d59be88684d97427e386e8ee350e12fPeter Siket vkd.cmdClearAttachments(secondaryCommandBuffer, 1, &clearAttachment, 1, &clearRect); 2162a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vkd.endCommandBuffer(secondaryCommandBuffer)); 2163a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2164a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2165a7d993643d59be88684d97427e386e8ee350e12fPeter Siket env.beginPrimaryCommandBuffer(0); 2166a7d993643d59be88684d97427e386e8ee350e12fPeter Siket env.beginRenderPass(VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); 2167a7d993643d59be88684d97427e386e8ee350e12fPeter Siket vkd.cmdExecuteCommands(primaryCommandBuffer, 1, &secondaryCommandBuffer); 2168a7d993643d59be88684d97427e386e8ee350e12fPeter Siket vkd.cmdEndRenderPass(primaryCommandBuffer); 2169a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2170a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vkd.endCommandBuffer(primaryCommandBuffer)); 2171a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2172a7d993643d59be88684d97427e386e8ee350e12fPeter Siket env.submitPrimaryCommandBuffer(); 2173a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2174a7d993643d59be88684d97427e386e8ee350e12fPeter Siket de::MovePtr<tcu::TextureLevel> result = env.readColorAttachment(); 2175a7d993643d59be88684d97427e386e8ee350e12fPeter Siket tcu::PixelBufferAccess pixelBufferAccess = result->getAccess(); 2176a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2177a7d993643d59be88684d97427e386e8ee350e12fPeter Siket for (deUint32 i = 0; i < (CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.width * CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.height); ++i) 2178a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 2179a7d993643d59be88684d97427e386e8ee350e12fPeter Siket deUint8* colorData = reinterpret_cast<deUint8*>(pixelBufferAccess.getDataPtr()); 2180a7d993643d59be88684d97427e386e8ee350e12fPeter Siket for (int colorComponent = 0; colorComponent < 4; ++colorComponent) 2181a7d993643d59be88684d97427e386e8ee350e12fPeter Siket if (colorData[i * 4 + colorComponent] != clearColor[colorComponent]) 2182a7d993643d59be88684d97427e386e8ee350e12fPeter Siket return tcu::TestStatus::fail("clear value mismatch"); 2183a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 2184a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 2185a7d993643d59be88684d97427e386e8ee350e12fPeter Siket return tcu::TestStatus::pass("render pass continue test passed"); 2186a7d993643d59be88684d97427e386e8ee350e12fPeter Siket} 2187a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 218869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus simultaneousUsePrimaryBufferTest(Context& context) 2189b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 2190b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2191b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 2192b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 2193b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkQueue queue = context.getUniversalQueue(); 2194b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 2195b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 219669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 219769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 219869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 219969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 220069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 220169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 220269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 220369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 2204b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2205b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // Command buffer 220669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 220769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 220869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 220969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 221069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 221169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 2212c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 221369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 221469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 221569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 221669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 221769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 221869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 221969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags 2220689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 222169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 2222b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2223b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // create event that will be used to check if secondary command buffer has been executed 2224da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> eventOne (createEvent(vk, vkDevice)); 2225da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice)); 2226b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2227b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // reset event 222869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *eventOne)); 2229b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2230b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // record primary command buffer 2231b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 2232b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 223369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for event 223468653568300c916f7ca0a2ffab538ee2498f8870Maciej Jesionowski 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); 223569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 223669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Set the second event 223768653568300c916f7ca0a2ffab538ee2498f8870Maciej Jesionowski vk.cmdSetEvent(*primCmdBuf, eventTwo.get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 2238b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski } 2239b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 2240b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 224169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 2242da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence1 (createFence(vk, vkDevice)); 2243da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence2 (createFence(vk, vkDevice)); 224469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 2245b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 224669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 224769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 224869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 224969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 225069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 225169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 2252689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 225369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 225469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 225569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 225669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 225769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 2258b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 225969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit first buffer 226069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence1)); 2261b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 226269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit second buffer 226369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence2)); 2264b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 226569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for both buffer to stop at event for 100 microseconds 226669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, 100000); 226769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, 100000); 2268b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 226969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // set event 227069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.setEvent(vkDevice, *eventOne)); 2271b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 227269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of the first buffer 227369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence1.get(), 0u, INFINITE_TIMEOUT)); 227469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of the second buffer 227569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence2.get(), 0u, INFINITE_TIMEOUT)); 2276b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 227769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // TODO: this will be true if the command buffer was executed only once 227869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // TODO: add some test that will say if it was executed twice 2279b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2280b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // check if buffer has been executed 228169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice, *eventTwo); 228269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result == VK_EVENT_SET) 228369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("simultaneous use - primary buffers test succeeded"); 2284b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski else 228569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("simultaneous use - primary buffers test FAILED"); 2286b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 2287b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 228869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus simultaneousUseSecondaryBufferTest(Context& context) 2289b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 2290b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 2291b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 2292b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkQueue queue = context.getUniversalQueue(); 2293b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 2294b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 229569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 229669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 229769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 229869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 229969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 230069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 230169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 230269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 2303b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2304b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // Command buffer 230569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 230669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 230769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 230869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 230969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 231069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 2311c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 231269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 231369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 2314b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 231569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer params 231669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 231769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 231869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 231969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 232069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 232169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 2322c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 232369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 232469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 2325b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 232669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 232769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 232869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 232969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 233069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 2331689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 2332689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 2333689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 2334689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 2335689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 2336689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 2337689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 233869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkRenderPass)0u, // renderPass 233969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 234069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkFramebuffer)0u, // framebuffer 234169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 234269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 234369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 234469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 234569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secCmdBufBeginInfo = 234669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 234769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 234869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 234969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags 2350689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 235169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 2352b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2353b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // create event that will be used to check if secondary command buffer has been executed 2354da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> eventOne (createEvent(vk, vkDevice)); 2355da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> eventTwo (createEvent(vk, vkDevice)); 2356b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2357b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // reset event 235869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *eventOne)); 235969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *eventTwo)); 2360b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 236169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer 236269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 2363b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 236469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 236569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 2366b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 236769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for event 2368689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdWaitEvents(*secCmdBuf, 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL); 2369b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 237069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 237169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *eventTwo, stageMask); 237269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 237369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of secondary buffers 237469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 2375b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 237669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 237769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 237869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 2379b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // execute secondary buffer 238069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get()); 2381b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski } 238269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 2383b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2384b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // create fence to wait for execution of queue 2385da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 23867a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 238769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 238869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 238969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 239069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 239169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 239269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 2393689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 239469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 239569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 239669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 239769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 239869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 23997a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 240069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit primary buffer, the secondary should be executed too 240169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 2402b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 240369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for both buffers to stop at event for 100 microseconds 240469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 100000); 2405b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 240669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // set event 240769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.setEvent(vkDevice, *eventOne)); 2408b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 2409b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // wait for end of execution of queue 2410b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 2411b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 241269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // TODO: this will be true if the command buffer was executed only once 241369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // TODO: add some test that will say if it was executed twice 241469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 2415b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski // check if secondary buffer has been executed 241669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice,*eventTwo); 241769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result == VK_EVENT_SET) 241869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded"); 2419b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski else 242069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED"); 24217a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 24227a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 24235125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlistcu::TestStatus simultaneousUseSecondaryBufferOnePrimaryBufferTest(Context& context) 24245125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis{ 24255125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkDevice vkDevice = context.getDevice(); 24265125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const DeviceInterface& vk = context.getDeviceInterface(); 24275125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkQueue queue = context.getUniversalQueue(); 24285125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 24295125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis Allocator& allocator = context.getDefaultAllocator(); 24305125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f); 24315125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24325125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandPoolCreateInfo cmdPoolParams = 24335125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24345125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 24355125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 24365125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 24375125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis queueFamilyIndex, // deUint32 queueFamilyIndex; 24385125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24395125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams)); 24405125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24415125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Command buffer 24425125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferAllocateInfo cmdBufParams = 24435125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24445125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 24455125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 24465125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *cmdPool, // VkCommandPool pool; 24475125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 24485125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 1u, // uint32_t bufferCount; 24495125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24505125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandBuffer> primCmdBuf(allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 24515125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24525125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Secondary Command buffer params 24535125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferAllocateInfo secCmdBufParams = 24545125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24555125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 24565125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 24575125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *cmdPool, // VkCommandPool pool; 24585125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 24595125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 1u, // uint32_t bufferCount; 24605125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24615125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 24625125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24635125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferBeginInfo primCmdBufBeginInfo = 24645125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24655125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 24665125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 24675125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0, // flags 24685125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (const VkCommandBufferInheritanceInfo*)DE_NULL, 24695125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24705125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24715125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 24725125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24735125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 24745125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 24755125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkRenderPass)0u, 24765125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // subpass 24775125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkFramebuffer)0u, 24785125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_FALSE, // occlusionQueryEnable 24795125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkQueryControlFlags)0u, 24805125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkQueryPipelineStatisticFlags)0u, 24815125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24825125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferBeginInfo secCmdBufBeginInfo = 24835125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 24845125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 24855125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 24865125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags 24875125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis &secCmdBufInheritInfo, 24885125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 24895125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 24905125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 offset = (0u); 24915125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 addressableSize = 256; 24925125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 dataSize = 8; 24935125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis de::MovePtr<Allocation> bufferMem; 24945125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem)); 24955125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute 24965125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context)); 24975125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context)); 24985125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer())); 24995125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkDescriptorSet descriptorSets[] = { *descriptorSet }; 25005125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets); 25015125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25025125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkPipelineLayoutCreateInfo layoutCreateInfo = 25035125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25045125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType 25055125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pNext 25065125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkPipelineLayoutCreateFlags)0, 25075125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis numDescriptorSets, // setLayoutCount 25085125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis &descriptorSetLayout.get(), // pSetLayouts 25095125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // pushConstantRangeCount 25105125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pPushConstantRanges 25115125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 25125125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo)); 25135125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25145125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u)); 25155125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25165125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkPipelineShaderStageCreateInfo shaderCreateInfo = 25175125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25185125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 25195125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 25205125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkPipelineShaderStageCreateFlags)0, 25215125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_SHADER_STAGE_COMPUTE_BIT, // stage 25225125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *computeModule, // shader 25235125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis "main", 25245125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pSpecializationInfo 25255125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 25265125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25275125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkComputePipelineCreateInfo pipelineCreateInfo = 25285125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25295125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 25305125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 25315125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // flags 25325125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis shaderCreateInfo, // cs 25335125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *pipelineLayout, // layout 25345125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (vk::VkPipeline)0, // basePipelineHandle 25355125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // basePipelineIndex 25365125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 25375125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25385125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo)); 25395125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25405125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // record secondary command buffer 25415125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 25425125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25435125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); 25445125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0); 25455125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u); 25465125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis } 25475125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // end recording of secondary buffer 25485125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 25495125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25505125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // record primary command buffer 25515125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 25525125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25535125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // execute secondary buffer twice in same primary 25545125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get()); 25555125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdExecuteCommands(*primCmdBuf, 1, &secCmdBuf.get()); 25565125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis } 25575125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 25585125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25595125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // create fence to wait for execution of queue 2560da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence(createFence(vk, vkDevice)); 25615125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25625125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkSubmitInfo submitInfo = 25635125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 25645125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 25655125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pNext 25665125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // waitSemaphoreCount 25675125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pWaitSemaphores 25685125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 25695125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 1, // commandBufferCount 25705125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis &primCmdBuf.get(), // pCommandBuffers 25715125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // signalSemaphoreCount 25725125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pSignalSemaphores 25735125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 25745125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25755125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // submit primary buffer, the secondary should be executed too 25765125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 25775125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25785125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // wait for end of execution of queue 25795125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 25805125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25815125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis deUint32 resultCount; 25825125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis result.readResultContentsTo(&resultCount); 25835125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // check if secondary buffer has been executed 25845125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis if (resultCount == 2) 25855125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded"); 25865125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis else 25875125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED"); 25885125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis} 25895125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25905125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlistcu::TestStatus simultaneousUseSecondaryBufferTwoPrimaryBuffersTest(Context& context) 25915125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis{ 25925125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkDevice vkDevice = context.getDevice(); 25935125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const DeviceInterface& vk = context.getDeviceInterface(); 25945125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkQueue queue = context.getUniversalQueue(); 25955125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 25965125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis Allocator& allocator = context.getDefaultAllocator(); 25975125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const ComputeInstanceResultBuffer result(vk, vkDevice, allocator, 0.0f); 25985125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 25995125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandPoolCreateInfo cmdPoolParams = 26005125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26015125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 26025125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 26035125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 26045125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis queueFamilyIndex, // deUint32 queueFamilyIndex; 26055125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26065125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandPool> cmdPool(createCommandPool(vk, vkDevice, &cmdPoolParams)); 26075125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26085125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Command buffer 26095125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferAllocateInfo cmdBufParams = 26105125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26115125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 26125125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 26135125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *cmdPool, // VkCommandPool pool; 26145125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 26155125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 1u, // uint32_t bufferCount; 26165125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26175125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Two separate primary cmd buffers that will be executed with the same secondary cmd buffer 26185125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 numPrimCmdBufs = 2; 26195125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandBuffer> primCmdBufOne(allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 26205125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandBuffer> primCmdBufTwo(allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 26215125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VkCommandBuffer primCmdBufs[numPrimCmdBufs]; 26225125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis primCmdBufs[0] = primCmdBufOne.get(); 26235125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis primCmdBufs[1] = primCmdBufTwo.get(); 26245125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26255125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Secondary Command buffer params 26265125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferAllocateInfo secCmdBufParams = 26275125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26285125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 26295125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // const void* pNext; 26305125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *cmdPool, // VkCommandPool pool; 26315125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 26325125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 1u, // uint32_t bufferCount; 26335125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26345125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkCommandBuffer> secCmdBuf(allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 26355125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26365125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferBeginInfo primCmdBufBeginInfo = 26375125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26385125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 26395125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 26405125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0, // flags 26415125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (const VkCommandBufferInheritanceInfo*)DE_NULL, 26425125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26435125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26445125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 26455125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26465125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 26475125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 26485125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkRenderPass)0u, // renderPass 26495125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // subpass 26505125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkFramebuffer)0u, // framebuffer 26515125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_FALSE, // occlusionQueryEnable 26525125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkQueryControlFlags)0u, // queryFlags 26535125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 26545125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26555125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkCommandBufferBeginInfo secCmdBufBeginInfo = 26565125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26575125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 26585125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 26595125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags 26605125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis &secCmdBufInheritInfo, 26615125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26625125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26635125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 offset = (0u); 26645125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 addressableSize = 256; 26655125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const deUint32 dataSize = 8; 26665125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis de::MovePtr<Allocation> bufferMem; 26675125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkBuffer> buffer(createDataBuffer(context, offset, addressableSize, 0x00, dataSize, 0x5A, &bufferMem)); 26685125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Secondary command buffer will have a compute shader that does an atomic increment to make sure that all instances of secondary buffers execute 26695125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(context)); 26705125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorPool> descriptorPool(createDescriptorPool(context)); 26715125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkDescriptorSet> descriptorSet(createDescriptorSet(context, *descriptorPool, *descriptorSetLayout, *buffer, offset, result.getBuffer())); 26725125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkDescriptorSet descriptorSets[] = { *descriptorSet }; 26735125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets); 26745125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26755125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkPipelineLayoutCreateInfo layoutCreateInfo = 26765125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26775125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType 26785125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pNext 26795125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkPipelineLayoutCreateFlags)0, 26805125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis numDescriptorSets, // setLayoutCount 26815125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis &descriptorSetLayout.get(), // pSetLayouts 26825125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // pushConstantRangeCount 26835125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pPushConstantRanges 26845125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26855125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis Unique<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, vkDevice, &layoutCreateInfo)); 26865125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26875125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkShaderModule> computeModule(createShaderModule(vk, vkDevice, context.getBinaryCollection().get("compute_increment"), (VkShaderModuleCreateFlags)0u)); 26885125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 26895125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkPipelineShaderStageCreateInfo shaderCreateInfo = 26905125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 26915125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 26925125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 26935125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (VkPipelineShaderStageCreateFlags)0, 26945125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_SHADER_STAGE_COMPUTE_BIT, // stage 26955125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *computeModule, // shader 26965125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis "main", 26975125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pSpecializationInfo 26985125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 26995125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27005125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkComputePipelineCreateInfo pipelineCreateInfo = 27015125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 27025125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 27035125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, 27045125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // flags 27055125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis shaderCreateInfo, // cs 27065125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis *pipelineLayout, // layout 27075125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (vk::VkPipeline)0, // basePipelineHandle 27085125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // basePipelineIndex 27095125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 27105125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27115125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const Unique<VkPipeline> pipeline(createComputePipeline(vk, vkDevice, (VkPipelineCache)0u, &pipelineCreateInfo)); 27125125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27135125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // record secondary command buffer 27145125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 27155125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 27165125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdBindPipeline(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); 27175125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdBindDescriptorSets(*secCmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, 0, 0); 27185125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdDispatch(*secCmdBuf, 1u, 1u, 1u); 27195125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis } 27205125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // end recording of secondary buffer 27215125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 27225125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27235125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // record primary command buffers 27245125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // Insert one instance of same secondary command buffer into two separate primary command buffers 27255125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo)); 27265125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 27275125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdExecuteCommands(*primCmdBufOne, 1, &secCmdBuf.get()); 27285125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis } 27295125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.endCommandBuffer(*primCmdBufOne)); 27305125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27315125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo)); 27325125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 27335125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis vk.cmdExecuteCommands(*primCmdBufTwo, 1, &secCmdBuf.get()); 27345125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis } 27355125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo)); 27365125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27375125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // create fence to wait for execution of queue 2738da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence(createFence(vk, vkDevice)); 27395125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27405125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const VkSubmitInfo submitInfo = 27415125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis { 27425125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 27435125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pNext 27445125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // waitSemaphoreCount 27455125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pWaitSemaphores 27465125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 27475125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis numPrimCmdBufs, // commandBufferCount 27485125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis primCmdBufs, // pCommandBuffers 27495125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 0u, // signalSemaphoreCount 27505125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis DE_NULL, // pSignalSemaphores 27515125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis }; 27525125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27535125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // submit primary buffers, the secondary should be executed too 27545125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence)); 27555125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27565125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // wait for end of execution of queue 27575125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 27585125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 27595125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis deUint32 resultCount; 27605125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis result.readResultContentsTo(&resultCount); 27615125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis // check if secondary buffer has been executed 27625125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis if (resultCount == 2) 27635125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis return tcu::TestStatus::pass("Simulatous Secondary Command Buffer Execution succeeded"); 27645125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis else 27655125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis return tcu::TestStatus::fail("Simulatous Secondary Command Buffer Execution FAILED"); 27665125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis} 27675125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 276869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordBufferQueryPreciseWithFlagTest(Context& context) 27697a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 277069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 277169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 277269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 27737a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 2774a7d993643d59be88684d97427e386e8ee350e12fPeter Siket if (!context.getDeviceFeatures().inheritedQueries) 2775a7d993643d59be88684d97427e386e8ee350e12fPeter Siket TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); 2776a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 277769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 27787a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 277969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 278069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 278169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 278269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 27837a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 278469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 27857a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 278669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 278769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo primCmdBufParams = 2788b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 278969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 279069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 279169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 279269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 279369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 2794b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 279569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams)); 27967a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 279769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer params 279869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 279969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 280069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 280169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 280269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 280369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level; 280469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 280569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 280669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 28077a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 280869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primBufferBeginInfo = 2809b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 281069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 281169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 2812b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 0u, // flags 2813689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 2814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 2815689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 2816689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secBufferInheritInfo = 2817689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 2818689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 2819689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 282069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // renderPass 282169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 282269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // framebuffer 2823689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_TRUE, // occlusionQueryEnable 2824689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags 282569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 2826b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 282769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secBufferBeginInfo = 2828b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 282969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 283069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 2831b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 0u, // flags 2832689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secBufferInheritInfo, 283369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 283469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 283569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueryPoolCreateInfo queryPoolCreateInfo = 283669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 283769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType 283869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 283968653568300c916f7ca0a2ffab538ee2498f8870Maciej Jesionowski (VkQueryPoolCreateFlags)0, // flags 284069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_QUERY_TYPE_OCCLUSION, // queryType 284169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // entryCount 284269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // pipelineStatistics 2843b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 284469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo)); 2845b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 284669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo)); 284769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(secCmdBuf.get())); 28487a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 284969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo)); 2850b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 2851cd32d2c2b0824a4d5447192a1515b1df4d9a0986Szilard Ledan vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u); 285235f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT); 285369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 285469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get()); 285569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 285635f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u); 285769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 285869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(primCmdBuf.get())); 285969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 286069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query."); 286169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 286269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 286369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordBufferQueryImpreciseWithFlagTest(Context& context) 286469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 286569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 286669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 286769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 286869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 2869a7d993643d59be88684d97427e386e8ee350e12fPeter Siket if (!context.getDeviceFeatures().inheritedQueries) 2870a7d993643d59be88684d97427e386e8ee350e12fPeter Siket TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); 2871a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 287269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 287369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 287469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 287569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 287669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 287769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 2878b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 287969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 28807a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 288169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 288269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo primCmdBufParams = 2883b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 288469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 288569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 288669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 288769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 288869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 2889b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 289069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams)); 28917a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 289269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer params 289369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 2894b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 289569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 289669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 289769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 289869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level; 289969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 2900b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 290169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 29027a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 290369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primBufferBeginInfo = 2904b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 290569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 290669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 2907b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 0u, // flags 2908689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 2909689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 2910689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 2911689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secBufferInheritInfo = 2912689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 2913689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 2914689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 291569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // renderPass 291669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 291769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // framebuffer 2918689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_TRUE, // occlusionQueryEnable 2919689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUERY_CONTROL_PRECISE_BIT, // queryFlags 292069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 2921b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 292269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secBufferBeginInfo = 2923b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 292469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 292569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 292669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 2927689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secBufferInheritInfo, 2928b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 2929b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 293069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set 293169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueryPoolCreateInfo queryPoolCreateInfo = 2932b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 293369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType 293469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 293569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 293669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_QUERY_TYPE_OCCLUSION, // queryType 293769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // entryCount 293869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // pipelineStatistics 2939b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 294069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo)); 2941b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 294269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo)); 294369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(secCmdBuf.get())); 2944b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 294569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo)); 2946b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 2947cd32d2c2b0824a4d5447192a1515b1df4d9a0986Szilard Ledan vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u); 294835f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT); 294969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 295069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get()); 295169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 295235f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u); 295369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 295469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(primCmdBuf.get())); 295569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 295669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query."); 295769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 29587a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 295969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context) 296069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 296169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 296269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 296369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 29647a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 2965a7d993643d59be88684d97427e386e8ee350e12fPeter Siket if (!context.getDeviceFeatures().inheritedQueries) 2966a7d993643d59be88684d97427e386e8ee350e12fPeter Siket TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); 2967a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 296869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 296969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 297069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 297169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 297269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 297369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 297469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 297569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 29767a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 297769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 297869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo primCmdBufParams = 2979b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 298069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 298169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 298269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 298369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 298469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 2985b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 298669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &primCmdBufParams)); 2987b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 298869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer params 298969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 2990b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 299169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 299269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 299369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 299469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level; 299569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // flags; 2996b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 299769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 2998b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 299969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primBufferBeginInfo = 3000b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 300169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 300269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 3003b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 0u, // flags 3004689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 3005689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 3006689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 3007689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secBufferInheritInfo = 3008689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 3009689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 3010689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 301169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // renderPass 301269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 301369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // framebuffer 301469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_TRUE, // occlusionQueryEnable 301569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // queryFlags 301669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 3017b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 301869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secBufferBeginInfo = 3019b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 302069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 302169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 302269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3023689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secBufferInheritInfo, 3024b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 3025b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 302669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Create an occlusion query with VK_QUERY_CONTROL_PRECISE_BIT set 302769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueryPoolCreateInfo queryPoolCreateInfo = 302869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 302969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, // sType 303069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 303169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPoolCreateFlags)0, 303269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_QUERY_TYPE_OCCLUSION, 303369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, 303469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, 303569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 303669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski Unique<VkQueryPool> queryPool (createQueryPool(vk, vkDevice, &queryPoolCreateInfo)); 30377a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 303869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(secCmdBuf.get(), &secBufferBeginInfo)); 303969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(secCmdBuf.get())); 30407a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 304169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(primCmdBuf.get(), &primBufferBeginInfo)); 30427a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 3043cd32d2c2b0824a4d5447192a1515b1df4d9a0986Szilard Ledan vk.cmdResetQueryPool(primCmdBuf.get(), queryPool.get(), 0u, 1u); 304435f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdBeginQuery(primCmdBuf.get(), queryPool.get(), 0u, VK_QUERY_CONTROL_PRECISE_BIT); 304569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 304669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(primCmdBuf.get(), 1u, &secCmdBuf.get()); 304769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 304835f26806e87fce6211d58f5db3ad261b28e63ac9Piotr Łebski vk.cmdEndQuery(primCmdBuf.get(), queryPool.get(), 0u); 30497a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 305069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(primCmdBuf.get())); 305169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 305269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query."); 305369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 30547a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3055a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/ 305669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus submitBufferCountNonZero(Context& context) 30577a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 30587a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkDevice vkDevice = context.getDevice(); 30597a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 30607a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 30617a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 30627a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 306369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 BUFFER_COUNT = 5u; 306469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 306569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 30667a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 306769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 306869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 306969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 307069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 30717a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 307269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 30737a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 30747a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Command buffer 307569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 30767a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 307769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 307869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 307969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 308069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 308169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski BUFFER_COUNT, // bufferCount; 30827a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 308369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[BUFFER_COUNT]; 308469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers)); 30857a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 308669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo cmdBufBeginInfo = 30877a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 308869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 308969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 309069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3091689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 30927a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 30937a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3094663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket std::vector<VkEventSp> events; 309569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 3096663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket { 3097da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice)))); 3098663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket } 30997a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 310069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Record the command buffers 310169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 31027a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 310369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo)); 310469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 3105663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 310669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 310769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx])); 31087a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 31097a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 31107a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // We'll use a fence to wait for the execution of the queue 3111da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 31127a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 311369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 311469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 311569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 311669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 311769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 311869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3119689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 312069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski BUFFER_COUNT, // commandBufferCount 312169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski cmdBuffers, // pCommandBuffers 312269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 312369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 312469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 31257a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 312669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the alpha command buffer to the queue 312769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get())); 312869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Wait for the queue 312969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT)); 31307a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 313169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Check if the buffers were executed 3132ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo tcu::TestStatus testResult = tcu::TestStatus::incomplete(); 3133ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 313469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 3135ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo { 3136663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket if (vk.getEventStatus(vkDevice, events[ndx]->get()) != VK_EVENT_SET) 3137ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo { 3138ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::fail("Failed to set the event."); 3139ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo break; 3140ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo } 3141ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo } 31427a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3143ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo if (!testResult.isComplete()) 3144ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::pass("All buffers were submitted and executed correctly."); 3145ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 3146ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo return testResult; 31477a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 31487a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 314969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus submitBufferCountEqualZero(Context& context) 31507a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 31517a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkDevice vkDevice = context.getDevice(); 31527a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 31537a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 31547a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 31557a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 315669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 BUFFER_COUNT = 2u; 315769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 315869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 31597a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 316069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 316169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 316269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 316369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 31647a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 316569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 31667a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 31677a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Command buffer 316869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 31697a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 317069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 317169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 317269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 317369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 317469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski BUFFER_COUNT, // bufferCount; 31757a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 317669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[BUFFER_COUNT]; 317769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, cmdBuffers)); 31787a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 317969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo cmdBufBeginInfo = 31807a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 318169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 318269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 318369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3184689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 31857a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 31867a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3187663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket std::vector<VkEventSp> events; 318869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 3189da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice)))); 31907a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 319169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Record the command buffers 319269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 31937a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 319469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo)); 319569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 3196663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 319769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 319869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx])); 31997a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 32007a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 32017a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // We'll use a fence to wait for the execution of the queue 3202da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fenceZero (createFence(vk, vkDevice)); 3203da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fenceOne (createFence(vk, vkDevice)); 32047a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 320569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoCountZero = 320669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 320769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 320869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 320969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 321069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3211689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 321269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 321369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmdBuffers[0], // pCommandBuffers 321469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 321569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 321669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 32177a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 321869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoCountOne = 321969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 322069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 322169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 322269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 322369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3224689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 322569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 322669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmdBuffers[1], // pCommandBuffers 322769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 322869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 322969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 32307a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 323169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Submit the command buffers to the queue 323269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // We're performing two submits to make sure that the first one has 323369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // a chance to be processed before we check the event's status 3234739acec91a956c5fd31168324b2add8230ad5956iostrows VK_CHECK(vk.queueSubmit(queue, 0, &submitInfoCountZero, fenceZero.get())); 3235739acec91a956c5fd31168324b2add8230ad5956iostrows VK_CHECK(vk.queueSubmit(queue, 1, &submitInfoCountOne, fenceOne.get())); 3236739acec91a956c5fd31168324b2add8230ad5956iostrows 3237689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkFence fences[] = 3238739acec91a956c5fd31168324b2add8230ad5956iostrows { 3239739acec91a956c5fd31168324b2add8230ad5956iostrows fenceZero.get(), 3240739acec91a956c5fd31168324b2add8230ad5956iostrows fenceOne.get(), 3241739acec91a956c5fd31168324b2add8230ad5956iostrows }; 32427a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 324369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Wait for the queue 3244739acec91a956c5fd31168324b2add8230ad5956iostrows VK_CHECK(vk.waitForFences(vkDevice, (deUint32)DE_LENGTH_OF_ARRAY(fences), fences, VK_TRUE, INFINITE_TIMEOUT)); 32457a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 324669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Check if the first buffer was executed 3247ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo tcu::TestStatus testResult = tcu::TestStatus::incomplete(); 3248ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 3249663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket if (vk.getEventStatus(vkDevice, events[0]->get()) == VK_EVENT_SET) 3250ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::fail("The first event was signaled."); 3251ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo else 3252ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo testResult = tcu::TestStatus::pass("The first submission was ignored."); 32537a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3254ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo return testResult; 32557a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 32567a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3257698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynskitcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) 3258698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski{ 3259698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkDevice vkDevice = context.getDevice(); 3260698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 3261698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkQueue queue = context.getUniversalQueue(); 3262698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 3263698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3264698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandPoolCreateInfo cmdPoolParams = 3265698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3266698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 3267698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // const void* pNext; 3268698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 3269698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski queueFamilyIndex, // deUint32 queueFamilyIndex; 3270698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3271698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 3272698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3273698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Command buffer 3274698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandBufferAllocateInfo cmdBufParams = 3275698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3276698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 3277698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // const void* pNext; 3278698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski *cmdPool, // VkCommandPool pool; 3279698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 3280698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1u, // uint32_t bufferCount; 3281698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3282698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3283698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Create two command buffers 3284698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const Unique<VkCommandBuffer> primCmdBuf1 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 3285698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const Unique<VkCommandBuffer> primCmdBuf2 (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 3286698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3287698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 3288698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3289698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 3290698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pNext 3291698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 0, // flags 3292a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; 3293698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3294698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3295698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create two events that will be used to check if command buffers has been executed 3296da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event1 (createEvent(vk, vkDevice)); 3297da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event2 (createEvent(vk, vkDevice)); 3298698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3299698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // reset events 3300698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetEvent(vkDevice, *event1)); 3301698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetEvent(vkDevice, *event2)); 3302698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3303698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record first command buffer 3304698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf1, &primCmdBufBeginInfo)); 3305698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3306698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // allow execution of event during every stage of pipeline 3307698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 3308698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3309698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record setting event 3310698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski vk.cmdSetEvent(*primCmdBuf1, *event1,stageMask); 3311698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski } 3312698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf1)); 3313698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3314698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record second command buffer 3315698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf2, &primCmdBufBeginInfo)); 3316698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3317698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // allow execution of event during every stage of pipeline 3318698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 3319698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3320698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record setting event 3321698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski vk.cmdSetEvent(*primCmdBuf2, *event2,stageMask); 3322698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski } 3323698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf2)); 3324698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3325698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create fence to wait for execution of queue 3326da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 3327698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3328698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create semaphore for use in this test 3329da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique <VkSemaphore> semaphore (createSemaphore(vk, vkDevice)); 3330698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3331698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create submit info for first buffer - signalling semaphore 3332698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkSubmitInfo submitInfo1 = 3333698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3334698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 3335698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pNext 3336698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 0u, // waitSemaphoreCount 3337698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pWaitSemaphores 3338a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // pWaitDstStageMask 3339698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1, // commandBufferCount 3340698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski &primCmdBuf1.get(), // pCommandBuffers 3341698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1u, // signalSemaphoreCount 3342698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski &semaphore.get(), // pSignalSemaphores 3343698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3344698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3345698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Submit the command buffer to the queue 3346698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence)); 3347698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3348698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // wait for end of execution of queue 3349698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 3350698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3351698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // check if buffer has been executed 3352698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VkResult result = vk.getEventStatus(vkDevice,*event1); 3353698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski if (result != VK_EVENT_SET) 3354698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED"); 3355698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3356a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; 3357a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3358698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create submit info for second buffer - waiting for semaphore 3359698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkSubmitInfo submitInfo2 = 3360698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3361698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 3362698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pNext 3363698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1u, // waitSemaphoreCount 3364698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski &semaphore.get(), // pWaitSemaphores 3365a7d993643d59be88684d97427e386e8ee350e12fPeter Siket &waitDstStageFlags, // pWaitDstStageMask 3366698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1, // commandBufferCount 3367698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski &primCmdBuf2.get(), // pCommandBuffers 3368698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 0u, // signalSemaphoreCount 3369698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pSignalSemaphores 3370698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3371698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3372698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // reset fence, so it can be used again 3373698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 3374698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3375698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Submit the second command buffer to the queue 3376698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); 3377698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3378698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // wait for end of execution of queue 3379698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 3380698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3381698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // check if second buffer has been executed 3382698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // if it has been executed, it means that the semaphore was signalled - so test if passed 3383698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski result = vk.getEventStatus(vkDevice,*event1); 3384698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski if (result != VK_EVENT_SET) 3385698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED"); 3386698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3387698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski return tcu::TestStatus::pass("Submit Buffer and Wait for Single Semaphore Test succeeded"); 3388698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski} 3389698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3390698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynskitcu::TestStatus submitBufferWaitManySemaphores(Context& context) 3391698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski{ 3392698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // This test will create numSemaphores semaphores, and signal them in NUM_SEMAPHORES submits to queue 3393698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // After that the numSubmissions queue submissions will wait for each semaphore 3394698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3395a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const deUint32 numSemaphores = 10u; // it must be multiply of numSubmission 3396a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const deUint32 numSubmissions = 2u; 3397698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkDevice vkDevice = context.getDevice(); 3398698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 3399698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkQueue queue = context.getUniversalQueue(); 3400698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 3401698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3402698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandPoolCreateInfo cmdPoolParams = 3403698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3404698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 3405698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // const void* pNext; 3406698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 3407698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski queueFamilyIndex, // deUint32 queueFamilyIndex; 3408698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3409698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 3410698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3411698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Command buffer 3412698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandBufferAllocateInfo cmdBufParams = 3413698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3414698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 3415698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // const void* pNext; 3416698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski *cmdPool, // VkCommandPool pool; 3417698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 3418698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1u, // uint32_t bufferCount; 3419698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3420698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3421698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Create command buffer 3422698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 3423698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3424698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 3425698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3426698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 3427698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pNext 3428698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 0, // flags 3429a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; 3430698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3431698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3432698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create event that will be used to check if command buffers has been executed 3433da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 3434698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3435698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // reset event - at creation state is undefined 3436698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetEvent(vkDevice, *event)); 3437698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3438698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record command buffer 3439698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 3440698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3441698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // allow execution of event during every stage of pipeline 3442698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 3443698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3444698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // record setting event 3445698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski vk.cmdSetEvent(*primCmdBuf, *event,stageMask); 3446698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski } 3447698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 3448698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3449698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create fence to wait for execution of queue 3450da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 3451698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3452698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // numSemaphores is declared const, so this array can be static 3453698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // the semaphores will be destroyed automatically at end of scope 3454698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski Move <VkSemaphore> semaphoreArray[numSemaphores]; 3455a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkSemaphore semaphores[numSemaphores]; 3456698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3457698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski for (deUint32 idx = 0; idx < numSemaphores; ++idx) { 3458698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // create semaphores for use in this test 3459da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi semaphoreArray[idx] = createSemaphore(vk, vkDevice); 3460a7d993643d59be88684d97427e386e8ee350e12fPeter Siket semaphores[idx] = semaphoreArray[idx].get(); 3461a7d993643d59be88684d97427e386e8ee350e12fPeter Siket }; 3462698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3463a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 3464a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // create submit info for buffer - signal semaphores 3465698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski const VkSubmitInfo submitInfo1 = 3466698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski { 3467698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 3468698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pNext 3469698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 0u, // waitSemaphoreCount 3470698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski DE_NULL, // pWaitSemaphores 3471a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // pWaitDstStageMask 3472698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 1, // commandBufferCount 3473698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski &primCmdBuf.get(), // pCommandBuffers 3474a7d993643d59be88684d97427e386e8ee350e12fPeter Siket numSemaphores, // signalSemaphoreCount 3475a7d993643d59be88684d97427e386e8ee350e12fPeter Siket semaphores // pSignalSemaphores 3476698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3477698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // Submit the command buffer to the queue 3478698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence)); 3479698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3480698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // wait for end of execution of queue 3481698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 3482698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3483698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // check if buffer has been executed 3484698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VkResult result = vk.getEventStatus(vkDevice,*event); 3485698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski if (result != VK_EVENT_SET) 3486698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED"); 3487698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3488698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // reset event, so next buffers can set it again 3489698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetEvent(vkDevice, *event)); 3490698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3491698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // reset fence, so it can be used again 3492698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 3493a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 3494a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3495a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const deUint32 numberOfSemaphoresToBeWaitedByOneSubmission = numSemaphores / numSubmissions; 3496a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const std::vector<VkPipelineStageFlags> waitDstStageFlags (numberOfSemaphoresToBeWaitedByOneSubmission, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT); 3497698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3498698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski // the following code waits for the semaphores set above - numSubmissions queues will wait for each semaphore from above 3499a7d993643d59be88684d97427e386e8ee350e12fPeter Siket for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) { 3500698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3501a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // create submit info for buffer - waiting for semaphore 3502a7d993643d59be88684d97427e386e8ee350e12fPeter Siket const VkSubmitInfo submitInfo2 = 3503a7d993643d59be88684d97427e386e8ee350e12fPeter Siket { 3504a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 3505a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // pNext 3506a7d993643d59be88684d97427e386e8ee350e12fPeter Siket numberOfSemaphoresToBeWaitedByOneSubmission, // waitSemaphoreCount 3507a7d993643d59be88684d97427e386e8ee350e12fPeter Siket semaphores + (numberOfSemaphoresToBeWaitedByOneSubmission * idxSubmission), // pWaitSemaphores 3508a7d993643d59be88684d97427e386e8ee350e12fPeter Siket waitDstStageFlags.data(), // pWaitDstStageMask 3509a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 1, // commandBufferCount 3510a7d993643d59be88684d97427e386e8ee350e12fPeter Siket &primCmdBuf.get(), // pCommandBuffers 3511a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 0u, // signalSemaphoreCount 3512a7d993643d59be88684d97427e386e8ee350e12fPeter Siket DE_NULL, // pSignalSemaphores 3513698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski }; 3514a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3515a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // Submit the second command buffer to the queue 3516a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); 3517a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3518a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // wait for 1 second. 3519a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 1000 * 1000 * 1000)); 3520a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3521a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // check if second buffer has been executed 3522a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // if it has been executed, it means that the semaphore was signalled - so test if passed 3523a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VkResult result = vk.getEventStatus(vkDevice,*event); 3524a7d993643d59be88684d97427e386e8ee350e12fPeter Siket if (result != VK_EVENT_SET) 3525a7d993643d59be88684d97427e386e8ee350e12fPeter Siket return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED"); 3526a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3527a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // reset fence, so it can be used again 3528a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); 3529a7d993643d59be88684d97427e386e8ee350e12fPeter Siket 3530a7d993643d59be88684d97427e386e8ee350e12fPeter Siket // reset event, so next buffers can set it again 3531a7d993643d59be88684d97427e386e8ee350e12fPeter Siket VK_CHECK(vk.resetEvent(vkDevice, *event)); 3532a7d993643d59be88684d97427e386e8ee350e12fPeter Siket } 3533698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 3534698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski return tcu::TestStatus::pass("Submit Buffer and Wait for Many Semaphores Test succeeded"); 3535698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski} 3536698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski 353769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus submitBufferNullFence(Context& context) 35387a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 35397a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkDevice vkDevice = context.getDevice(); 35407a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 35417a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 35427a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 35437a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 35447a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski const short BUFFER_COUNT = 2; 35457a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 354669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 35477a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 354869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 354969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 355069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags; 355169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 35527a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 355369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 35547a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 35557a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Command buffer 355669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 35577a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 355869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 355969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 356069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // pool; 356169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 356269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 35637a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 356469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[BUFFER_COUNT]; 356569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 356669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &cmdBufParams, &cmdBuffers[ndx])); 35677a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 356869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo cmdBufBeginInfo = 35697a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 357069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 357169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 357269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3573689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 35747a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski }; 35757a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 3576663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket std::vector<VkEventSp> events; 357769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 3578da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi events.push_back(VkEventSp(new vk::Unique<VkEvent>(createEvent(vk, vkDevice)))); 35797a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 35807a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Record the command buffers 358169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 35827a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 358369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &cmdBufBeginInfo)); 35847a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 3585663b7ac6f3f69a93ab937b6f28417f142420596fPeter Siket vk.cmdSetEvent(cmdBuffers[ndx], events[ndx]->get(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); 35867a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 358769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx])); 35887a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 35897a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 35907a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // We'll use a fence to wait for the execution of the queue 3591da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 35927a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 359369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoNullFence = 359469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 359569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 359669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 359769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 359869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3599689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 360069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 360169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmdBuffers[0], // pCommandBuffers 360269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 360369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 360469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 360569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 360669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoNonNullFence = 360769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 360869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 360969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 361069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 361169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3612689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 361369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 361469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmdBuffers[1], // pCommandBuffers 361569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 361669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 361769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 361869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 361969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Perform two submissions - one with no fence, the other one with a valid 362069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // fence Hoping submitting the other buffer will give the first one time to 362169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute 362269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNullFence, DE_NULL)); 362369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoNonNullFence, fence.get())); 362469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 36257a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski // Wait for the queue 362669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), VK_TRUE, INFINITE_TIMEOUT)); 36277a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 362801f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa 3629ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo tcu::TestStatus testResult = tcu::TestStatus::incomplete(); 3630ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 363101f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa //Fence guaranteed that all buffers submited before fence were executed 363201f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa if (vk.getEventStatus(vkDevice, events[0]->get()) != VK_EVENT_SET || vk.getEventStatus(vkDevice, events[1]->get()) != VK_EVENT_SET) 363301f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa { 363401f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa testResult = tcu::TestStatus::fail("One of the buffers was not executed."); 363501f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa } 3636ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo else 363701f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa { 363801f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa testResult = tcu::TestStatus::pass("Buffers have been submitted and executed correctly."); 363901f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa } 3640ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo 364101f62f5d3754ffa85b72c08d490e43f3872dc3c8Arkadiusz Sarwa vk.queueWaitIdle(queue); 3642ee2e596e392230fb1658fc4a412c9e04811d1476Kristof Kosztyo return testResult; 364369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 364469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 3645a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/******** 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) *******/ 364669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus executeSecondaryBufferTest(Context& context) 364769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski{ 364869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice vkDevice = context.getDevice(); 364969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const DeviceInterface& vk = context.getDeviceInterface(); 365069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkQueue queue = context.getUniversalQueue(); 365169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 365269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 365369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 365469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 365569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 365669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 365769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // flags; 365869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex; 365969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 366069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 366169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 366269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 366369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 366469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 366569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 366669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 366769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // commandPool; 366869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level; 366969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 367069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 367169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBuf (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 367269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 367369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffer 367469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 367569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 367669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType; 367769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext; 367869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // commandPool; 367969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level; 368069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 368169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 368269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> secCmdBuf (allocateCommandBuffer(vk, vkDevice, &secCmdBufParams)); 368369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 368469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 368569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 368669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 368769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 368869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3689689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 3690689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 3691689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 3692689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 3693689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 3694689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 3695689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 369669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // renderPass 369769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 369869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // framebuffer 369969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 370069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 370169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 370269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 370369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secCmdBufBeginInfo = 370469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 370569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 370669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 370769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 3708689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 370969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 371069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 371169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 3712da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> event (createEvent(vk, vkDevice)); 371369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 371469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 371569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *event)); 371669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 371769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer 371869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*secCmdBuf, &secCmdBufBeginInfo)); 371969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 372069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 372169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 372269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record setting event 372369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdSetEvent(*secCmdBuf, *event, stageMask); 372469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 372569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of the secondary buffer 372669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*secCmdBuf)); 37277a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 372869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer 372969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBuf, &primCmdBufBeginInfo)); 37307a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski { 373169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute secondary buffer 373269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBuf, 1u, &secCmdBuf.get()); 37337a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski } 373469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBuf)); 373569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 373669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 3737da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fence (createFence(vk, vkDevice)); 373869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 373969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 374069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 374169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 374269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 374369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3744689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 374569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // commandBufferCount 374669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBuf.get(), // pCommandBuffers 374769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 374869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 374969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 37507a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 375169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit primary buffer, the secondary should be executed too 375269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence.get())); 37537a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 375469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of queue 375569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); 37567a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 375769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // check if secondary buffer has been executed 375869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkResult result = vk.getEventStatus(vkDevice, *event); 375969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (result == VK_EVENT_SET) 376069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("executeSecondaryBufferTest succeeded"); 37617a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 376269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("executeSecondaryBufferTest FAILED"); 37637a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 37647a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 376569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus executeSecondaryBufferTwiceTest(Context& context) 3766b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 376769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 BUFFER_COUNT = 10u; 3768b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkDevice vkDevice = context.getDevice(); 3769b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 3770b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkQueue queue = context.getUniversalQueue(); 3771b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 3772b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 377369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolParams = 377469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 377569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 377669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // const void* pNext; 377769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // VkCommandPoolCreateFlags flags; 377869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // deUint32 queueFamilyIndex; 377969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 378069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams)); 3781b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 378269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Command buffer 378369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufParams = 3784b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 378569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 3786b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski DE_NULL, // const void* pNext; 378769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 378869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 3789c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz 1u, // uint32_t bufferCount; 3790b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 379169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBufOne (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 379269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> primCmdBufTwo (allocateCommandBuffer(vk, vkDevice, &cmdBufParams)); 3793b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 379469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // Secondary Command buffers params 379569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo secCmdBufParams = 3796b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 379769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 3798b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski DE_NULL, // const void* pNext; 379969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // VkCommandPool pool; 380069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; 3801c151d2bf85ec9e65c0d539deb8baa3400abfb90eJeff Bolz BUFFER_COUNT, // uint32_t bufferCount; 3802b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 380369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkCommandBuffer cmdBuffers[BUFFER_COUNT]; 380469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.allocateCommandBuffers(vkDevice, &secCmdBufParams, cmdBuffers)); 3805b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 380669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo primCmdBufBeginInfo = 3807b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 380869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 3809b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski DE_NULL, 381069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0, // flags 3811689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 3812689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 3813689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 3814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = 3815689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 3816689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 3817689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 381869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkRenderPass)0u, // renderPass 381969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // subpass 382069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkFramebuffer)0u, // framebuffer 382169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_FALSE, // occlusionQueryEnable 382269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryControlFlags)0u, // queryFlags 382369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics 382469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 382569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo secCmdBufBeginInfo = 382669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 382769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 3828b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski DE_NULL, 382969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, // flags 3830689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &secCmdBufInheritInfo, 3831b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 3832b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 383369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create event that will be used to check if secondary command buffer has been executed 3834da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkEvent> eventOne (createEvent(vk, vkDevice)); 383569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 383669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // reset event 383769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetEvent(vkDevice, *eventOne)); 383869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 383969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski for (deUint32 ndx = 0; ndx < BUFFER_COUNT; ++ndx) 3840b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 384169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record secondary command buffer 384269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(cmdBuffers[ndx], &secCmdBufBeginInfo)); 3843b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 384469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // allow execution of event during every stage of pipeline 384569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VkPipelineStageFlags stageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; 384669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 384769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for event 3848689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdWaitEvents(cmdBuffers[ndx], 1, &eventOne.get(), stageMask, stageMask, 0, DE_NULL, 0u, DE_NULL, 0u, DE_NULL); 3849b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski } 385069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // end recording of secondary buffers 385169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(cmdBuffers[ndx])); 385269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 385369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 385469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer one 385569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBufOne, &primCmdBufBeginInfo)); 385669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 385769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute one secondary buffer 385869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBufOne, 1, cmdBuffers ); 3859b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski } 386069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBufOne)); 386169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 386269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // record primary command buffer two 386369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*primCmdBufTwo, &primCmdBufBeginInfo)); 386469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 386569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // execute one secondary buffer with all buffers 386669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdExecuteCommands(*primCmdBufTwo, BUFFER_COUNT, cmdBuffers ); 386769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 386869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*primCmdBufTwo)); 3869b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 387069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // create fence to wait for execution of queue 3871da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fenceOne (createFence(vk, vkDevice)); 3872da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> fenceTwo (createFence(vk, vkDevice)); 387369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 387469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoOne = 387569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 387669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 387769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 387869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 387969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3880689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 388169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 388269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBufOne.get(), // pCommandBuffers 388369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 388469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 388569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 3886b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 388769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit primary buffer, the secondary should be executed too 388869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoOne, *fenceOne)); 388969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 389069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for buffer to stop at event for 100 microseconds 389169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000); 389269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 389369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfoTwo = 389469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 389569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 389669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 389769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 389869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 3899689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 390069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 390169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &primCmdBufTwo.get(), // pCommandBuffers 390269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 390369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 390469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 3905b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 390669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit second primary buffer, the secondary should be executed too 390769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfoTwo, *fenceTwo)); 390869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 390969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for all buffers to stop at event for 100 microseconds 391069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, 100000); 391169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 391269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // now all buffers are waiting at eventOne 391369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // set event eventOne 391469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.setEvent(vkDevice, *eventOne)); 391569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 391669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of fenceOne 391769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceOne.get(), 0u, INFINITE_TIMEOUT)); 391869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 391969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // wait for end of execution of second queue 392069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(vkDevice, 1, &fenceTwo.get(), 0u, INFINITE_TIMEOUT)); 392169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 392269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("executeSecondaryBufferTwiceTest succeeded"); 3923b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 3924b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 3925a7d993643d59be88684d97427e386e8ee350e12fPeter Siket/******** 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) **/ 392669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebskitcu::TestStatus orderBindPipelineTest(Context& context) 3927b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 3928b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const DeviceInterface& vk = context.getDeviceInterface(); 392969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDevice device = context.getDevice(); 3930b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const VkQueue queue = context.getUniversalQueue(); 3931b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 393269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski Allocator& allocator = context.getDefaultAllocator(); 393369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const ComputeInstanceResultBuffer result (vk, device, allocator); 3934b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 393569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski enum 3936b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 393769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski ADDRESSABLE_SIZE = 256, // allocate a lot more than required 3938b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 3939b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 394069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 colorA1 = tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f); 394169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 colorA2 = tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f); 394269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 colorB1 = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f); 394369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 colorB2 = tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f); 394469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 394569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 dataOffsetA = (0u); 394669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 dataOffsetB = (0u); 394769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 viewOffsetA = (0u); 394869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 viewOffsetB = (0u); 394969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 bufferSizeA = dataOffsetA + ADDRESSABLE_SIZE; 395069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 bufferSizeB = dataOffsetB + ADDRESSABLE_SIZE; 395169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 395269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski de::MovePtr<Allocation> bufferMemA; 395369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkBuffer> bufferA (createColorDataBuffer(dataOffsetA, bufferSizeA, colorA1, colorA2, &bufferMemA, context)); 395469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 395569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski de::MovePtr<Allocation> bufferMemB; 395669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkBuffer> bufferB (createColorDataBuffer(dataOffsetB, bufferSizeB, colorB1, colorB2, &bufferMemB, context)); 395769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 395869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout(context)); 395969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkDescriptorPool> descriptorPool (createDescriptorPool(context)); 396069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout, *bufferA, viewOffsetA, *bufferB, viewOffsetB, result.getBuffer(), context)); 396169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkDescriptorSet descriptorSets[] = { *descriptorSet }; 396269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const int numDescriptorSets = DE_LENGTH_OF_ARRAY(descriptorSets); 396369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 396469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkPipelineLayoutCreateInfo layoutCreateInfo = 3965b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 396669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType 396769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 396869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkPipelineLayoutCreateFlags)0, 396969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski numDescriptorSets, // setLayoutCount 397069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &descriptorSetLayout.get(), // pSetLayouts 397169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // pushConstantRangeCount 397269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pPushConstantRanges 3973b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 397469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, device, &layoutCreateInfo)); 397569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 397669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkShaderModule> computeModuleGood (createShaderModule(vk, device, context.getBinaryCollection().get("compute_good"), (VkShaderModuleCreateFlags)0u)); 39776ef06724e94f40530f416156100adf531bb2a5cePyry Haulos const Unique<VkShaderModule> computeModuleBad (createShaderModule(vk, device, context.getBinaryCollection().get("compute_bad"), (VkShaderModuleCreateFlags)0u)); 3978b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 397969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkPipelineShaderStageCreateInfo shaderCreateInfoGood = 3980b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 398169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 3982b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski DE_NULL, 398369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkPipelineShaderStageCreateFlags)0, 398469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_SHADER_STAGE_COMPUTE_BIT, // stage 398569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *computeModuleGood, // shader 398669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski "main", 398769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSpecializationInfo 3988b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 3989b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 399069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkPipelineShaderStageCreateInfo shaderCreateInfoBad = 3991b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 399269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 399369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 399469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (vk::VkPipelineShaderStageCreateFlags)0, 399569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk::VK_SHADER_STAGE_COMPUTE_BIT, // stage 399669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *computeModuleBad, // shader 399769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski "main", 399869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSpecializationInfo 3999b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 4000b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 400169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkComputePipelineCreateInfo createInfoGood = 4002b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 400369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 400469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 400569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 400669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski shaderCreateInfoGood, // cs 400769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *pipelineLayout, // layout 400869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (vk::VkPipeline)0, // basePipelineHandle 400969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // basePipelineIndex 401069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 4011b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 401269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkComputePipelineCreateInfo createInfoBad = 4013b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 401469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, 401569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, 401669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 401769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski shaderCreateInfoBad, // cs 401869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *pipelineLayout, // descriptorSetLayout.get() 401969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski (VkPipeline)0, // basePipelineHandle 402069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // basePipelineIndex 4021b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 4022b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 40236ef06724e94f40530f416156100adf531bb2a5cePyry Haulos const Unique<VkPipeline> pipelineGood (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoGood)); 40246ef06724e94f40530f416156100adf531bb2a5cePyry Haulos const Unique<VkPipeline> pipelineBad (createComputePipeline(vk, device, (VkPipelineCache)0u, &createInfoBad)); 4025b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 402669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkAccessFlags inputBit = (VK_ACCESS_UNIFORM_READ_BIT); 4027689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkBufferMemoryBarrier bufferBarriers[] = 402869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 4029689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 4030689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 4031689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 4032689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_ACCESS_HOST_WRITE_BIT, // outputMask 4033689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos inputBit, // inputMask 4034689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex 4035689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex 4036689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos *bufferA, // buffer 4037689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDeviceSize)0u, // offset 4038689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDeviceSize)bufferSizeA, // size 4039689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }, 4040689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 4041689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 4042689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 4043689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_ACCESS_HOST_WRITE_BIT, // outputMask 4044689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos inputBit, // inputMask 4045689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex 4046689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex 4047689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos *bufferB, // buffer 4048689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDeviceSize)0u, // offset 4049689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDeviceSize)bufferSizeB, // size 4050689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos } 405169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 4052b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 405369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 numSrcBuffers = 1u; 4054b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 405569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32* const dynamicOffsets = (DE_NULL); 405669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const deUint32 numDynamicOffsets = (0); 405769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const int numPreBarriers = numSrcBuffers; 4058689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const vk::VkBufferMemoryBarrier* const postBarriers = result.getResultReadBarrier(); 4059689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const int numPostBarriers = 1; 406069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 refQuadrantValue14 = (colorA2); 406169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 refQuadrantValue23 = (colorA1); 406269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::Vec4 references[4] = 4063b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 406469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski refQuadrantValue14, 406569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski refQuadrantValue23, 406669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski refQuadrantValue23, 406769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski refQuadrantValue14, 4068b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 406969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski tcu::Vec4 results[4]; 4070b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 407169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit and wait begin 407269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 407369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const tcu::UVec3 numWorkGroups = tcu::UVec3(4, 1u, 1); 407469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 407569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandPoolCreateInfo cmdPoolCreateInfo = 4076b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 407769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; 407869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 407969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags 408069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski queueFamilyIndex, // queueFamilyIndex 4081b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 408269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, &cmdPoolCreateInfo)); 408369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferAllocateInfo cmdBufCreateInfo = 4084b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 408569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType 408669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 408769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski *cmdPool, // commandPool 408869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level 408969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1u, // bufferCount; 4090b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 4091b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 409269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkCommandBufferBeginInfo cmdBufBeginInfo = 4093b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski { 409469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType 409569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 409669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // flags 4097689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 4098b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski }; 4099b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 4100da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const Unique<VkFence> cmdCompleteFence (createFence(vk, device)); 410169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const Unique<VkCommandBuffer> cmd (allocateCommandBuffer(vk, device, &cmdBufCreateInfo)); 4102b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 410369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.beginCommandBuffer(*cmd, &cmdBufBeginInfo)); 4104b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 410569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineBad); 410669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdBindPipeline(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineGood); 410769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdBindDescriptorSets(*cmd, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, numDescriptorSets, descriptorSets, numDynamicOffsets, dynamicOffsets); 4108b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 410969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (numPreBarriers) 411068653568300c916f7ca0a2ffab538ee2498f8870Maciej Jesionowski vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0, 4111689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 4112689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos numPreBarriers, bufferBarriers, 4113689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkImageMemoryBarrier*)DE_NULL); 41147a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 411569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski vk.cmdDispatch(*cmd, numWorkGroups.x(), numWorkGroups.y(), numWorkGroups.z()); 4116689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmd, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 4117689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 4118689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos numPostBarriers, postBarriers, 4119689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkImageMemoryBarrier*)DE_NULL); 412069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.endCommandBuffer(*cmd)); 412169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 412269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // run 41236ef06724e94f40530f416156100adf531bb2a5cePyry Haulos // submit second primary buffer, the secondary should be executed too 412469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski const VkSubmitInfo submitInfo = 412569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 412669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType 412769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pNext 412869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // waitSemaphoreCount 412969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pWaitSemaphores 4130689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, // pWaitDstStageMask 413169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 1, // commandBufferCount 413269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski &cmd.get(), // pCommandBuffers 413369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 0u, // signalSemaphoreCount 413469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski DE_NULL, // pSignalSemaphores 413569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski }; 413669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *cmdCompleteFence)); 413769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 413869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.waitForFences(device, 1u, &cmdCompleteFence.get(), 0u, INFINITE_TIMEOUT)); // \note: timeout is failure 413969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski VK_CHECK(vk.resetFences(device, 1u, &cmdCompleteFence.get())); 414069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 414169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // submit and wait end 414269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski result.readResultContentsTo(&results); 414369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 414469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski // verify 414569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski if (results[0] == references[0] && 414669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[1] == references[1] && 414769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[2] == references[2] && 414869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[3] == references[3]) 414969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 415069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::pass("Pass"); 415169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 415269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else if (results[0] == tcu::Vec4(-1.0f) && 415369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[1] == tcu::Vec4(-1.0f) && 415469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[2] == tcu::Vec4(-1.0f) && 415569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski results[3] == tcu::Vec4(-1.0f)) 415669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 415769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski context.getTestContext().getLog() 415869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << tcu::TestLog::Message 415969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << "Result buffer was not written to." 416069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << tcu::TestLog::EndMessage; 416169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Result buffer was not written to"); 416269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 416369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski else 416469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski { 416569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski context.getTestContext().getLog() 416669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << tcu::TestLog::Message 416769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << "Error expected [" 416869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << references[0] << ", " 416969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << references[1] << ", " 417069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << references[2] << ", " 417169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << references[3] << "], got [" 417269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << results[0] << ", " 417369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << results[1] << ", " 417469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << results[2] << ", " 417569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << results[3] << "]" 417669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << tcu::TestLog::EndMessage; 417769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski return tcu::TestStatus::fail("Invalid result values"); 417869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski } 417969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} 41807a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 4181b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski// Shaders 4182b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynskivoid genComputeSource (SourceCollections& programCollection) 4183b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski{ 4184b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES); 41855125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis std::ostringstream bufGood; 4186b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 41875125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis bufGood << versionDecl << "\n" 4188b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "" 41895125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n" 419069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << "layout(set = 0, binding = 1u, std140) uniform BufferName\n" 4191b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4192b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 colorA;\n" 4193b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 colorB;\n" 4194b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "} b_instance;\n" 4195b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n" 4196b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4197b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 read_colors[4];\n" 4198b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "} b_out;\n" 4199b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "void main(void)\n" 4200b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4201b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp int quadrant_id = int(gl_WorkGroupID.x);\n" 4202b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 result_color;\n" 4203b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " if (quadrant_id == 1 || quadrant_id == 2)\n" 4204b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " result_color = b_instance.colorA;\n" 4205b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " else\n" 4206b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " result_color = b_instance.colorB;\n" 4207b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " b_out.read_colors[gl_WorkGroupID.x] = result_color;\n" 4208b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "}\n"; 4209b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 42105125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis programCollection.glslSources.add("compute_good") << glu::ComputeSource(bufGood.str()); 4211b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 42125125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis std::ostringstream bufBad; 4213b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 42145125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis bufBad << versionDecl << "\n" 4215b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "" 42165125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n" 421769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << "layout(set = 0, binding = 1u, std140) uniform BufferName\n" 4218b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4219b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 colorA;\n" 4220b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 colorB;\n" 4221b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "} b_instance;\n" 4222b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "layout(set = 0, binding = 0, std140) writeonly buffer OutBuf\n" 4223b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4224b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 read_colors[4];\n" 4225b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "} b_out;\n" 4226b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "void main(void)\n" 4227b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "{\n" 4228b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp int quadrant_id = int(gl_WorkGroupID.x);\n" 4229b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " highp vec4 result_color;\n" 4230b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " if (quadrant_id == 1 || quadrant_id == 2)\n" 4231b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " result_color = b_instance.colorA;\n" 4232b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " else\n" 4233b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << " result_color = b_instance.colorB;\n" 423469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski << " b_out.read_colors[gl_WorkGroupID.x] = vec4(0.0, 0.0, 0.0, 0.0);\n" 4235b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski << "}\n"; 4236b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski 42375125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis programCollection.glslSources.add("compute_bad") << glu::ComputeSource(bufBad.str()); 42385125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis} 42395125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 42405125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlisvoid genComputeIncrementSource (SourceCollections& programCollection) 42415125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis{ 42425125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis const char* const versionDecl = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES); 42435125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis std::ostringstream bufIncrement; 42445125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 42455125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis bufIncrement << versionDecl << "\n" 42465125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "" 42475125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "layout(local_size_x = 1u, local_size_y = 1u, local_size_z = 1u) in;\n" 42485125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "layout(set = 0, binding = 0, std140) buffer InOutBuf\n" 42495125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "{\n" 42505125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << " coherent uint count;\n" 42515125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "} b_in_out;\n" 42525125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "void main(void)\n" 42535125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "{\n" 42545125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << " atomicAdd(b_in_out.count, 1u);\n" 42555125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis << "}\n"; 42565125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis 42575125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis programCollection.glslSources.add("compute_increment") << glu::ComputeSource(bufIncrement.str()); 4258b0833b3fc37ae8c5b9945d34c247e7901434aa3dJan Syryczynski} 42597a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 426069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski} // anonymous 426169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 42627a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebskitcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx) 42637a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski{ 42647a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski de::MovePtr<tcu::TestCaseGroup> commandBuffersTests (new tcu::TestCaseGroup(testCtx, "command_buffers", "Command Buffers Tests")); 42657a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 4266a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.1. Command Pools (5.1 in VK 1.0 Spec) */ 426769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_create_null_params", "", createPoolNullParamsTest); 426869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_create_non_null_allocator", "", createPoolNonNullAllocatorTest); 426969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_create_transient_bit", "", createPoolTransientBitTest); 427069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_create_reset_bit", "", createPoolResetBitTest); 427169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_reset_release_res", "", resetPoolReleaseResourcesBitTest); 427269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "pool_reset_no_flags_res", "", resetPoolNoFlagsTest); 42739ad0c6b220ba2fd535214eba576beb3091c88ee1Arkadiusz Sarwa addFunctionCase (commandBuffersTests.get(), "pool_reset_reuse", "", resetPoolReuseTest); 4274a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */ 427569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "allocate_single_primary", "", allocatePrimaryBufferTest); 42766ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "allocate_many_primary", "", allocateManyPrimaryBuffersTest); 42776ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "allocate_single_secondary", "", allocateSecondaryBufferTest); 42786ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "allocate_many_secondary", "", allocateManySecondaryBuffersTest); 427969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", executePrimaryBufferTest); 428069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", executeLargePrimaryBufferTest); 428169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", resetBufferImplicitlyTest); 42827d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa addFunctionCase (commandBuffersTests.get(), "trim_command_pool", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY); 42837d84129f76e9c2eb6fa15fc4a5cfef9d14b330c6Arkadiusz Sarwa addFunctionCase (commandBuffersTests.get(), "trim_command_pool_secondary", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY); 4284a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */ 428569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", recordSinglePrimaryBufferTest); 42866ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", recordLargePrimaryBufferTest); 428769b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", recordSingleSecondaryBufferTest); 42886ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "record_many_secondary", "", recordLargeSecondaryBufferTest); 428969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "submit_twice_primary", "", submitPrimaryBufferTwiceTest); 42906ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", submitSecondaryBufferTwiceTest); 429169b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", oneTimeSubmitFlagPrimaryBufferTest); 429269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", oneTimeSubmitFlagSecondaryBufferTest); 4293a7d993643d59be88684d97427e386e8ee350e12fPeter Siket addFunctionCase (commandBuffersTests.get(), "render_pass_continue", "", renderPassContinueTest); 429469b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", simultaneousUsePrimaryBufferTest); 429569b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", simultaneousUseSecondaryBufferTest); 42965125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_one_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferOnePrimaryBufferTest); 42975125b961903b5822c8fcd8e6d154736bac843835Tobin Ehlis addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_two_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferTwoPrimaryBuffersTest); 429869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_query_precise_w_flag", "", recordBufferQueryPreciseWithFlagTest); 429969b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_w_flag", "", recordBufferQueryImpreciseWithFlagTest); 430069b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_wo_flag", "", recordBufferQueryImpreciseWithoutFlagTest); 4301a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */ 430269b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", submitBufferCountNonZero); 430369b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", submitBufferCountEqualZero); 4304698e3bdfa11109fb10f9065612503da8b77c62b6Jan Syryczynski addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", submitBufferWaitSingleSemaphore); 4305a7d993643d59be88684d97427e386e8ee350e12fPeter Siket addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", submitBufferWaitManySemaphores); 430669b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", submitBufferNullFence); 4307a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */ 43086ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", executeSecondaryBufferTest); 43096ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", executeSecondaryBufferTwiceTest); 4310a7d993643d59be88684d97427e386e8ee350e12fPeter Siket /* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */ 43116ef06724e94f40530f416156100adf531bb2a5cePyry Haulos addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline", "", genComputeSource, orderBindPipelineTest); 43127a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 43137a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski return commandBuffersTests.release(); 43147a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} 43157a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski 43167a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} // api 43177a598c95f3ecf8a209e733b704c51ea87db12c53Piotr Łebski} // vkt 431869b4f1338234996f689d6dc8c012f8c714077cc0Piotr Łebski 4319