external/vulkancts/modules/vulkan/memory/vktMemoryPipelineBarrierTests.cpp \
external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp \
external/vulkancts/modules/vulkan/memory/vktMemoryTests.cpp \
+ external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderPassUtil.cpp \
external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp \
external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp \
external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp \
dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.masks.15
+dEQP-VK.multiview.renderpass2.masks.8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8
+dEQP-VK.multiview.renderpass2.masks.15_15_15_15
+dEQP-VK.multiview.renderpass2.masks.8_1_1_8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.masks.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments.15
+dEQP-VK.multiview.renderpass2.input_attachments.8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.instanced.15
+dEQP-VK.multiview.renderpass2.instanced.8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8
+dEQP-VK.multiview.renderpass2.instanced.15_15_15_15
+dEQP-VK.multiview.renderpass2.instanced.8_1_1_8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.instanced.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_instance.15
+dEQP-VK.multiview.renderpass2.input_instance.8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_instance.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_instance.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_instance.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.draw_indirect.15
+dEQP-VK.multiview.renderpass2.draw_indirect.8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8
+dEQP-VK.multiview.renderpass2.draw_indirect.15_15_15_15
+dEQP-VK.multiview.renderpass2.draw_indirect.8_1_1_8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.draw_indirect.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.clear_attachments.15
+dEQP-VK.multiview.renderpass2.clear_attachments.8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.clear_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.clear_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.clear_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.vertex_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.fragment_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.geometry_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.max_multi_view_view_count
dEQP-VK.subgroups.builtin_var.subgroupsize_graphic
dEQP-VK.subgroups.builtin_var.subgroupsize_compute
dEQP-VK.subgroups.builtin_var.subgroupsize_vertex_framebuffer
set(DEQP_VK_MULTI_VIEW_SRCS
vktMultiViewTests.hpp
vktMultiViewTests.cpp
+ vktMultiViewRenderPassUtil.hpp
+ vktMultiViewRenderPassUtil.cpp
vktMultiViewRenderTests.hpp
vktMultiViewRenderTests.cpp
vktMultiViewRenderUtil.hpp
--- /dev/null
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 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 RenderPass utils
+ *//*--------------------------------------------------------------------*/
+
+#include "vktMultiViewRenderPassUtil.hpp"
+#include "tcuTestCase.hpp"
+#include "vkRefUtil.hpp"
+
+using namespace vk;
+
+namespace vkt
+{
+namespace MultiView
+{
+
+AttachmentDescription1::AttachmentDescription1 (const void* pNext_,
+ VkAttachmentDescriptionFlags flags_,
+ VkFormat format_,
+ VkSampleCountFlagBits samples_,
+ VkAttachmentLoadOp loadOp_,
+ VkAttachmentStoreOp storeOp_,
+ VkAttachmentLoadOp stencilLoadOp_,
+ VkAttachmentStoreOp stencilStoreOp_,
+ VkImageLayout initialLayout_,
+ VkImageLayout finalLayout_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+
+ // No sType field in this struct
+ DE_UNREF(pNext_);
+ flags = flags_;
+ format = format_;
+ samples = samples_;
+ loadOp = loadOp_;
+ storeOp = storeOp_;
+ stencilLoadOp = stencilLoadOp_;
+ stencilStoreOp = stencilStoreOp_;
+ initialLayout = initialLayout_;
+ finalLayout = finalLayout_;
+}
+
+AttachmentDescription2::AttachmentDescription2 (const void* pNext_,
+ VkAttachmentDescriptionFlags flags_,
+ VkFormat format_,
+ VkSampleCountFlagBits samples_,
+ VkAttachmentLoadOp loadOp_,
+ VkAttachmentStoreOp storeOp_,
+ VkAttachmentLoadOp stencilLoadOp_,
+ VkAttachmentStoreOp stencilStoreOp_,
+ VkImageLayout initialLayout_,
+ VkImageLayout finalLayout_)
+{
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
+ pNext = pNext_;
+ flags = flags_;
+ format = format_;
+ samples = samples_;
+ loadOp = loadOp_;
+ storeOp = storeOp_;
+ stencilLoadOp = stencilLoadOp_;
+ stencilStoreOp = stencilStoreOp_;
+ initialLayout = initialLayout_;
+ finalLayout = finalLayout_;
+}
+
+AttachmentReference1::AttachmentReference1 (const void* pNext_,
+ deUint32 attachment_,
+ VkImageLayout layout_,
+ VkImageAspectFlags aspectMask_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+ DE_ASSERT(aspectMask_ == 0);
+
+ // No sType field in this struct
+ DE_UNREF (pNext_);
+ attachment = attachment_;
+ layout = layout_;
+ DE_UNREF (aspectMask_);
+}
+
+AttachmentReference2::AttachmentReference2 (const void* pNext_,
+ deUint32 attachment_,
+ VkImageLayout layout_,
+ VkImageAspectFlags aspectMask_)
+{
+ sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
+ pNext = pNext_;
+ attachment = attachment_;
+ layout = layout_;
+ aspectMask = aspectMask_;
+}
+
+SubpassDescription1::SubpassDescription1 (const void* pNext_,
+ VkSubpassDescriptionFlags flags_,
+ VkPipelineBindPoint pipelineBindPoint_,
+ deUint32 viewMask_,
+ deUint32 inputAttachmentCount_,
+ const VkAttachmentReference* pInputAttachments_,
+ deUint32 colorAttachmentCount_,
+ const VkAttachmentReference* pColorAttachments_,
+ const VkAttachmentReference* pResolveAttachments_,
+ const VkAttachmentReference* pDepthStencilAttachment_,
+ deUint32 preserveAttachmentCount_,
+ const deUint32* pPreserveAttachments_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+ DE_ASSERT(viewMask_ == 0);
+
+ // No sType field in this struct
+ DE_UNREF (pNext_);
+ flags = flags_;
+ pipelineBindPoint = pipelineBindPoint_;
+ DE_UNREF (viewMask_);
+ inputAttachmentCount = inputAttachmentCount_;
+ pInputAttachments = pInputAttachments_;
+ colorAttachmentCount = colorAttachmentCount_;
+ pColorAttachments = pColorAttachments_;
+ pResolveAttachments = pResolveAttachments_;
+ pDepthStencilAttachment = pDepthStencilAttachment_;
+ preserveAttachmentCount = preserveAttachmentCount_;
+ pPreserveAttachments = pPreserveAttachments_;
+}
+
+SubpassDescription2::SubpassDescription2 (const void* pNext_,
+ VkSubpassDescriptionFlags flags_,
+ VkPipelineBindPoint pipelineBindPoint_,
+ deUint32 viewMask_,
+ deUint32 inputAttachmentCount_,
+ const VkAttachmentReference2KHR* pInputAttachments_,
+ deUint32 colorAttachmentCount_,
+ const VkAttachmentReference2KHR* pColorAttachments_,
+ const VkAttachmentReference2KHR* pResolveAttachments_,
+ const VkAttachmentReference2KHR* pDepthStencilAttachment_,
+ deUint32 preserveAttachmentCount_,
+ const deUint32* pPreserveAttachments_)
+{
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
+ pNext = pNext_;
+ flags = flags_;
+ pipelineBindPoint = pipelineBindPoint_;
+ viewMask = viewMask_;
+ inputAttachmentCount = inputAttachmentCount_;
+ pInputAttachments = pInputAttachments_;
+ colorAttachmentCount = colorAttachmentCount_;
+ pColorAttachments = pColorAttachments_;
+ pResolveAttachments = pResolveAttachments_;
+ pDepthStencilAttachment = pDepthStencilAttachment_;
+ preserveAttachmentCount = preserveAttachmentCount_;
+ pPreserveAttachments = pPreserveAttachments_;
+}
+
+SubpassDependency1::SubpassDependency1 (const void* pNext_,
+ deUint32 srcSubpass_,
+ deUint32 dstSubpass_,
+ VkPipelineStageFlags srcStageMask_,
+ VkPipelineStageFlags dstStageMask_,
+ VkAccessFlags srcAccessMask_,
+ VkAccessFlags dstAccessMask_,
+ VkDependencyFlags dependencyFlags_,
+ deInt32 viewOffset_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+ DE_ASSERT(viewOffset_ == 0);
+
+ // No sType field in this struct
+ DE_UNREF (pNext_);
+ srcSubpass = srcSubpass_;
+ dstSubpass = dstSubpass_;
+ srcStageMask = srcStageMask_;
+ dstStageMask = dstStageMask_;
+ srcAccessMask = srcAccessMask_;
+ dstAccessMask = dstAccessMask_;
+ dependencyFlags = dependencyFlags_;
+ DE_UNREF (viewOffset_);
+}
+
+SubpassDependency2::SubpassDependency2 (const void* pNext_,
+ deUint32 srcSubpass_,
+ deUint32 dstSubpass_,
+ VkPipelineStageFlags srcStageMask_,
+ VkPipelineStageFlags dstStageMask_,
+ VkAccessFlags srcAccessMask_,
+ VkAccessFlags dstAccessMask_,
+ VkDependencyFlags dependencyFlags_,
+ deInt32 viewOffset_)
+{
+ sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
+ pNext = pNext_;
+ srcSubpass = srcSubpass_;
+ dstSubpass = dstSubpass_;
+ srcStageMask = srcStageMask_;
+ dstStageMask = dstStageMask_;
+ srcAccessMask = srcAccessMask_;
+ dstAccessMask = dstAccessMask_;
+ dependencyFlags = dependencyFlags_;
+ viewOffset = viewOffset_;
+}
+
+RenderPassCreateInfo1::RenderPassCreateInfo1 (const void* pNext_,
+ VkRenderPassCreateFlags flags_,
+ deUint32 attachmentCount_,
+ const VkAttachmentDescription* pAttachments_,
+ deUint32 subpassCount_,
+ const VkSubpassDescription* pSubpasses_,
+ deUint32 dependencyCount_,
+ const VkSubpassDependency* pDependencies_,
+ deUint32 correlatedViewMaskCount_,
+ const deUint32* pCorrelatedViewMasks_)
+{
+ DE_ASSERT(correlatedViewMaskCount_ == 0);
+ DE_ASSERT(pCorrelatedViewMasks_ == DE_NULL);
+
+ sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ pNext = pNext_;
+ flags = flags_;
+ attachmentCount = attachmentCount_;
+ pAttachments = pAttachments_;
+ subpassCount = subpassCount_;
+ pSubpasses = pSubpasses_;
+ dependencyCount = dependencyCount_;
+ pDependencies = pDependencies_;
+ DE_UNREF (correlatedViewMaskCount_);
+ DE_UNREF (pCorrelatedViewMasks_);
+}
+
+Move<VkRenderPass> RenderPassCreateInfo1::createRenderPass (const DeviceInterface& vk, VkDevice device) const
+{
+ return vk::createRenderPass(vk, device, this);
+}
+
+RenderPassCreateInfo2::RenderPassCreateInfo2 (const void* pNext_,
+ VkRenderPassCreateFlags flags_,
+ deUint32 attachmentCount_,
+ const VkAttachmentDescription2KHR* pAttachments_,
+ deUint32 subpassCount_,
+ const VkSubpassDescription2KHR* pSubpasses_,
+ deUint32 dependencyCount_,
+ const VkSubpassDependency2KHR* pDependencies_,
+ deUint32 correlatedViewMaskCount_,
+ const deUint32* pCorrelatedViewMasks_)
+{
+ sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
+ pNext = pNext_;
+ flags = flags_;
+ attachmentCount = attachmentCount_;
+ pAttachments = pAttachments_;
+ subpassCount = subpassCount_;
+ pSubpasses = pSubpasses_;
+ dependencyCount = dependencyCount_;
+ pDependencies = pDependencies_;
+ correlatedViewMaskCount = correlatedViewMaskCount_;
+ pCorrelatedViewMasks = pCorrelatedViewMasks_;
+}
+
+Move<VkRenderPass> RenderPassCreateInfo2::createRenderPass (const DeviceInterface& vk, VkDevice device) const
+{
+ return vk::createRenderPass2KHR(vk, device, this);
+}
+
+SubpassBeginInfo1::SubpassBeginInfo1 (const void* pNext_,
+ VkSubpassContents contents_)
+ : contents (contents_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+
+ DE_UNREF(pNext_);
+}
+
+SubpassBeginInfo2::SubpassBeginInfo2 (const void* pNext_,
+ VkSubpassContents contents_)
+{
+ sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
+ pNext = pNext_;
+ contents = contents_;
+}
+
+SubpassEndInfo1::SubpassEndInfo1 (const void* pNext_)
+{
+ DE_ASSERT(pNext_ == DE_NULL);
+
+ DE_UNREF(pNext_);
+}
+
+SubpassEndInfo2::SubpassEndInfo2 (const void* pNext_)
+{
+ sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
+ pNext = pNext_;
+}
+
+void RenderpassSubpass1::cmdBeginRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const SubpassBeginInfo* pSubpassBeginInfo)
+{
+ DE_ASSERT(pSubpassBeginInfo != DE_NULL);
+
+ vk.cmdBeginRenderPass(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo->contents);
+}
+
+void RenderpassSubpass1::cmdNextSubpass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassBeginInfo* pSubpassBeginInfo,
+ const SubpassEndInfo* pSubpassEndInfo)
+{
+ DE_UNREF(pSubpassEndInfo);
+ DE_ASSERT(pSubpassBeginInfo != DE_NULL);
+
+ vk.cmdNextSubpass(cmdBuffer, pSubpassBeginInfo->contents);
+}
+
+void RenderpassSubpass1::cmdEndRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassEndInfo* pSubpassEndInfo)
+{
+ DE_UNREF(pSubpassEndInfo);
+
+ vk.cmdEndRenderPass(cmdBuffer);
+}
+
+void RenderpassSubpass2::cmdBeginRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const SubpassBeginInfo* pSubpassBeginInfo)
+{
+ vk.cmdBeginRenderPass2KHR(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
+}
+
+void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassBeginInfo* pSubpassBeginInfo,
+ const SubpassEndInfo* pSubpassEndInfo)
+{
+ DE_ASSERT(pSubpassBeginInfo != DE_NULL);
+ DE_ASSERT(pSubpassEndInfo != DE_NULL);
+
+ vk.cmdNextSubpass2KHR(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+}
+
+void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassEndInfo* pSubpassEndInfo)
+{
+ DE_ASSERT(pSubpassEndInfo != DE_NULL);
+
+ vk.cmdEndRenderPass2KHR(cmdBuffer, pSubpassEndInfo);
+}
+
+} // renderpass
+
+} // vkt
+
--- /dev/null
+#ifndef _VKTMULTIVIEWRENDERPASSUTIL_HPP
+#define _VKTMULTIVIEWRENDERPASSUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2018 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 RenderPass utils
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vkRef.hpp"
+#include "vkDefs.hpp"
+#include "vkTypeUtil.hpp"
+
+namespace vkt
+{
+namespace MultiView
+{
+using namespace vk;
+
+class AttachmentDescription1 : public vk::VkAttachmentDescription
+{
+public:
+ AttachmentDescription1 (const void* pNext,
+ VkAttachmentDescriptionFlags flags,
+ VkFormat format,
+ VkSampleCountFlagBits samples,
+ VkAttachmentLoadOp loadOp,
+ VkAttachmentStoreOp storeOp,
+ VkAttachmentLoadOp stencilLoadOp,
+ VkAttachmentStoreOp stencilStoreOp,
+ VkImageLayout initialLayout,
+ VkImageLayout finalLayout);
+};
+
+class AttachmentDescription2 : public vk::VkAttachmentDescription2KHR
+{
+public:
+ AttachmentDescription2 (const void* pNext,
+ VkAttachmentDescriptionFlags flags,
+ VkFormat format,
+ VkSampleCountFlagBits samples,
+ VkAttachmentLoadOp loadOp,
+ VkAttachmentStoreOp storeOp,
+ VkAttachmentLoadOp stencilLoadOp,
+ VkAttachmentStoreOp stencilStoreOp,
+ VkImageLayout initialLayout,
+ VkImageLayout finalLayout);
+};
+
+class AttachmentReference1 : public vk::VkAttachmentReference
+{
+public:
+ AttachmentReference1 (const void* pNext,
+ deUint32 attachment,
+ VkImageLayout layout,
+ VkImageAspectFlags aspectMask);
+};
+
+class AttachmentReference2 : public vk::VkAttachmentReference2KHR
+{
+public:
+ AttachmentReference2 (const void* pNext,
+ deUint32 attachment,
+ VkImageLayout layout,
+ VkImageAspectFlags aspectMask);
+};
+
+class SubpassDescription1 : public vk::VkSubpassDescription
+{
+public:
+ SubpassDescription1 (const void* pNext,
+ VkSubpassDescriptionFlags flags,
+ VkPipelineBindPoint pipelineBindPoint,
+ deUint32 viewMask,
+ deUint32 inputAttachmentCount,
+ const VkAttachmentReference* pInputAttachments,
+ deUint32 colorAttachmentCount,
+ const VkAttachmentReference* pColorAttachments,
+ const VkAttachmentReference* pResolveAttachments,
+ const VkAttachmentReference* pDepthStencilAttachment,
+ deUint32 preserveAttachmentCount,
+ const deUint32* pPreserveAttachments);
+};
+
+class SubpassDescription2 : public vk::VkSubpassDescription2KHR
+{
+public:
+ SubpassDescription2 (const void* pNext,
+ VkSubpassDescriptionFlags flags,
+ VkPipelineBindPoint pipelineBindPoint,
+ deUint32 viewMask,
+ deUint32 inputAttachmentCount,
+ const VkAttachmentReference2KHR* pInputAttachments,
+ deUint32 colorAttachmentCount,
+ const VkAttachmentReference2KHR* pColorAttachments,
+ const VkAttachmentReference2KHR* pResolveAttachments,
+ const VkAttachmentReference2KHR* pDepthStencilAttachment,
+ deUint32 preserveAttachmentCount,
+ const deUint32* pPreserveAttachments);
+};
+
+class SubpassDependency1 : public vk::VkSubpassDependency
+{
+public:
+ SubpassDependency1 (const void* pNext,
+ deUint32 srcSubpass,
+ deUint32 dstSubpass,
+ VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ VkAccessFlags srcAccessMask,
+ VkAccessFlags dstAccessMask,
+ VkDependencyFlags dependencyFlags,
+ deInt32 viewOffset);
+};
+
+class SubpassDependency2 : public vk::VkSubpassDependency2KHR
+{
+public:
+ SubpassDependency2 (const void* pNext,
+ deUint32 srcSubpass,
+ deUint32 dstSubpass,
+ VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ VkAccessFlags srcAccessMask,
+ VkAccessFlags dstAccessMask,
+ VkDependencyFlags dependencyFlags,
+ deInt32 viewOffset);
+};
+
+class RenderPassCreateInfo1 : public VkRenderPassCreateInfo
+{
+public:
+ RenderPassCreateInfo1 (const void* pNext,
+ VkRenderPassCreateFlags flags,
+ deUint32 attachmentCount,
+ const VkAttachmentDescription* pAttachments,
+ deUint32 subpassCount,
+ const VkSubpassDescription* pSubpasses,
+ deUint32 dependencyCount,
+ const VkSubpassDependency* pDependencies,
+ deUint32 correlatedViewMaskCount,
+ const deUint32* pCorrelatedViewMasks);
+
+ Move<VkRenderPass> createRenderPass (const DeviceInterface& vk,
+ VkDevice device) const;
+};
+
+class RenderPassCreateInfo2 : public VkRenderPassCreateInfo2KHR
+{
+public:
+ RenderPassCreateInfo2 (const void* pNext,
+ VkRenderPassCreateFlags flags,
+ deUint32 attachmentCount,
+ const VkAttachmentDescription2KHR* pAttachments,
+ deUint32 subpassCount,
+ const VkSubpassDescription2KHR* pSubpasses,
+ deUint32 dependencyCount,
+ const VkSubpassDependency2KHR* pDependencies,
+ deUint32 correlatedViewMaskCount,
+ const deUint32* pCorrelatedViewMasks);
+
+ Move<VkRenderPass> createRenderPass (const DeviceInterface& vk,
+ VkDevice device) const;
+};
+
+class SubpassBeginInfo1
+{
+public:
+ SubpassBeginInfo1 (const void* pNext,
+ VkSubpassContents contents);
+
+ VkSubpassContents contents;
+};
+
+class SubpassBeginInfo2 : public VkSubpassBeginInfoKHR
+{
+public:
+ SubpassBeginInfo2 (const void* pNext,
+ VkSubpassContents contents);
+};
+
+class SubpassEndInfo1
+{
+public:
+ SubpassEndInfo1 (const void* pNext);
+};
+
+class SubpassEndInfo2 : public VkSubpassEndInfoKHR
+{
+public:
+ SubpassEndInfo2 (const void* pNext);
+};
+
+class RenderpassSubpass1
+{
+public:
+ typedef SubpassBeginInfo1 SubpassBeginInfo;
+ typedef SubpassEndInfo1 SubpassEndInfo;
+
+ static void cmdBeginRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const SubpassBeginInfo* pSubpassBeginInfo);
+
+ static void cmdNextSubpass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassBeginInfo* pSubpassBeginInfo,
+ const SubpassEndInfo* pSubpassEndInfo);
+
+ static void cmdEndRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassEndInfo* pSubpassEndInfo);
+};
+
+class RenderpassSubpass2
+{
+public:
+ typedef SubpassBeginInfo2 SubpassBeginInfo;
+ typedef SubpassEndInfo2 SubpassEndInfo;
+
+ static void cmdBeginRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const SubpassBeginInfo* pSubpassBeginInfo);
+
+ static void cmdNextSubpass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassBeginInfo* pSubpassBeginInfo,
+ const SubpassEndInfo* pSubpassEndInfo);
+
+ static void cmdEndRenderPass (const DeviceInterface& vk,
+ VkCommandBuffer cmdBuffer,
+ const SubpassEndInfo* pSubpassEndInfo);
+};
+
+} // renderpass
+
+} // vkt
+
+#endif // _VKTMULTIVIEWRENDERPASSUTIL_HPP
#include "vktMultiViewRenderTests.hpp"
#include "vktMultiViewRenderUtil.hpp"
+#include "vktMultiViewRenderPassUtil.hpp"
#include "vktTestCase.hpp"
#include "vkBuilderUtil.hpp"
TEST_TYPE_LAST
};
+enum RenderPassType
+{
+ RENDERPASS_TYPE_LEGACY = 0,
+ RENDERPASS_TYPE_RENDERPASS2,
+};
+
struct TestParameters
{
VkExtent3D extent;
vector<deUint32> viewMasks;
TestType viewIndex;
+ RenderPassType renderPassType;
};
+vk::Move<vk::VkRenderPass> makeRenderPass (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks,
+ RenderPassType renderPassType)
+{
+ switch (renderPassType)
+ {
+ case RENDERPASS_TYPE_LEGACY:
+ return MultiView::makeRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>(vk, device, colorFormat, viewMasks);
+ case RENDERPASS_TYPE_RENDERPASS2:
+ return MultiView::makeRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>(vk, device, colorFormat, viewMasks);
+ default:
+ TCU_THROW(InternalError, "Impossible");
+ }
+}
+
+vk::Move<vk::VkRenderPass> makeRenderPassWithAttachments (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks,
+ RenderPassType renderPassType)
+{
+ switch (renderPassType)
+ {
+ case RENDERPASS_TYPE_LEGACY:
+ return MultiView::makeRenderPassWithAttachments<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>(vk, device, colorFormat, viewMasks);
+ case RENDERPASS_TYPE_RENDERPASS2:
+ return MultiView::makeRenderPassWithAttachments<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>(vk, device, colorFormat, viewMasks);
+ default:
+ TCU_THROW(InternalError, "Impossible");
+ }
+}
+
+template<typename RenderpassSubpass>
+void cmdBeginRenderPass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassContents contents)
+{
+ const typename RenderpassSubpass::SubpassBeginInfo subpassBeginInfo (DE_NULL, contents);
+
+ RenderpassSubpass::cmdBeginRenderPass(vkd, cmdBuffer, pRenderPassBegin, &subpassBeginInfo);
+}
+
+void cmdBeginRenderPass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassContents contents, RenderPassType renderPassType)
+{
+ switch (renderPassType)
+ {
+ case RENDERPASS_TYPE_LEGACY: cmdBeginRenderPass<RenderpassSubpass1>(vkd, cmdBuffer, pRenderPassBegin, contents); break;
+ case RENDERPASS_TYPE_RENDERPASS2: cmdBeginRenderPass<RenderpassSubpass2>(vkd, cmdBuffer, pRenderPassBegin, contents); break;
+ default: TCU_THROW(InternalError, "Impossible");
+ }
+}
+
+template<typename RenderpassSubpass>
+void cmdNextSubpass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer, const VkSubpassContents contents)
+{
+ const typename RenderpassSubpass::SubpassBeginInfo subpassBeginInfo (DE_NULL, contents);
+ const typename RenderpassSubpass::SubpassEndInfo subpassEndInfo (DE_NULL);
+
+ RenderpassSubpass::cmdNextSubpass(vkd, cmdBuffer, &subpassBeginInfo, &subpassEndInfo);
+}
+
+void cmdNextSubpass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer, const VkSubpassContents contents, RenderPassType renderPassType)
+{
+ switch (renderPassType)
+ {
+ case RENDERPASS_TYPE_LEGACY: cmdNextSubpass<RenderpassSubpass1>(vkd, cmdBuffer, contents); break;
+ case RENDERPASS_TYPE_RENDERPASS2: cmdNextSubpass<RenderpassSubpass2>(vkd, cmdBuffer, contents); break;
+ default: TCU_THROW(InternalError, "Impossible");
+ }
+}
+
+template<typename RenderpassSubpass>
+void cmdEndRenderPass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer)
+{
+ const typename RenderpassSubpass::SubpassEndInfo subpassEndInfo (DE_NULL);
+
+ RenderpassSubpass::cmdEndRenderPass(vkd, cmdBuffer, &subpassEndInfo);
+}
+
+void cmdEndRenderPass (DeviceInterface& vkd, VkCommandBuffer cmdBuffer, RenderPassType renderPassType)
+{
+ switch (renderPassType)
+ {
+ case RENDERPASS_TYPE_LEGACY: cmdEndRenderPass<RenderpassSubpass1>(vkd, cmdBuffer); break;
+ case RENDERPASS_TYPE_RENDERPASS2: cmdEndRenderPass<RenderpassSubpass2>(vkd, cmdBuffer); break;
+ default: TCU_THROW(InternalError, "Impossible");
+ }
+}
+
class ImageAttachment
{
public:
bool checkImage (tcu::ConstPixelBufferAccess& dst);
MovePtr<tcu::Texture2DArray> imageData (void);
+ const bool m_extensionSupported;
const TestParameters m_parameters;
VkFormat m_colorFormat;
const deUint32 m_squareCount;
};
MultiViewRenderTestInstance::MultiViewRenderTestInstance (Context& context, const TestParameters& parameters)
- : TestInstance (context)
- , m_parameters (fillMissingParameters(parameters))
- , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
- , m_squareCount (4u)
- ,m_queueFamilyIndex (0u)
+ : TestInstance (context)
+ , m_extensionSupported ((parameters.renderPassType == RENDERPASS_TYPE_RENDERPASS2) && context.requireDeviceExtension("VK_KHR_create_renderpass2"))
+ , m_parameters (fillMissingParameters(parameters))
+ , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
+ , m_squareCount (4u)
+ , m_queueFamilyIndex (0u)
{
if (!isDeviceExtensionSupported(context.getUsedApiVersion(), context.getDeviceExtensions(), "VK_KHR_multiview"))
throw tcu::NotSupportedError("VK_KHR_multiview is not supported");
const deUint32 subpassCount = static_cast<deUint32>(m_parameters.viewMasks.size());
// FrameBuffer & renderPass
- Unique<VkRenderPass> renderPass (makeRenderPass (*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks));
+ Unique<VkRenderPass> renderPass (makeRenderPass (*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks, m_parameters.renderPassType));
vector<VkImageView> attachments;
attachments.push_back(m_colorAttachment->getImageView());
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
m_device->cmdDraw(*m_cmdBuffer, 4u, 1u, (drawNdx + subpassNdx % m_squareCount) * 4u, 0u);
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_multiview"))
deviceExtensions.push_back("VK_KHR_multiview");
+ if (m_parameters.renderPassType == RENDERPASS_TYPE_RENDERPASS2)
+ if (!isCoreDeviceExtension(m_context.getUsedApiVersion(), "VK_KHR_create_renderpass2"))
+ deviceExtensions.push_back("VK_KHR_create_renderpass2");
+
const VkDeviceCreateInfo deviceInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, //VkStructureType sType;
m_inputAttachment = de::SharedPtr<ImageAttachment>(new ImageAttachment(*m_logicalDevice, *m_device, *m_allocator, m_parameters.extent, m_colorFormat));
// FrameBuffer & renderPass
- Unique<VkRenderPass> renderPass (makeRenderPassWithAttachments(*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks));
+ Unique<VkRenderPass> renderPass (makeRenderPassWithAttachments(*m_device, *m_logicalDevice, m_colorFormat, m_parameters.viewMasks, m_parameters.renderPassType));
vector<VkImageView> attachments;
attachments.push_back(m_colorAttachment->getImageView());
m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
}
-void MultiViewInstancedTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+void MultiViewInstancedTestInstance::draw (const deUint32 subpassCount, VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
{
const VkRect2D renderArea = { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
const VkDeviceSize vertexBufferOffset = 0u;
const deUint32 drawCountPerSubpass = (subpassCount == 1) ? m_squareCount : 1u;
-
const VkRenderPassBeginInfo renderPassBeginInfo =
{
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
m_device->cmdDraw(*m_cmdBuffer, 4u, drawCountPerSubpass, 0u, subpassNdx % m_squareCount);
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
MultiViewInputRateInstanceTestInstance (Context& context, const TestParameters& parameters);
protected:
void createVertexData (void);
+
void draw (const deUint32 subpassCount,
VkRenderPass renderPass,
VkFramebuffer frameBuffer,
m_data.push_back(VertexData(tcu::Vec4( 0.0f, 0.0f, 1.0f, 1.0f), color));
}
-void MultiViewInputRateInstanceTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+void MultiViewInputRateInstanceTestInstance::draw (const deUint32 subpassCount, VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
{
const VkRect2D renderArea = { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
const VkDeviceSize vertexBufferOffset = 0u;
const deUint32 drawCountPerSubpass = (subpassCount == 1) ? m_squareCount : 1u;
-
const VkRenderPassBeginInfo renderPassBeginInfo =
{
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
m_device->cmdDraw(*m_cmdBuffer, 4u, 4u, 0u, 0u);
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
}
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
{
}
-void MultiViewClearAttachmentsTestInstance::draw (const deUint32 subpassCount,VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
+void MultiViewClearAttachmentsTestInstance::draw (const deUint32 subpassCount, VkRenderPass renderPass, VkFramebuffer frameBuffer, vector<PipelineSp>& pipelines)
{
const VkRect2D renderArea = { { 0, 0 }, { m_parameters.extent.width, m_parameters.extent.height } };
const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
m_device->cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &(*m_vertexBuffer), &vertexBufferOffset);
m_device->cmdClearAttachments(*m_cmdBuffer, 1u, &clearAttachment, 1u, &clearRect);
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
const VkClearValue renderPassClearValue = makeClearValueColor(tcu::Vec4(0.0f));
const VkDeviceSize vertexBufferOffset = 0u;
const deUint32 drawCountPerSubpass = (subpassCount == 1) ? m_squareCount : 1u;
-
const VkRenderPassBeginInfo renderPassBeginInfo =
{
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
beforeDraw();
- m_device->cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ cmdBeginRenderPass(*m_device, *m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS, m_parameters.renderPassType);
//Create secondary buffer
const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
m_device->cmdExecuteCommands(*m_cmdBuffer, 1u, &cmdBufferSecondary.back().get()->get());
if (subpassNdx < subpassCount - 1u)
- m_device->cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ cmdNextSubpass(*m_device, *m_cmdBuffer, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS, m_parameters.renderPassType);
}
- m_device->cmdEndRenderPass(*m_cmdBuffer);
+ cmdEndRenderPass(*m_device, *m_cmdBuffer, m_parameters.renderPassType);
afterDraw();
};
} //anonymous
+static std::string createViewMasksName(const std::vector<deUint32>& viewMasks)
+{
+ std::ostringstream masks;
+
+ for (size_t ndx = 0u; ndx < viewMasks.size(); ++ndx)
+ {
+ masks << viewMasks[ndx];
+ if (viewMasks.size() - 1 != ndx)
+ masks << "_";
+ }
+
+ return masks.str();
+}
+
void multiViewRenderCreateTests (tcu::TestCaseGroup* group)
{
- tcu::TestContext& testCtx = group->getTestContext();
const deUint32 testCaseCount = 6u;
- MovePtr<tcu::TestCaseGroup> groupViewIndex (new tcu::TestCaseGroup(testCtx, "index", "ViewIndex rendering tests."));
const string shaderName[TEST_TYPE_LAST] =
{
"masks",
for (deUint32 mask = 1u; mask <= maxViewMask; mask = mask << 1u)
viewMasks[5].push_back(mask);
- for (int testTypeNdx = TEST_TYPE_VIEW_MASK; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
+ for (int renderPassTypeNdx = 0; renderPassTypeNdx < 2; ++renderPassTypeNdx)
{
- MovePtr<tcu::TestCaseGroup> groupShader (new tcu::TestCaseGroup(testCtx, shaderName[testTypeNdx].c_str(), ""));
- for (deUint32 testCaseNdx = 0u; testCaseNdx < testCaseCount; ++testCaseNdx)
+ RenderPassType renderPassType ((renderPassTypeNdx == 0) ? RENDERPASS_TYPE_LEGACY : RENDERPASS_TYPE_RENDERPASS2);
+ MovePtr<tcu::TestCaseGroup> groupRenderPass2 ((renderPassTypeNdx == 0) ? DE_NULL : new tcu::TestCaseGroup(group->getTestContext(), "renderpass2", "RenderPass2 index tests"));
+ tcu::TestCaseGroup* targetGroup ((renderPassTypeNdx == 0) ? group : groupRenderPass2.get());
+ tcu::TestContext& testCtx (targetGroup->getTestContext());
+ MovePtr<tcu::TestCaseGroup> groupViewIndex (new tcu::TestCaseGroup(testCtx, "index", "ViewIndex rendering tests."));
+
+ for (int testTypeNdx = TEST_TYPE_VIEW_MASK; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
{
- const TestParameters parameters = {extent3D[testCaseNdx], viewMasks[testCaseNdx], (TestType)testTypeNdx};
- std::ostringstream masks;
- const deUint32 viewMaksSize = static_cast<deUint32>(viewMasks[testCaseNdx].size());
+ MovePtr<tcu::TestCaseGroup> groupShader (new tcu::TestCaseGroup(testCtx, shaderName[testTypeNdx].c_str(), ""));
+ const TestType testType = static_cast<TestType>(testTypeNdx);
- for (deUint32 ndx = 0u; ndx < viewMaksSize; ++ndx)
+ for (deUint32 testCaseNdx = 0u; testCaseNdx < testCaseCount; ++testCaseNdx)
{
- masks<<viewMasks[testCaseNdx][ndx];
- if (viewMaksSize - 1 != ndx)
- masks<<"_";
+ const TestParameters parameters = { extent3D[testCaseNdx], viewMasks[testCaseNdx], testType, renderPassType };
+ const std::string testName = createViewMasksName(parameters.viewMasks);
+
+ groupShader->addChild(new MultiViewRenderTestsCase(testCtx, testName.c_str(), "", parameters));
}
- groupShader->addChild(new MultiViewRenderTestsCase(testCtx, masks.str().c_str(), "", parameters));
- }
- // maxMultiviewViewCount case
- {
- const VkExtent3D incompleteExtent3D = { 16u, 16u, 0u };
- const vector<deUint32> dummyMasks;
- const TestParameters parameters = { incompleteExtent3D, dummyMasks, (TestType)testTypeNdx };
+ // maxMultiviewViewCount case
+ {
+ const VkExtent3D incompleteExtent3D = { 16u, 16u, 0u };
+ const vector<deUint32> dummyMasks;
+ const TestParameters parameters = { incompleteExtent3D, dummyMasks, testType, renderPassType };
- groupShader->addChild(new MultiViewRenderTestsCase(testCtx, "max_multi_view_view_count", "", parameters));
+ groupShader->addChild(new MultiViewRenderTestsCase(testCtx, "max_multi_view_view_count", "", parameters));
+ }
+
+ switch (testType)
+ {
+ case TEST_TYPE_VIEW_MASK:
+ case TEST_TYPE_INPUT_ATTACHMENTS:
+ case TEST_TYPE_INPUT_ATTACHMENTS_GEOMETRY:
+ case TEST_TYPE_INSTANCED_RENDERING:
+ case TEST_TYPE_INPUT_RATE_INSTANCE:
+ case TEST_TYPE_DRAW_INDIRECT:
+ case TEST_TYPE_CLEAR_ATTACHMENTS:
+ case TEST_TYPE_SECONDARY_CMD_BUFFER:
+ case TEST_TYPE_SECONDARY_CMD_BUFFER_GEOMETRY:
+ targetGroup->addChild(groupShader.release());
+ break;
+ case TEST_TYPE_VIEW_INDEX_IN_VERTEX:
+ case TEST_TYPE_VIEW_INDEX_IN_FRAGMENT:
+ case TEST_TYPE_VIEW_INDEX_IN_GEOMETRY:
+ case TEST_TYPE_VIEW_INDEX_IN_TESELLATION:
+ groupViewIndex->addChild(groupShader.release());
+ break;
+ default:
+ DE_ASSERT(0);
+ break;
+ };
}
- switch (testTypeNdx)
- {
- case TEST_TYPE_VIEW_MASK:
- case TEST_TYPE_INPUT_ATTACHMENTS:
- case TEST_TYPE_INPUT_ATTACHMENTS_GEOMETRY:
- case TEST_TYPE_INSTANCED_RENDERING:
- case TEST_TYPE_INPUT_RATE_INSTANCE:
- case TEST_TYPE_DRAW_INDIRECT:
- case TEST_TYPE_CLEAR_ATTACHMENTS:
- case TEST_TYPE_SECONDARY_CMD_BUFFER:
- case TEST_TYPE_SECONDARY_CMD_BUFFER_GEOMETRY:
- group->addChild(groupShader.release());
- break;
- case TEST_TYPE_VIEW_INDEX_IN_VERTEX:
- case TEST_TYPE_VIEW_INDEX_IN_FRAGMENT:
- case TEST_TYPE_VIEW_INDEX_IN_GEOMETRY:
- case TEST_TYPE_VIEW_INDEX_IN_TESELLATION:
- groupViewIndex->addChild(groupShader.release());
- break;
- default:
- DE_ASSERT(0);
- break;
- };
- }
+ targetGroup->addChild(groupViewIndex.release());
- group->addChild(groupViewIndex.release());
+ if (renderPassTypeNdx == 1)
+ group->addChild(groupRenderPass2.release());
+ }
}
} //MultiView
*//*--------------------------------------------------------------------*/
#include "vktMultiViewRenderUtil.hpp"
+#include "vktMultiViewRenderPassUtil.hpp"
#include "vktTestCase.hpp"
#include "vkBuilderUtil.hpp"
return vk::createDescriptorSetLayout(vk, device, &createInfo);
}
+template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk,
const VkDevice device,
const VkFormat colorFormat,
const vector<deUint32>& viewMasks)
{
const deUint32 subpassCount = static_cast<deUint32>(viewMasks.size());
- const VkAttachmentDescription colorAttachmentDescription =
+ 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 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 depthAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
+ (
+ // || VkStructureType sType;
+ DE_NULL, // || const void* pNext;
+ VK_ATTACHMENT_UNUSED, // deUint32 attachment; || deUint32 attachment;
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout layout; || VkImageLayout layout;
+ 0u // || VkImageAspectFlags aspectMask;
+ );
+
+ DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) || (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)));
+
+ vector <SubpassDesc> subpassDescriptions;
+ for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
{
- (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
- colorFormat, // 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 VkAttachmentReference colorAttachmentReference =
- {
- 0u, // deUint32 attachment;
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
- };
-
- const VkAttachmentReference depthAttachmentReference =
- {
- VK_ATTACHMENT_UNUSED, // deUint32 attachment;
- VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout layout;
- };
-
- const VkSubpassDescription subpassDescription =
- {
- (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags;
- VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
- 0u, // deUint32 inputAttachmentCount;
- DE_NULL, // const VkAttachmentReference* pInputAttachments;
- 1u, // deUint32 colorAttachmentCount;
- &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments;
- DE_NULL, // const VkAttachmentReference* pResolveAttachments;
- &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment;
- 0u, // deUint32 preserveAttachmentCount;
- DE_NULL // const deUint32* pPreserveAttachments;
- };
- vector <VkSubpassDescription> subpassDescriptions (subpassCount, subpassDescription);
+ 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;
+ 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 <VkSubpassDependency> subpassDependencies;
+ vector <SubpassDep> subpassDependencies;
for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
{
- const VkSubpassDependency subpassDependency =
- {
- subpassNdx, // deUint32 srcSubpass;
- (subpassNdx ==subpassCount - 1u) ? subpassNdx : subpassNdx+1u, // deUint32 dstSubpass;
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask;
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask;
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
- VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR, // VkDependencyFlags dependencyFlags;
- };
+ 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 VkRenderPassCreateInfo renderPassInfo =
- {
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
- &renderPassMultiviewInfo, // const void* pNext;
- (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags;
- 1u, // deUint32 attachmentCount;
- &colorAttachmentDescription, // const VkAttachmentDescription* pAttachments;
- subpassCount, // deUint32 subpassCount;
- &subpassDescriptions[0], // const VkSubpassDescription* pSubpasses;
- subpassCount, // deUint32 dependencyCount;
- &subpassDependencies[0] // const VkSubpassDependency* pDependencies;
- };
-
- return createRenderPass(vk, device, &renderPassInfo);
+ const RenderPassCreateInfo renderPassInfo // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR
+ (
+ // VkStructureType sType; || VkStructureType sType;
+ renderPassMultiviewInfoPtr, // const void* pNext; || const void* pNext;
+ (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags;
+ 1u, // deUint32 attachmentCount; || deUint32 attachmentCount;
+ &colorAttachmentDescription, // 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<VkRenderPass> makeRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>
+ (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks);
+
+// Instantiate function for renderpass2 structures
+template
+Move<VkRenderPass> makeRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>
+ (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks);
+
+template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
Move<VkRenderPass> makeRenderPassWithAttachments (const DeviceInterface& vk,
const VkDevice device,
const VkFormat colorFormat,
{
const deUint32 subpassCount = static_cast<deUint32>(viewMasks.size());
- const VkAttachmentDescription colorAttachmentDescription =
- {
- (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
- colorFormat, // 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 inputAttachmentDescription =
- {
- (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
- colorFormat, // VkFormat format;
- VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
- VK_ATTACHMENT_LOAD_OP_LOAD, // 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_GENERAL, // VkImageLayout initialLayout;
- VK_IMAGE_LAYOUT_GENERAL // VkImageLayout finalLayout;
- };
-
- vector<VkAttachmentDescription> attachments;
+ 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<AttachmentDesc> attachments;
attachments.push_back(colorAttachmentDescription);
attachments.push_back(inputAttachmentDescription);
- const VkAttachmentReference colorAttachmentReference =
- {
- 0u, // deUint32 attachment;
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
- };
-
- const VkAttachmentReference inputAttachmentReference =
- {
- 1u, // deUint32 attachment;
- VK_IMAGE_LAYOUT_GENERAL // VkImageLayout layout;
- };
-
- const VkAttachmentReference depthAttachmentReference =
- {
- VK_ATTACHMENT_UNUSED, // deUint32 attachment;
- VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout layout;
- };
-
- const VkSubpassDescription subpassDescription =
+ 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;
+ 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 <SubpassDesc> subpassDescriptions;
+ for (deUint32 subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
{
- (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags;
- VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
- 1u, // deUint32 inputAttachmentCount;
- &inputAttachmentReference, // const VkAttachmentReference* pInputAttachments;
- 1u, // deUint32 colorAttachmentCount;
- &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments;
- DE_NULL, // const VkAttachmentReference* pResolveAttachments;
- &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment;
- 0u, // deUint32 preserveAttachmentCount;
- DE_NULL // const deUint32* pPreserveAttachments;
- };
- vector <VkSubpassDescription> subpassDescriptions (subpassCount, subpassDescription);
+ 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 =
+ const VkRenderPassMultiviewCreateInfo renderPassMultiviewInfo =
{
VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR, //VkStructureType sType;
DE_NULL, //const void* pNext;
0u, //uint32_t correlationMaskCount;
DE_NULL, //const uint32_t* pCorrelationMasks;
};
+ const VkRenderPassMultiviewCreateInfo* renderPassMultiviewInfoPtr = typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)
+ ? &renderPassMultiviewInfo
+ : DE_NULL;
- vector <VkSubpassDependency> subpassDependencies;
+ vector <SubpassDep> subpassDependencies;
for(deUint32 subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
{
- const VkSubpassDependency subpassDependency =
- {
- subpassNdx, // deUint32 srcSubpass;
- (subpassNdx ==subpassCount - 1u) ? subpassNdx : subpassNdx+1u, // deUint32 dstSubpass;
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask;
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask;
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
- VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR, // VkDependencyFlags dependencyFlags;
- };
+ 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 VkRenderPassCreateInfo renderPassInfo =
- {
- VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
- &renderPassMultiviewInfo, // const void* pNext;
- (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags;
- 2u, // deUint32 attachmentCount;
- &attachments[0], // const VkAttachmentDescription* pAttachments;
- subpassCount, // deUint32 subpassCount;
- &subpassDescriptions[0], // const VkSubpassDescription* pSubpasses;
- subpassCount, // deUint32 dependencyCount;
- &subpassDependencies[0] // const VkSubpassDependency* pDependencies;
- };
-
- return createRenderPass(vk, device, &renderPassInfo);
+ 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<VkRenderPass> makeRenderPassWithAttachments<AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>
+ (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks);
+
+// Instantiate function for renderpass2 structures
+template
+Move<VkRenderPass> makeRenderPassWithAttachments<AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>
+ (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkFormat colorFormat,
+ const vector<deUint32>& viewMasks);
+
void beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
{
const VkCommandBufferBeginInfo info =
vk::Move<vk::VkFramebuffer> makeFramebuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkRenderPass renderPass, const std::vector<vk::VkImageView>& attachments, const deUint32 width, const deUint32 height, const deUint32 layers);
vk::Move<vk::VkPipelineLayout> makePipelineLayout (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkDescriptorSetLayout* pSetLayouts = DE_NULL);
vk::Move<vk::VkDescriptorSetLayout> makeDescriptorSetLayout (const vk::DeviceInterface& vk, const vk::VkDevice device);
+
+template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
vk::Move<vk::VkRenderPass> makeRenderPass (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat, const std::vector<deUint32>& viewMasks);
+
+template<typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep, typename RenderPassCreateInfo>
vk::Move<vk::VkRenderPass> makeRenderPassWithAttachments (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkFormat colorFormat, const std::vector<deUint32>& viewMasks);
+
void beginCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer);
void beginSecondaryCommandBuffer (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer, const vk::VkRenderPass renderPass, const deUint32 subpass, const vk::VkFramebuffer framebuffer);
void imageBarrier (const vk::DeviceInterface& vk, const vk::VkCommandBuffer cmdBuffer, const vk::VkImage image, const vk::VkImageSubresourceRange subresourceRange, const vk::VkImageLayout oldLayout, const vk::VkImageLayout newLayout, const vk::VkAccessFlags srcAccessMask, const vk::VkAccessFlags dstAccessMask, const vk::VkPipelineStageFlags srcStageMask = vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, const vk::VkPipelineStageFlags dstStageMas = vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.masks.15
+dEQP-VK.multiview.renderpass2.masks.8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8
+dEQP-VK.multiview.renderpass2.masks.15_15_15_15
+dEQP-VK.multiview.renderpass2.masks.8_1_1_8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.masks.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments.15
+dEQP-VK.multiview.renderpass2.input_attachments.8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.instanced.15
+dEQP-VK.multiview.renderpass2.instanced.8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8
+dEQP-VK.multiview.renderpass2.instanced.15_15_15_15
+dEQP-VK.multiview.renderpass2.instanced.8_1_1_8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.instanced.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_instance.15
+dEQP-VK.multiview.renderpass2.input_instance.8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_instance.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_instance.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_instance.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.draw_indirect.15
+dEQP-VK.multiview.renderpass2.draw_indirect.8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8
+dEQP-VK.multiview.renderpass2.draw_indirect.15_15_15_15
+dEQP-VK.multiview.renderpass2.draw_indirect.8_1_1_8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.draw_indirect.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.clear_attachments.15
+dEQP-VK.multiview.renderpass2.clear_attachments.8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.clear_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.clear_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.clear_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.vertex_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.fragment_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.geometry_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.max_multi_view_view_count
dEQP-VK.subgroups.builtin_var.subgroupsize_graphic
dEQP-VK.subgroups.builtin_var.subgroupsize_compute
dEQP-VK.subgroups.builtin_var.subgroupsize_vertex_framebuffer
dEQP-VK.multiview.index.tesellation_shader.8_1_1_8
dEQP-VK.multiview.index.tesellation_shader.1_2_4_8_16_32
dEQP-VK.multiview.index.tesellation_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.masks.15
+dEQP-VK.multiview.renderpass2.masks.8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8
+dEQP-VK.multiview.renderpass2.masks.15_15_15_15
+dEQP-VK.multiview.renderpass2.masks.8_1_1_8
+dEQP-VK.multiview.renderpass2.masks.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.masks.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments.15
+dEQP-VK.multiview.renderpass2.input_attachments.8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_attachments_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.instanced.15
+dEQP-VK.multiview.renderpass2.instanced.8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8
+dEQP-VK.multiview.renderpass2.instanced.15_15_15_15
+dEQP-VK.multiview.renderpass2.instanced.8_1_1_8
+dEQP-VK.multiview.renderpass2.instanced.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.instanced.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.input_instance.15
+dEQP-VK.multiview.renderpass2.input_instance.8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8
+dEQP-VK.multiview.renderpass2.input_instance.15_15_15_15
+dEQP-VK.multiview.renderpass2.input_instance.8_1_1_8
+dEQP-VK.multiview.renderpass2.input_instance.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.input_instance.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.draw_indirect.15
+dEQP-VK.multiview.renderpass2.draw_indirect.8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8
+dEQP-VK.multiview.renderpass2.draw_indirect.15_15_15_15
+dEQP-VK.multiview.renderpass2.draw_indirect.8_1_1_8
+dEQP-VK.multiview.renderpass2.draw_indirect.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.draw_indirect.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.clear_attachments.15
+dEQP-VK.multiview.renderpass2.clear_attachments.8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8
+dEQP-VK.multiview.renderpass2.clear_attachments.15_15_15_15
+dEQP-VK.multiview.renderpass2.clear_attachments.8_1_1_8
+dEQP-VK.multiview.renderpass2.clear_attachments.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.clear_attachments.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.15_15_15_15
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.8_1_1_8
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.secondary_cmd_buffer_geometry.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.vertex_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.vertex_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.vertex_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.fragment_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.fragment_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.fragment_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.geometry_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.geometry_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.geometry_shader.max_multi_view_view_count
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.15_15_15_15
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.8_1_1_8
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.1_2_4_8_16_32
+dEQP-VK.multiview.renderpass2.index.tesellation_shader.max_multi_view_view_count
dEQP-VK.subgroups.builtin_var.subgroupsize_graphic
dEQP-VK.subgroups.builtin_var.subgroupsize_compute
dEQP-VK.subgroups.builtin_var.subgroupsize_vertex_framebuffer