diff options
author | Peter Siket <ps.szeged@partner.samsung.com> | 2016-01-26 15:08:16 +0100 |
---|---|---|
committer | Peter Siket <ps.szeged@partner.samsung.com> | 2016-03-21 19:23:31 +0100 |
commit | a7d993643d59be88684d97427e386e8ee350e12f (patch) | |
tree | b038e5576e694dca52dc4c9e7a8a3ee218cf1ae4 /external | |
parent | 698e3bdfa11109fb10f9065612503da8b77c62b6 (diff) | |
download | VK-GL-CTS-a7d993643d59be88684d97427e386e8ee350e12f.tar.gz VK-GL-CTS-a7d993643d59be88684d97427e386e8ee350e12f.tar.bz2 VK-GL-CTS-a7d993643d59be88684d97427e386e8ee350e12f.zip |
Command buffer tests are fixed and extended.
Diffstat (limited to 'external')
-rw-r--r-- | external/vulkancts/framework/vulkan/vkTypeUtil.hpp | 10 | ||||
-rw-r--r-- | external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp | 650 |
2 files changed, 581 insertions, 79 deletions
diff --git a/external/vulkancts/framework/vulkan/vkTypeUtil.hpp b/external/vulkancts/framework/vulkan/vkTypeUtil.hpp index 72cd30fe5..707faccef 100644 --- a/external/vulkancts/framework/vulkan/vkTypeUtil.hpp +++ b/external/vulkancts/framework/vulkan/vkTypeUtil.hpp @@ -48,6 +48,16 @@ inline VkClearValue makeClearValueColorF32 (float r, float g, float b, float a) return v; } +inline VkClearValue makeClearValueColorU32 (deUint32 r, deUint32 g, deUint32 b, deUint32 a) +{ + VkClearValue v; + v.color.uint32[0] = r; + v.color.uint32[1] = g; + v.color.uint32[2] = b; + v.color.uint32[3] = a; + return v; +} + inline VkClearValue makeClearValueColor (const tcu::Vec4& color) { VkClearValue v; diff --git a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp index 6933d7432..d7ab8f7c3 100644 --- a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp +++ b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp @@ -35,6 +35,8 @@ #include "vkQueryUtil.hpp" #include "vkMemUtil.hpp" #include "vkDeviceUtil.hpp" +#include "tcuTextureUtil.hpp" +#include "vkImageUtil.hpp" #include "vkPrograms.hpp" #include "vkTypeUtil.hpp" #include "vkAllocationCallbackUtil.hpp" @@ -58,8 +60,447 @@ typedef de::SharedPtr<vk::Unique<vk::VkEvent> > VkEventSp; // Global variables const deUint64 INFINITE_TIMEOUT = ~(deUint64)0u; + +template <deUint32 NumBuffers> +class CommandBufferBareTestEnvironment +{ +public: + CommandBufferBareTestEnvironment (Context& context, + VkCommandPoolCreateFlags commandPoolCreateFlags); + + VkCommandPool getCommandPool (void) const { return *m_commandPool; } + VkCommandBuffer getCommandBuffer (deUint32 bufferIndex) const; + +protected: + Context& m_context; + const VkDevice m_device; + const DeviceInterface& m_vkd; + const VkQueue m_queue; + const deUint32 m_queueFamilyIndex; + Allocator& m_allocator; + + Move<VkCommandPool> m_commandPool; + VkCommandBuffer m_primaryCommandBuffers[NumBuffers]; +}; + +template <deUint32 NumBuffers> +CommandBufferBareTestEnvironment<NumBuffers>::CommandBufferBareTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags) + : m_context (context) + , m_device (context.getDevice()) + , m_vkd (context.getDeviceInterface()) + , m_queue (context.getUniversalQueue()) + , m_queueFamilyIndex (context.getUniversalQueueFamilyIndex()) + , m_allocator (context.getDefaultAllocator()) +{ + const VkCommandPoolCreateInfo cmdPoolCreateInfo = + { + VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + commandPoolCreateFlags, // VkCommandPoolCreateFlags flags; + m_queueFamilyIndex // deUint32 queueFamilyIndex; + }; + + m_commandPool = createCommandPool(m_vkd, m_device, &cmdPoolCreateInfo, DE_NULL); + + const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = + { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + *m_commandPool, // VkCommandPool commandPool; + VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; + NumBuffers // deUint32 commandBufferCount; + }; + + VK_CHECK(m_vkd.allocateCommandBuffers(m_device, &cmdBufferAllocateInfo, m_primaryCommandBuffers)); +} + +template <deUint32 NumBuffers> +VkCommandBuffer CommandBufferBareTestEnvironment<NumBuffers>::getCommandBuffer(deUint32 bufferIndex) const +{ + DE_ASSERT(bufferIndex < NumBuffers); + return m_primaryCommandBuffers[bufferIndex]; +} + +class CommandBufferRenderPassTestEnvironment : public CommandBufferBareTestEnvironment<1> +{ +public: + CommandBufferRenderPassTestEnvironment (Context& context, + VkCommandPoolCreateFlags commandPoolCreateFlags); + + VkRenderPass getRenderPass (void) const { return *m_renderPass; } + VkFramebuffer getFrameBuffer (void) const { return *m_frameBuffer; } + VkCommandBuffer getPrimaryCommandBuffer (void) const { return getCommandBuffer(0); } + VkCommandBuffer getSecondaryCommandBuffer (void) const { return *m_secondaryCommandBuffer; } + + void beginPrimaryCommandBuffer (VkCommandBufferUsageFlags usageFlags); + void beginSecondaryCommandBuffer (VkCommandBufferUsageFlags usageFlags); + void beginRenderPass (VkSubpassContents content); + void submitPrimaryCommandBuffer (void); + de::MovePtr<tcu::TextureLevel> readColorAttachment (void); + + static const VkImageType DEFAULT_IMAGE_TYPE; + static const VkFormat DEFAULT_IMAGE_FORMAT; + static const VkExtent3D DEFAULT_IMAGE_SIZE; + static const VkRect2D DEFAULT_IMAGE_AREA; + +protected: + + Move<VkImage> m_colorImage; + Move<VkImageView> m_colorImageView; + Move<VkRenderPass> m_renderPass; + Move<VkFramebuffer> m_frameBuffer; + de::MovePtr<Allocation> m_colorImageMemory; + Move<VkCommandBuffer> m_secondaryCommandBuffer; + +}; + +const VkImageType CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_TYPE = VK_IMAGE_TYPE_2D; +const VkFormat CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_FORMAT = VK_FORMAT_R8G8B8A8_UINT; +const VkExtent3D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE = {255, 255, 1}; +const VkRect2D CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA = +{ + { 0u, 0u, }, // VkOffset2D offset; + { DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height }, // VkExtent2D extent; +}; + +CommandBufferRenderPassTestEnvironment::CommandBufferRenderPassTestEnvironment(Context& context, VkCommandPoolCreateFlags commandPoolCreateFlags) + : CommandBufferBareTestEnvironment<1> (context, commandPoolCreateFlags) +{ + { + const VkAttachmentDescription colorAttDesc = + { + 0u, // VkAttachmentDescriptionFlags flags; + DEFAULT_IMAGE_FORMAT, // VkFormat format; + VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; + VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; + VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; + VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; + VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; + }; + + const VkAttachmentDescription attachments[1] = + { + colorAttDesc + }; + + const VkAttachmentReference colorAttRef = + { + 0u, // deUint32 attachment; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; + }; + + const VkSubpassDescription subpassDesc[1] = + { + { + 0u, // VkSubpassDescriptionFlags flags; + VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; + 0u, // deUint32 inputAttachmentCount; + DE_NULL, // const VkAttachmentReference* pInputAttachments; + 1u, // deUint32 colorAttachmentCount; + &colorAttRef, // const VkAttachmentReference* pColorAttachments; + DE_NULL, // const VkAttachmentReference* pResolveAttachments; + DE_NULL, // const VkAttachmentReference* depthStencilAttachment; + 0u, // deUint32 preserveAttachmentCount; + DE_NULL, // const VkAttachmentReference* pPreserveAttachments; + } + }; + + const VkRenderPassCreateInfo renderPassCreateInfo = + { + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // VkRenderPassCreateFlags flags; + 1u, // deUint32 attachmentCount; + attachments, // const VkAttachmentDescription* pAttachments; + 1u, // deUint32 subpassCount; + subpassDesc, // const VkSubpassDescription* pSubpasses; + 0u, // deUint32 dependencyCount; + DE_NULL, // const VkSubpassDependency* pDependencies; + }; + + m_renderPass = createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL); + } + + { + const VkImageCreateInfo imageCreateInfo = + { + VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // VkImageCreateFlags flags; + DEFAULT_IMAGE_TYPE, // VkImageType imageType; + DEFAULT_IMAGE_FORMAT, // VkFormat format; + DEFAULT_IMAGE_SIZE, // VkExtent3D extent; + 1, // deUint32 mipLevels; + 1, // deUint32 arrayLayers; + VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; + VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage; + VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; + 1, // deUint32 queueFamilyIndexCount; + &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices; + VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; + }; + + m_colorImage = createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL); + } + + m_colorImageMemory = m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, *m_colorImage), MemoryRequirement::Any); + VK_CHECK(m_vkd.bindImageMemory(m_device, *m_colorImage, m_colorImageMemory->getMemory(), m_colorImageMemory->getOffset())); + + { + const VkImageViewCreateInfo imageViewCreateInfo = + { + VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // VkImageViewCreateFlags flags; + *m_colorImage, // VkImage image; + VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; + DEFAULT_IMAGE_FORMAT, // VkFormat format; + { + VK_COMPONENT_SWIZZLE_R, + VK_COMPONENT_SWIZZLE_G, + VK_COMPONENT_SWIZZLE_B, + VK_COMPONENT_SWIZZLE_A + }, // VkComponentMapping components; + { + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; + 0u, // deUint32 baseMipLevel; + 1u, // deUint32 mipLevels; + 0u, // deUint32 baseArrayLayer; + 1u, // deUint32 arraySize; + }, // VkImageSubresourceRange subresourceRange; + }; + + m_colorImageView = createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL); + } + + { + const VkImageView attachmentViews[1] = + { + *m_colorImageView + }; + + const VkFramebufferCreateInfo framebufferCreateInfo = + { + VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // VkFramebufferCreateFlags flags; + *m_renderPass, // VkRenderPass renderPass; + 1, // deUint32 attachmentCount; + attachmentViews, // const VkImageView* pAttachments; + DEFAULT_IMAGE_SIZE.width, // deUint32 width; + DEFAULT_IMAGE_SIZE.height, // deUint32 height; + 1u, // deUint32 layers; + }; + + m_frameBuffer = createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL); + } + + { + const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = + { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + *m_commandPool, // VkCommandPool commandPool; + VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level; + 1u // deUint32 commandBufferCount; + }; + + m_secondaryCommandBuffer = allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo); + + } +} + +void CommandBufferRenderPassTestEnvironment::beginRenderPass(VkSubpassContents content) +{ + const VkClearValue clearValues[1] = + { + makeClearValueColorU32(17, 59, 163, 251), + }; + + const VkRenderPassBeginInfo renderPassBeginInfo = + { + VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + *m_renderPass, // VkRenderPass renderPass; + *m_frameBuffer, // VkFramebuffer framebuffer; + DEFAULT_IMAGE_AREA, // VkRect2D renderArea; + 1u, // deUint32 clearValueCount; + clearValues // const VkClearValue* pClearValues; + }; + + m_vkd.cmdBeginRenderPass(m_primaryCommandBuffers[0], &renderPassBeginInfo, content); +} + +void CommandBufferRenderPassTestEnvironment::beginPrimaryCommandBuffer(VkCommandBufferUsageFlags usageFlags) +{ + const VkCommandBufferBeginInfo commandBufferBeginInfo = + { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + usageFlags, // VkCommandBufferUsageFlags flags; + DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; + }; + + VK_CHECK(m_vkd.beginCommandBuffer(m_primaryCommandBuffers[0], &commandBufferBeginInfo)); + +} + + +void CommandBufferRenderPassTestEnvironment::beginSecondaryCommandBuffer(VkCommandBufferUsageFlags usageFlags) +{ + const VkCommandBufferInheritanceInfo commandBufferInheritanceInfo = + { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + *m_renderPass, // VkRenderPass renderPass; + 0u, // deUint32 subpass; + *m_frameBuffer, // VkFramebuffer framebuffer; + VK_FALSE, // VkBool32 occlusionQueryEnable; + 0u, // VkQueryControlFlags queryFlags; + 0u // VkQueryPipelineStatisticFlags pipelineStatistics; + }; + + const VkCommandBufferBeginInfo commandBufferBeginInfo = + { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + usageFlags, // VkCommandBufferUsageFlags flags; + &commandBufferInheritanceInfo // const VkCommandBufferInheritanceInfo* pInheritanceInfo; + }; + + VK_CHECK(m_vkd.beginCommandBuffer(*m_secondaryCommandBuffer, &commandBufferBeginInfo)); + +} + +void CommandBufferRenderPassTestEnvironment::submitPrimaryCommandBuffer(void) +{ + + const VkFenceCreateInfo fenceCreateInfo = + { + VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u // VkFenceCreateFlags flags; + }; + + const Unique<VkFence> fence (createFence(m_vkd, m_device, &fenceCreateInfo)); + + + const VkSubmitInfo submitInfo = + { + VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // deUint32 waitSemaphoreCount; + DE_NULL, // const VkSemaphore* pWaitSemaphores; + DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask; + 1u, // deUint32 commandBufferCount; + m_primaryCommandBuffers, // const VkCommandBuffer* pCommandBuffers; + 0u, // deUint32 signalSemaphoreCount; + DE_NULL // const VkSemaphore* pSignalSemaphores; + }; + + VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence)); + + VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull)); + +} + +de::MovePtr<tcu::TextureLevel> CommandBufferRenderPassTestEnvironment::readColorAttachment () +{ + Move<VkBuffer> buffer; + de::MovePtr<Allocation> bufferAlloc; + const tcu::TextureFormat tcuFormat = mapVkFormat(DEFAULT_IMAGE_FORMAT); + const VkDeviceSize pixelDataSize = DEFAULT_IMAGE_SIZE.height * DEFAULT_IMAGE_SIZE.height * tcuFormat.getPixelSize(); + de::MovePtr<tcu::TextureLevel> resultLevel (new tcu::TextureLevel(tcuFormat, DEFAULT_IMAGE_SIZE.width, DEFAULT_IMAGE_SIZE.height)); + + // Create destination buffer + { + const VkBufferCreateInfo bufferParams = + { + VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + 0u, // VkBufferCreateFlags flags; + pixelDataSize, // VkDeviceSize size; + VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage; + VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; + 0u, // deUint32 queueFamilyIndexCount; + DE_NULL // const deUint32* pQueueFamilyIndices; + }; + + buffer = createBuffer(m_vkd, m_device, &bufferParams); + bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible); + VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset())); + } + + // Barriers for copying image to buffer + + const VkImageMemoryBarrier imageBarrier = + { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; + VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout; + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout; + VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; + *m_colorImage, // VkImage image; + { // VkImageSubresourceRange subresourceRange; + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; + 0u, // deUint32 baseMipLevel; + 1u, // deUint32 mipLevels; + 0u, // deUint32 baseArraySlice; + 1u // deUint32 arraySize; + } + }; + + const VkBufferMemoryBarrier bufferBarrier = + { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask; + VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask; + VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; + *buffer, // VkBuffer buffer; + 0u, // VkDeviceSize offset; + pixelDataSize // VkDeviceSize size; + }; + + // Copy image to buffer + + const VkBufferImageCopy copyRegion = + { + 0u, // VkDeviceSize bufferOffset; + DEFAULT_IMAGE_SIZE.width, // deUint32 bufferRowLength; + DEFAULT_IMAGE_SIZE.height, // deUint32 bufferImageHeight; + { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource; + { 0, 0, 0 }, // VkOffset3D imageOffset; + DEFAULT_IMAGE_SIZE // VkExtent3D imageExtent; + }; + + beginPrimaryCommandBuffer(0); + 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); + m_vkd.cmdCopyImageToBuffer(m_primaryCommandBuffers[0], *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region); + 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); + VK_CHECK(m_vkd.endCommandBuffer(m_primaryCommandBuffers[0])); + + submitPrimaryCommandBuffer(); + + // Read buffer data + invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize); + tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr())); + + return resultLevel; +} + + // Testcases -/********* 19.1. Command Pools (6.1 in VK 1.0 Spec) ***************************/ +/********* 19.1. Command Pools (5.1 in VK 1.0 Spec) ***************************/ tcu::TestStatus createPoolNullParamsTest(Context& context) { const VkDevice vkDevice = context.getDevice(); @@ -179,7 +620,7 @@ tcu::TestStatus resetPoolNoFlagsTest(Context& context) return tcu::TestStatus::pass("Command Pool allocated correctly."); } -/******** 19.2. Command Buffer Lifetime (6.2 in VK 1.0 Spec) ******************/ +/******** 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) ******************/ tcu::TestStatus allocatePrimaryBufferTest(Context& context) { const VkDevice vkDevice = context.getDevice(); @@ -700,7 +1141,7 @@ tcu::TestStatus resetBufferImplicitlyTest(Context& context) return tcu::TestStatus::fail("Buffer was not reset correctly."); } -/******** 19.3. Command Buffer Recording (6.3 in VK 1.0 Spec) *****************/ +/******** 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) *****************/ tcu::TestStatus recordSinglePrimaryBufferTest(Context& context) { const VkDevice vkDevice = context.getDevice(); @@ -1631,6 +2072,60 @@ tcu::TestStatus oneTimeSubmitFlagSecondaryBufferTest(Context& context) return tcu::TestStatus::pass("oneTimeSubmitFlagSecondaryBufferTest succeeded"); } +tcu::TestStatus renderPassContinueTest(Context& context) +{ + const DeviceInterface& vkd = context.getDeviceInterface(); + CommandBufferRenderPassTestEnvironment env (context, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + + VkCommandBuffer primaryCommandBuffer = env.getPrimaryCommandBuffer(); + VkCommandBuffer secondaryCommandBuffer = env.getSecondaryCommandBuffer(); + const deUint32 clearColor[4] = { 2, 47, 131, 211 }; + + const VkClearAttachment clearAttachment = + { + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; + 0, // deUint32 colorAttachment; + makeClearValueColorU32(clearColor[0], + clearColor[1], + clearColor[2], + clearColor[3]) // VkClearValue clearValue; + }; + + const VkClearRect clearRect = + { + CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_AREA, // VkRect2D rect; + 0u, // deUint32 baseArrayLayer; + 1u // deUint32 layerCount; + }; + + env.beginSecondaryCommandBuffer(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT); + vkd.cmdClearAttachments(secondaryCommandBuffer, 1, &clearAttachment, 1, &clearRect); + VK_CHECK(vkd.endCommandBuffer(secondaryCommandBuffer)); + + + env.beginPrimaryCommandBuffer(0); + env.beginRenderPass(VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS); + vkd.cmdExecuteCommands(primaryCommandBuffer, 1, &secondaryCommandBuffer); + vkd.cmdEndRenderPass(primaryCommandBuffer); + + VK_CHECK(vkd.endCommandBuffer(primaryCommandBuffer)); + + env.submitPrimaryCommandBuffer(); + + de::MovePtr<tcu::TextureLevel> result = env.readColorAttachment(); + tcu::PixelBufferAccess pixelBufferAccess = result->getAccess(); + + for (deUint32 i = 0; i < (CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.width * CommandBufferRenderPassTestEnvironment::DEFAULT_IMAGE_SIZE.height); ++i) + { + deUint8* colorData = reinterpret_cast<deUint8*>(pixelBufferAccess.getDataPtr()); + for (int colorComponent = 0; colorComponent < 4; ++colorComponent) + if (colorData[i * 4 + colorComponent] != clearColor[colorComponent]) + return tcu::TestStatus::fail("clear value mismatch"); + } + + return tcu::TestStatus::pass("render pass continue test passed"); +} + tcu::TestStatus simultaneousUsePrimaryBufferTest(Context& context) { @@ -1905,6 +2400,9 @@ tcu::TestStatus recordBufferQueryPreciseWithFlagTest(Context& context) const DeviceInterface& vk = context.getDeviceInterface(); const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); + if (!context.getDeviceFeatures().inheritedQueries) + TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); + const VkCommandPoolCreateInfo cmdPoolParams = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; @@ -1998,6 +2496,9 @@ tcu::TestStatus recordBufferQueryImpreciseWithFlagTest(Context& context) const DeviceInterface& vk = context.getDeviceInterface(); const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); + if (!context.getDeviceFeatures().inheritedQueries) + TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); + const VkCommandPoolCreateInfo cmdPoolParams = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; @@ -2091,6 +2592,9 @@ tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context) const DeviceInterface& vk = context.getDeviceInterface(); const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); + if (!context.getDeviceFeatures().inheritedQueries) + TCU_THROW(NotSupportedError, "Inherited queries feature is not supported"); + const VkCommandPoolCreateInfo cmdPoolParams = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType; @@ -2178,7 +2682,7 @@ tcu::TestStatus recordBufferQueryImpreciseWithoutFlagTest(Context& context) return tcu::TestStatus::pass("Successfully recorded a secondary command buffer allowing a precise occlusion query."); } -/******** 19.4. Command Buffer Submission (6.4 in VK 1.0 Spec) ****************/ +/******** 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) ****************/ tcu::TestStatus submitBufferCountNonZero(Context& context) { const VkDevice vkDevice = context.getDevice(); @@ -2441,12 +2945,7 @@ tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType DE_NULL, // pNext 0, // flags - (VkRenderPass)0u, // renderPass - 0u, // subpass - (VkFramebuffer)0u, // framebuffer - VK_FALSE, // occlusionQueryEnable - (VkQueryControlFlags)0u, // queryFlags - (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics + DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; }; // Fill create info struct for event @@ -2505,7 +3004,7 @@ tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) 0, // flags; }; - const Unique <VkSemaphore> semaphore (createSemaphore(vk, vkDevice, &semaphoreCreateInfo)); + const Unique <VkSemaphore> semaphore (createSemaphore(vk, vkDevice, &semaphoreCreateInfo)); // create submit info for first buffer - signalling semaphore const VkSubmitInfo submitInfo1 = @@ -2514,9 +3013,7 @@ tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) DE_NULL, // pNext 0u, // waitSemaphoreCount DE_NULL, // pWaitSemaphores - // TODO: The following field is in api spec 1.0 37bedec32143807010323f126ad685ab5e9d98de - // TODO: but not in the header Loader and Tools 69d4893b673bd552e445ba999ad0e73463d35007 - // DE_NULL, // pWaitDstStageMask + DE_NULL, // pWaitDstStageMask 1, // commandBufferCount &primCmdBuf1.get(), // pCommandBuffers 1u, // signalSemaphoreCount @@ -2534,6 +3031,8 @@ tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) if (result != VK_EVENT_SET) return tcu::TestStatus::fail("Submit Buffer and Wait for Single Semaphore Test FAILED"); + const VkPipelineStageFlags waitDstStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + // create submit info for second buffer - waiting for semaphore const VkSubmitInfo submitInfo2 = { @@ -2541,9 +3040,7 @@ tcu::TestStatus submitBufferWaitSingleSemaphore(Context& context) DE_NULL, // pNext 1u, // waitSemaphoreCount &semaphore.get(), // pWaitSemaphores - // TODO: The following field is in api spec 1.0 37bedec32143807010323f126ad685ab5e9d98de - // TODO: but not in the header Loader and Tools 69d4893b673bd552e445ba999ad0e73463d35007 - // DE_NULL, // pWaitDstStageMask + &waitDstStageFlags, // pWaitDstStageMask 1, // commandBufferCount &primCmdBuf2.get(), // pCommandBuffers 0u, // signalSemaphoreCount @@ -2573,8 +3070,8 @@ tcu::TestStatus submitBufferWaitManySemaphores(Context& context) // This test will create numSemaphores semaphores, and signal them in NUM_SEMAPHORES submits to queue // After that the numSubmissions queue submissions will wait for each semaphore - const deUint32 numSemaphores = 10u; - const deUint32 numSubmissions = 10u; + const deUint32 numSemaphores = 10u; // it must be multiply of numSubmission + const deUint32 numSubmissions = 2u; const VkDevice vkDevice = context.getDevice(); const DeviceInterface& vk = context.getDeviceInterface(); const VkQueue queue = context.getUniversalQueue(); @@ -2607,12 +3104,7 @@ tcu::TestStatus submitBufferWaitManySemaphores(Context& context) VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // sType DE_NULL, // pNext 0, // flags - (VkRenderPass)0u, // renderPass - 0u, // subpass - (VkFramebuffer)0u, // framebuffer - VK_FALSE, // occlusionQueryEnable - (VkQueryControlFlags)0u, // queryFlags - (VkQueryPipelineStatisticFlags)0u, // pipelineStatistics + DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo; }; // Fill create info struct for event @@ -2653,6 +3145,7 @@ tcu::TestStatus submitBufferWaitManySemaphores(Context& context) // numSemaphores is declared const, so this array can be static // the semaphores will be destroyed automatically at end of scope Move <VkSemaphore> semaphoreArray[numSemaphores]; + VkSemaphore semaphores[numSemaphores]; // prepare create info for semaphores - same for all const VkSemaphoreCreateInfo semaphoreCreateInfo = @@ -2663,26 +3156,25 @@ tcu::TestStatus submitBufferWaitManySemaphores(Context& context) }; for (deUint32 idx = 0; idx < numSemaphores; ++idx) { - // create semaphores for use in this test semaphoreArray[idx] = createSemaphore(vk, vkDevice, &semaphoreCreateInfo); + semaphores[idx] = semaphoreArray[idx].get(); + }; - // create submit info for buffer - signal semaphore + { + // create submit info for buffer - signal semaphores const VkSubmitInfo submitInfo1 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType DE_NULL, // pNext 0u, // waitSemaphoreCount DE_NULL, // pWaitSemaphores - // TODO: The following field is in api spec 1.0 37bedec32143807010323f126ad685ab5e9d98de - // TODO: but not in the header Loader and Tools 69d4893b673bd552e445ba999ad0e73463d35007 - // DE_NULL, // pWaitDstStageMask + DE_NULL, // pWaitDstStageMask 1, // commandBufferCount &primCmdBuf.get(), // pCommandBuffers - 1u, // signalSemaphoreCount - &semaphoreArray[idx].get(), // pSignalSemaphores + numSemaphores, // signalSemaphoreCount + semaphores // pSignalSemaphores }; - // Submit the command buffer to the queue VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo1, *fence)); @@ -2699,47 +3191,46 @@ tcu::TestStatus submitBufferWaitManySemaphores(Context& context) // reset fence, so it can be used again VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); - }; + } + + const deUint32 numberOfSemaphoresToBeWaitedByOneSubmission = numSemaphores / numSubmissions; + const std::vector<VkPipelineStageFlags> waitDstStageFlags (numberOfSemaphoresToBeWaitedByOneSubmission, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT); // the following code waits for the semaphores set above - numSubmissions queues will wait for each semaphore from above - for (deUint32 idxSemaphore = 0; idxSemaphore < numSemaphores; ++idxSemaphore) { - for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) { + for (deUint32 idxSubmission = 0; idxSubmission < numSubmissions; ++idxSubmission) { - // create submit info for buffer - waiting for semaphore - const VkSubmitInfo submitInfo2 = - { - VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType - DE_NULL, // pNext - 1u, // waitSemaphoreCount - &semaphoreArray[idxSemaphore].get(), // pWaitSemaphores - // TODO: The following field is in api spec 1.0 37bedec32143807010323f126ad685ab5e9d98de - // TODO: but not in the header Loader and Tools 69d4893b673bd552e445ba999ad0e73463d35007 - // DE_NULL, // pWaitDstStageMask - 1, // commandBufferCount - &primCmdBuf.get(), // pCommandBuffers - 0u, // signalSemaphoreCount - DE_NULL, // pSignalSemaphores - }; - - // Submit the second command buffer to the queue - VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); - - // wait for end of execution of queue - VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, INFINITE_TIMEOUT)); - - // check if second buffer has been executed - // if it has been executed, it means that the semaphore was signalled - so test if passed - VkResult result = vk.getEventStatus(vkDevice,*event); - if (result != VK_EVENT_SET) - return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED"); - - // reset fence, so it can be used again - VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); - - // reset event, so next buffers can set it again - VK_CHECK(vk.resetEvent(vkDevice, *event)); + // create submit info for buffer - waiting for semaphore + const VkSubmitInfo submitInfo2 = + { + VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType + DE_NULL, // pNext + numberOfSemaphoresToBeWaitedByOneSubmission, // waitSemaphoreCount + semaphores + (numberOfSemaphoresToBeWaitedByOneSubmission * idxSubmission), // pWaitSemaphores + waitDstStageFlags.data(), // pWaitDstStageMask + 1, // commandBufferCount + &primCmdBuf.get(), // pCommandBuffers + 0u, // signalSemaphoreCount + DE_NULL, // pSignalSemaphores }; - }; + + // Submit the second command buffer to the queue + VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo2, *fence)); + + // wait for 1 second. + VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), 0u, 1000 * 1000 * 1000)); + + // check if second buffer has been executed + // if it has been executed, it means that the semaphore was signalled - so test if passed + VkResult result = vk.getEventStatus(vkDevice,*event); + if (result != VK_EVENT_SET) + return tcu::TestStatus::fail("Submit Buffer and Wait for Many Semaphores Test FAILED"); + + // reset fence, so it can be used again + VK_CHECK(vk.resetFences(vkDevice, 1u, &fence.get())); + + // reset event, so next buffers can set it again + VK_CHECK(vk.resetEvent(vkDevice, *event)); + } return tcu::TestStatus::pass("Submit Buffer and Wait for Many Semaphores Test succeeded"); } @@ -2858,7 +3349,7 @@ tcu::TestStatus submitBufferNullFence(Context& context) return testResult; } -/******** 19.5. Secondary Command Buffer Execution (6.6 in VK 1.0 Spec) *******/ +/******** 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) *******/ tcu::TestStatus executeSecondaryBufferTest(Context& context) { const VkDevice vkDevice = context.getDevice(); @@ -3168,7 +3659,7 @@ tcu::TestStatus executeSecondaryBufferTwiceTest(Context& context) return tcu::TestStatus::pass("executeSecondaryBufferTwiceTest succeeded"); } -/******** 19.6. Commands Allowed Inside Command Buffers (6.7 in VK 1.0 Spec) **/ +/******** 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) **/ tcu::TestStatus orderBindPipelineTest(Context& context) { const DeviceInterface& vk = context.getDeviceInterface(); @@ -3497,14 +3988,14 @@ tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx) { de::MovePtr<tcu::TestCaseGroup> commandBuffersTests (new tcu::TestCaseGroup(testCtx, "command_buffers", "Command Buffers Tests")); - /* 19.1. Command Pools (6.1 in VK 1.0 Spec) */ + /* 19.1. Command Pools (5.1 in VK 1.0 Spec) */ addFunctionCase (commandBuffersTests.get(), "pool_create_null_params", "", createPoolNullParamsTest); addFunctionCase (commandBuffersTests.get(), "pool_create_non_null_allocator", "", createPoolNonNullAllocatorTest); addFunctionCase (commandBuffersTests.get(), "pool_create_transient_bit", "", createPoolTransientBitTest); addFunctionCase (commandBuffersTests.get(), "pool_create_reset_bit", "", createPoolResetBitTest); addFunctionCase (commandBuffersTests.get(), "pool_reset_release_res", "", resetPoolReleaseResourcesBitTest); addFunctionCase (commandBuffersTests.get(), "pool_reset_no_flags_res", "", resetPoolNoFlagsTest); - /* 19.2. Command Buffer Lifetime (6.2 in VK 1.0 Spec) */ + /* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */ addFunctionCase (commandBuffersTests.get(), "allocate_single_primary", "", allocatePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "allocate_many_primary", "", allocateManyPrimaryBuffersTest); addFunctionCase (commandBuffersTests.get(), "allocate_zero_primary", "", allocateZeroPrimaryBuffersTest); @@ -3514,7 +4005,7 @@ tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx) addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", executePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", executeLargePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", resetBufferImplicitlyTest); - /* 19.3. Command Buffer Recording (6.3 in VK 1.0 Spec) */ + /* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */ addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", recordSinglePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", recordLargePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", recordSingleSecondaryBufferTest); @@ -3523,21 +4014,22 @@ tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx) addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", submitSecondaryBufferTwiceTest); addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", oneTimeSubmitFlagPrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", oneTimeSubmitFlagSecondaryBufferTest); + addFunctionCase (commandBuffersTests.get(), "render_pass_continue", "", renderPassContinueTest); addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", simultaneousUsePrimaryBufferTest); addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", simultaneousUseSecondaryBufferTest); addFunctionCase (commandBuffersTests.get(), "record_query_precise_w_flag", "", recordBufferQueryPreciseWithFlagTest); addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_w_flag", "", recordBufferQueryImpreciseWithFlagTest); addFunctionCase (commandBuffersTests.get(), "record_query_imprecise_wo_flag", "", recordBufferQueryImpreciseWithoutFlagTest); - /* 19.4. Command Buffer Submission (6.4 in VK 1.0 Spec) */ + /* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */ addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", submitBufferCountNonZero); addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", submitBufferCountEqualZero); addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", submitBufferWaitSingleSemaphore); - addFunctionCase (commandBuffersTests.get(), "submit_wait_many_sepaphores", "", submitBufferWaitManySemaphores); + addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", submitBufferWaitManySemaphores); addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", submitBufferNullFence); - /* 19.5. Secondary Command Buffer Execution (6.6 in VK 1.0 Spec) */ + /* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */ addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", executeSecondaryBufferTest); addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", executeSecondaryBufferTwiceTest); - /* 19.6. Commands Allowed Inside Command Buffers (6.7 in VK 1.0 Spec) */ + /* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */ addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline", "", genComputeSource, orderBindPipelineTest); return commandBuffersTests.release(); |