/*------------------------------------------------------------------------ * Vulkan Conformance Tests * ------------------------ * * Copyright (c) 2017 The Khronos Group Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Vulkan Multi View Render Util *//*--------------------------------------------------------------------*/ #include "vktMultiViewRenderUtil.hpp" #include "vktMultiViewRenderPassUtil.hpp" #include "vktTestCase.hpp" #include "vkBuilderUtil.hpp" #include "vkRefUtil.hpp" #include "vkQueryUtil.hpp" #include "vkTypeUtil.hpp" #include "vkPrograms.hpp" #include "vkPlatform.hpp" #include "vkMemUtil.hpp" #include "vkImageUtil.hpp" #include "tcuTestLog.hpp" #include "tcuResource.hpp" #include "tcuImageCompare.hpp" #include "tcuCommandLine.hpp" #include "tcuTextureUtil.hpp" #include "tcuRGBA.hpp" namespace vkt { namespace MultiView { using namespace vk; using de::MovePtr; using de::UniquePtr; using std::vector; VkImageAspectFlags getAspectFlags (tcu::TextureFormat format) { VkImageAspectFlags aspectFlag = 0; aspectFlag |= (tcu::hasDepthComponent(format.order)? VK_IMAGE_ASPECT_DEPTH_BIT : 0); aspectFlag |= (tcu::hasStencilComponent(format.order)? VK_IMAGE_ASPECT_STENCIL_BIT : 0); if (!aspectFlag) aspectFlag = VK_IMAGE_ASPECT_COLOR_BIT; return aspectFlag; } VkFormat getStencilBufferFormat (const vk::VkFormat depthStencilImageFormat) { const tcu::TextureFormat tcuFormat = mapVkFormat(depthStencilImageFormat); const VkFormat result = (tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS) ? VK_FORMAT_S8_UINT : VK_FORMAT_UNDEFINED; DE_ASSERT(result != VK_FORMAT_UNDEFINED); return result; } VkFormat getDepthBufferFormat (const vk::VkFormat depthStencilImageFormat) { VkFormat result = VK_FORMAT_UNDEFINED; switch (depthStencilImageFormat) { case VK_FORMAT_D16_UNORM: case VK_FORMAT_D16_UNORM_S8_UINT: { result = VK_FORMAT_D16_UNORM; break; } case VK_FORMAT_D32_SFLOAT: case VK_FORMAT_D32_SFLOAT_S8_UINT: { result = VK_FORMAT_D32_SFLOAT; break; } case VK_FORMAT_X8_D24_UNORM_PACK32: case VK_FORMAT_D24_UNORM_S8_UINT: { result = VK_FORMAT_D24_UNORM_S8_UINT; break; } default: result = VK_FORMAT_UNDEFINED; } DE_ASSERT(result != VK_FORMAT_UNDEFINED); return result; } VkImageCreateInfo makeImageCreateInfo (const VkImageType imageType, const VkExtent3D& extent, const VkFormat format, const VkImageUsageFlags usage, const VkSampleCountFlagBits samples) { const VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; DE_NULL, // const void* pNext; (VkImageCreateFlags)0, // VkImageCreateFlags flags; imageType, // VkImageType imageType; format, // VkFormat format; {extent.width, extent.height, 1u}, // VkExtent3D extent; 1u, // uint32_t mipLevels; extent.depth, // uint32_t arrayLayers; samples, // VkSampleCountFlagBits samples; VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; usage, // VkImageUsageFlags usage; VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 0u, // uint32_t queueFamilyIndexCount; DE_NULL, // const uint32_t* pQueueFamilyIndices; VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; }; return imageInfo; } Move makeDescriptorSetLayout (const DeviceInterface& vk, const VkDevice device) { const VkDescriptorSetLayoutBinding binding = { 0u, //deUint32 binding; vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, //VkDescriptorType descriptorType; 1u, //deUint32 descriptorCount; vk::VK_SHADER_STAGE_FRAGMENT_BIT, //VkShaderStageFlags stageFlags; DE_NULL //const VkSampler* pImmutableSamplers; }; const VkDescriptorSetLayoutCreateInfo createInfo = { vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, //VkStructureType sType; DE_NULL, //const void* pNext; 0u, //VkDescriptorSetLayoutCreateFlags flags; 1u, //deUint32 bindingCount; &binding //const VkDescriptorSetLayoutBinding* pBindings; }; return vk::createDescriptorSetLayout(vk, device, &createInfo); } template Move makeRenderPass (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkSampleCountFlagBits samples, const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat) { const bool dsAttacmentAvailable = (dsFormat != vk::VK_FORMAT_UNDEFINED); const deUint32 subpassCount = static_cast(viewMasks.size()); const AttachmentDesc colorAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags; colorFormat, // VkFormat format; || VkFormat format; samples, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples; colorLoadOp, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp; VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout; ); const AttachmentRef colorAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; 0u, // deUint32 attachment; || deUint32 attachment; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; || VkImageLayout layout; 0u // || VkImageAspectFlags aspectMask; ); const AttachmentDesc dsAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags; dsFormat, // VkFormat format; || VkFormat format; samples, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples; VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp; VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp; VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout; VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout; ); const AttachmentRef depthAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; dsAttacmentAvailable ? 1u : VK_ATTACHMENT_UNUSED, // deUint32 attachment; || deUint32 attachment; dsAttacmentAvailable ? // VkImageLayout layout; || VkImageLayout layout; VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED, 0u // || VkImageAspectFlags aspectMask; ); const AttachmentDesc attachmentDescriptions[] = { colorAttachmentDescription, dsAttachmentDescription, }; DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) || (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2))); vector subpassDescriptions; for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx) { const deUint32 viewMask = (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)) ? viewMasks[subpassNdx] : 0u; const SubpassDesc subpassDescription // VkSubpassDescription || VkSubpassDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; || VkSubpassDescriptionFlags flags; VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; || VkPipelineBindPoint pipelineBindPoint; viewMask, // || deUint32 viewMask; 0u, // deUint32 inputAttachmentCount; || deUint32 inputAttachmentCount; DE_NULL, // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2KHR* pInputAttachments; 1u, // deUint32 colorAttachmentCount; || deUint32 colorAttachmentCount; &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2KHR* pColorAttachments; DE_NULL, // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2KHR* pResolveAttachments; &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2KHR* pDepthStencilAttachment; 0u, // deUint32 preserveAttachmentCount; || deUint32 preserveAttachmentCount; DE_NULL // const deUint32* pPreserveAttachments; || const deUint32* pPreserveAttachments; ); subpassDescriptions.push_back(subpassDescription); } const VkRenderPassMultiviewCreateInfo renderPassMultiviewInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR, // VkStructureType sType; DE_NULL, // const void* pNext; subpassCount, // uint32_t subpassCount; &viewMasks[0], // const uint32_t* pViewMasks; 0u, // uint32_t dependencyCount; DE_NULL, // const int32_t* pViewOffsets; 0u, // uint32_t correlationMaskCount; DE_NULL, // const uint32_t* pCorrelationMasks; }; const VkRenderPassMultiviewCreateInfo* renderPassMultiviewInfoPtr = (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) ? &renderPassMultiviewInfo : DE_NULL; const VkPipelineStageFlags srcStageMask = dsAttacmentAvailable ? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT : VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; const VkAccessFlags srcAccessMask = dsAttacmentAvailable ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; vector subpassDependencies; for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx) { const SubpassDep subpassDependency // VkSubpassDependency || VkSubpassDependency2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; subpassNdx, // deUint32 srcSubpass; || deUint32 srcSubpass; (subpassNdx == subpassCount -1u) ? subpassNdx : subpassNdx+1u, // deUint32 dstSubpass; || deUint32 dstSubpass; srcStageMask, // VkPipelineStageFlags srcStageMask; || VkPipelineStageFlags srcStageMask; VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask; || VkPipelineStageFlags dstStageMask; srcAccessMask, // VkAccessFlags srcAccessMask; || VkAccessFlags srcAccessMask; VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask; || VkAccessFlags dstAccessMask; VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR, // VkDependencyFlags dependencyFlags; || VkDependencyFlags dependencyFlags; 0 // || deInt32 viewOffset; ); subpassDependencies.push_back(subpassDependency); } const RenderPassCreateInfo renderPassInfo // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR ( // VkStructureType sType; || VkStructureType sType; renderPassMultiviewInfoPtr, // const void* pNext; || const void* pNext; (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags; dsAttacmentAvailable ? 2u : 1u, // deUint32 attachmentCount; || deUint32 attachmentCount; attachmentDescriptions, // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2KHR* pAttachments; subpassCount, // deUint32 subpassCount; || deUint32 subpassCount; &subpassDescriptions[0], // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2KHR* pSubpasses; subpassCount, // deUint32 dependencyCount; || deUint32 dependencyCount; &subpassDependencies[0], // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2KHR* pDependencies; 0u, // || deUint32 correlatedViewMaskCount; DE_NULL // || const deUint32* pCorrelatedViewMasks; ); return renderPassInfo.createRenderPass(vk, device); } // Instantiate function for legacy renderpass structures template Move makeRenderPass (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkSampleCountFlagBits samples, const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat); // Instantiate function for renderpass2 structures template Move makeRenderPass (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkSampleCountFlagBits samples, const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat); template Move makeRenderPassWithDepth (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkFormat dsFormat) { return makeRenderPass(vk, device, colorFormat, viewMasks, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR, dsFormat); } // Instantiate function for legacy renderpass structures template Move makeRenderPassWithDepth (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkFormat dsFormat); // Instantiate function for renderpass2 structures template Move makeRenderPassWithDepth (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, const VkFormat dsFormat); template Move makeRenderPassWithAttachments (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, bool useAspects) { const deUint32 subpassCount = static_cast(viewMasks.size()); const AttachmentDesc colorAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags; colorFormat, // VkFormat format; || VkFormat format; VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples; VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp; VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout; ); const AttachmentDesc inputAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags; colorFormat, // VkFormat format; || VkFormat format; VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples; VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp; VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp; VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout; VK_IMAGE_LAYOUT_GENERAL // VkImageLayout finalLayout; || VkImageLayout finalLayout; ); vector attachments; attachments.push_back(colorAttachmentDescription); attachments.push_back(inputAttachmentDescription); const AttachmentRef colorAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; 0u, // deUint32 attachment; || deUint32 attachment; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; || VkImageLayout layout; 0u // || VkImageAspectFlags aspectMask; ); const AttachmentRef inputAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; 1u, // deUint32 attachment; || deUint32 attachment; VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout layout; || VkImageLayout layout; useAspects ? VK_IMAGE_ASPECT_COLOR_BIT : static_cast(0u) // || VkImageAspectFlags aspectMask; ); const AttachmentRef depthAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; VK_ATTACHMENT_UNUSED, // deUint32 attachment; || deUint32 attachment; VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout layout; || VkImageLayout layout; 0u // || VkImageAspectFlags aspectMask; ); DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) || (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2))); vector subpassDescriptions; for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx) { const deUint32 viewMask = (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)) ? viewMasks[subpassNdx] : 0u; const SubpassDesc subpassDescription // VkSubpassDescription || VkSubpassDescription2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; || VkSubpassDescriptionFlags flags; VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; || VkPipelineBindPoint pipelineBindPoint; viewMask, // || deUint32 viewMask; 1u, // deUint32 inputAttachmentCount; || deUint32 inputAttachmentCount; &inputAttachmentReference, // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2KHR* pInputAttachments; 1u, // deUint32 colorAttachmentCount; || deUint32 colorAttachmentCount; &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2KHR* pColorAttachments; DE_NULL, // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2KHR* pResolveAttachments; &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2KHR* pDepthStencilAttachment; 0u, // deUint32 preserveAttachmentCount; || deUint32 preserveAttachmentCount; DE_NULL // const deUint32* pPreserveAttachments; || const deUint32* pPreserveAttachments; ); subpassDescriptions.push_back(subpassDescription); } const VkRenderPassMultiviewCreateInfo renderPassMultiviewInfo = { VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR, //VkStructureType sType; DE_NULL, //const void* pNext; subpassCount, //uint32_t subpassCount; &viewMasks[0], //const uint32_t* pViewMasks; 0u, //uint32_t dependencyCount; DE_NULL, //const int32_t* pViewOffsets; 0u, //uint32_t correlationMaskCount; DE_NULL, //const uint32_t* pCorrelationMasks; }; const VkRenderPassMultiviewCreateInfo* renderPassMultiviewInfoPtr = typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1) ? &renderPassMultiviewInfo : DE_NULL; vector subpassDependencies; for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx) { const SubpassDep subpassDependency // VkSubpassDependency || VkSubpassDependency2KHR ( // || VkStructureType sType; DE_NULL, // || const void* pNext; subpassNdx, // deUint32 srcSubpass; || deUint32 srcSubpass; (subpassNdx == subpassCount -1u) ? subpassNdx : subpassNdx+1u, // deUint32 dstSubpass; || deUint32 dstSubpass; VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask; || VkPipelineStageFlags srcStageMask; VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask; || VkPipelineStageFlags dstStageMask; VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; || VkAccessFlags srcAccessMask; VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask; || VkAccessFlags dstAccessMask; VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR, // VkDependencyFlags dependencyFlags; || VkDependencyFlags dependencyFlags; 0 // || deInt32 viewOffset; ); subpassDependencies.push_back(subpassDependency); } const RenderPassCreateInfo renderPassInfo // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR ( // VkStructureType sType; || VkStructureType sType; renderPassMultiviewInfoPtr, // const void* pNext; || const void* pNext; (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags; 2u, // deUint32 attachmentCount; || deUint32 attachmentCount; &attachments[0], // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2KHR* pAttachments; subpassCount, // deUint32 subpassCount; || deUint32 subpassCount; &subpassDescriptions[0], // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2KHR* pSubpasses; subpassCount, // deUint32 dependencyCount; || deUint32 dependencyCount; &subpassDependencies[0], // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2KHR* pDependencies; 0u, // || deUint32 correlatedViewMaskCount; DE_NULL // || const deUint32* pCorrelatedViewMasks; ); return renderPassInfo.createRenderPass(vk, device); } // Instantiate function for legacy renderpass structures template Move makeRenderPassWithAttachments (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, bool useAspects); // Instantiate function for renderpass2 structures template Move makeRenderPassWithAttachments (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const vector& viewMasks, bool useAspects); void beginSecondaryCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer, const VkRenderPass renderPass, const deUint32 subpass, const VkFramebuffer framebuffer) { const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, //VkStructureType sType; DE_NULL, //const void* pNext; renderPass, //VkRenderPass renderPass; subpass, //deUint32 subpass; framebuffer, //VkFramebuffer framebuffer; VK_FALSE, //VkBool32 occlusionQueryEnable; (VkQueryControlFlags)0u, //VkQueryControlFlags queryFlags; (VkQueryPipelineStatisticFlags)0u, //VkQueryPipelineStatisticFlags pipelineStatistics; }; const VkCommandBufferBeginInfo info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; DE_NULL, // const void* pNext; VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, // VkCommandBufferUsageFlags flags; &secCmdBufInheritInfo, // const VkCommandBufferInheritanceInfo* pInheritanceInfo; }; VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info)); } void imageBarrier (const DeviceInterface& vk, const VkCommandBuffer cmdBuffer, const VkImage image, const VkImageSubresourceRange subresourceRange, const VkImageLayout oldLayout, const VkImageLayout newLayout, const VkAccessFlags srcAccessMask, const VkAccessFlags dstAccessMask, const VkPipelineStageFlags srcStageMask, const VkPipelineStageFlags dstStageMask) { const VkImageMemoryBarrier barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; DE_NULL, // const void* pNext; srcAccessMask, // VkAccessFlags srcAccessMask; dstAccessMask, // VkAccessFlags dstAccessMask; oldLayout, // VkImageLayout oldLayout; newLayout, // VkImageLayout newLayout; VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; image, // VkImage image; subresourceRange, // VkImageSubresourceRange subresourceRange; }; vk.cmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &barrier); } } // MultiView } // vkt