blob: bdf983fb0f6eace6ae856602619c72f76d6fd945 [file] [log] [blame]
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
* Copyright (c) 2021 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 Dynamic Rendering Tests
*//*--------------------------------------------------------------------*/
#include "deRandom.hpp"
#include "deUniquePtr.hpp"
#include "tcuImageCompare.hpp"
#include "tcuRGBA.hpp"
#include "tcuTestLog.hpp"
#include "tcuTextureUtil.hpp"
#include "tcuVectorUtil.hpp"
#include "vkBarrierUtil.hpp"
#include "vkBuilderUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vktDrawBufferObjectUtil.hpp"
#include "vktDynamicRenderingTests.hpp"
#include "vkImageUtil.hpp"
#include "vkObjUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkRefUtil.hpp"
#include "vktTestGroupUtil.hpp"
#include "vktTestCase.hpp"
#include "vkTypeUtil.hpp"
#include <iostream>
namespace vkt
{
namespace renderpass
{
namespace
{
using namespace vk;
using namespace Draw;
using de::MovePtr;
using de::UniquePtr;
using de::SharedPtr;
using tcu::UVec2;
using tcu::Vec4;
using tcu::IVec4;
using tcu::UVec4;
constexpr auto VK_NULL_HANDLE = DE_NULL;
// maxColorAttachments is guaranteed to be at least 4.
constexpr deUint32 COLOR_ATTACHMENTS_NUMBER = 4;
constexpr deUint32 TEST_ATTACHMENT_LOAD_OP_LAST = 3;
enum TestType
{
// Draw two triangles in a single primary command buffer, beginning and ending the render pass instance.
TEST_TYPE_SINGLE_CMDBUF = 0,
// Draw two triangles in a single primary command buffer, but across two render pass instances, with the second RESUMING the first.
TEST_TYPE_SINGLE_CMDBUF_RESUMING,
// Draw two triangles in two primary command buffers, across two render pass instances, with the second RESUMING the first.
TEST_TYPE_TWO_CMDBUF_RESUMING,
// Draw two triangles in two secondary command buffers, across two render pass instances,
//with the second RESUMING the first, both recorded to the same primary command buffer.
TEST_TYPE_SECONDARY_CMDBUF_RESUMING,
// Draw two triangles in two secondary command buffers, across two render pass instances,
// with the second RESUMING the first, executed in the two primary command buffers.
TEST_TYPE_SECONDARY_CMDBUF_TWO_PRIMARY_RESUMING,
// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in one secondary command buffer,
// and execute it inside a single render pass instance in one primary command buffer.
TEST_TYPE_CONTENTS_SECONDARY_COMMAND_BUFFER,
// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
// and execute them inside a single render pass instance in one primary command buffer.
TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER,
// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
// and execute them inside two render pass instances, with the second RESUMING the first, both recorded in the same primary command buffer.
TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER_RESUMING,
// Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
// and execute them inside two render pass instances, with the second RESUMING the first, recorded into two primary command buffers.
TEST_TYPE_CONTENTS_2_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
// In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
// draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
// draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
TEST_TYPE_CONTENTS_PRIMARY_SECONDARY_COMDBUF_RESUMING,
// In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
// use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer,
// and execute it in that first render pass instance.In the second, draw one triangle directly in the primary command buffer.
TEST_TYPE_CONTENTS_SECONDARY_PRIMARY_COMDBUF_RESUMING,
// In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
// draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
// draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
TEST_TYPE_CONTENTS_2_PRIMARY_SECONDARY_COMDBUF_RESUMING,
// In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
// use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer, and execute it in that first
// render pass instance.In the second, draw one triangle directly in the primary command buffer.
TEST_TYPE_CONTENTS_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
TEST_TYPE_LAST
};
enum TestAttachmentType
{
TEST_ATTACHMENT_SINGLE_COLOR = 0,
TEST_ATTACHMENT_DEPTH_ATTACHMENT,
TEST_ATTACHMENT_STENCIL_ATTACHMENT,
TEST_ATTACHMENT_MULTIPLE_COLOR,
TEST_ATTACHMENT_ALL,
TEST_ATTACHMENT_LAST
};
enum TestAttachmentStoreOp
{
TEST_ATTACHMENT_STORE_OP_STORE = VK_ATTACHMENT_STORE_OP_STORE,
TEST_ATTACHMENT_STORE_OP_DONT_CARE =VK_ATTACHMENT_STORE_OP_DONT_CARE,
TEST_ATTACHMENT_STORE_OP_LAST
};
struct TestParameters
{
TestType testType;
const Vec4 clearColor;
const VkFormat imageFormat;
const UVec2 renderSize;
};
struct ImagesLayout
{
VkImageLayout oldColors[COLOR_ATTACHMENTS_NUMBER];
VkImageLayout oldStencil;
VkImageLayout oldDepth;
};
struct ImagesFormat
{
VkFormat colors[COLOR_ATTACHMENTS_NUMBER];
VkFormat depth;
VkFormat stencil;
};
struct ClearAttachmentData
{
std::vector<VkClearAttachment> colorDepthClear1;
std::vector<VkClearAttachment> colorDepthClear2;
VkClearAttachment stencilClear1;
VkClearAttachment stencilClear2;
VkClearRect rectColorDepth1;
VkClearRect rectColorDepth2;
VkClearRect rectStencil1;
VkClearRect rectStencil2;
ClearAttachmentData (const deUint32 colorAtchCount,
const VkFormat depth,
const VkFormat stencil)
{
if (colorAtchCount != 0)
{
for (deUint32 atchNdx = 0; atchNdx < colorAtchCount; ++atchNdx)
{
const VkClearAttachment green =
{
VK_IMAGE_ASPECT_COLOR_BIT,
atchNdx,
makeClearValueColorF32(0.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
};
colorDepthClear1.push_back(green);
const VkClearAttachment yellow =
{
VK_IMAGE_ASPECT_COLOR_BIT,
atchNdx,
makeClearValueColorF32(1.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
};
colorDepthClear2.push_back(yellow);
}
}
if (depth != VK_FORMAT_UNDEFINED)
{
const VkClearAttachment zero =
{
VK_IMAGE_ASPECT_DEPTH_BIT,
0,
makeClearValueDepthStencil(0.0f, 0)
};
colorDepthClear1.push_back(zero);
const VkClearAttachment one =
{
VK_IMAGE_ASPECT_DEPTH_BIT,
0,
makeClearValueDepthStencil(0.2f, 0)
};
colorDepthClear2.push_back(one);
}
if (stencil != VK_FORMAT_UNDEFINED)
{
stencilClear1 =
{
VK_IMAGE_ASPECT_STENCIL_BIT,
0,
makeClearValueDepthStencil(0.0f, 1)
};
stencilClear2 =
{
VK_IMAGE_ASPECT_STENCIL_BIT,
0,
makeClearValueDepthStencil(0.0f, 2)
};
rectStencil1 =
{
makeRect2D(0, 0, 32, 16),
0u,
1u,
};
rectStencil2 =
{
makeRect2D(0, 16, 32, 16),
0u,
1u,
};
}
rectColorDepth1 =
{
makeRect2D(0, 0, 16, 32),
0u,
1u,
};
rectColorDepth2 =
{
makeRect2D(16, 0, 16, 32),
0u,
1u,
};
}
};
template<typename T>
inline VkDeviceSize sizeInBytes (const std::vector<T>& vec)
{
return vec.size() * sizeof(vec[0]);
}
VkImageCreateInfo makeImageCreateInfo (const VkFormat format,
const UVec2& size,
VkImageUsageFlags usage)
{
const VkImageCreateInfo imageParams =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkImageCreateFlags)0, // VkImageCreateFlags flags;
VK_IMAGE_TYPE_2D, // VkImageType imageType;
format, // VkFormat format;
makeExtent3D(size.x(), size.y(), 1), // VkExtent3D extent;
1u, // deUint32 mipLevels;
1u, // deUint32 arrayLayers;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
usage, // VkImageUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
0u, // deUint32 queueFamilyIndexCount;
DE_NULL, // const deUint32* pQueueFamilyIndices;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
};
return imageParams;
}
Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk,
const VkDevice device,
const VkPipelineLayout pipelineLayout,
const VkShaderModule vertexModule,
const VkShaderModule fragmentModule,
const UVec2 renderSize,
const deUint32 colorAttachmentCount,
const VkFormat* pColorAttachmentFormats,
const VkFormat depthStencilAttachmentFormat)
{
const VkVertexInputBindingDescription vertexInputBindingDescription =
{
0u, // uint32_t binding;
sizeof(Vec4), // uint32_t stride;
VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
};
const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
{
{
0u, // uint32_t location;
0u, // uint32_t binding;
VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
0u, // uint32_t offset;
},
};
const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags;
1u, // uint32_t vertexBindingDescriptionCount;
&vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions), // uint32_t vertexAttributeDescriptionCount;
vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
};
const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineInputAssemblyStateCreateFlags)0, // VkPipelineInputAssemblyStateCreateFlags flags;
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, // VkPrimitiveTopology topology;
VK_FALSE, // VkBool32 primitiveRestartEnable;
};
VkViewport viewport = makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()), 0.0f, 1.0f);
const VkRect2D rectScissorRenderSize = { { 0, 0 }, { renderSize.x(), renderSize.y() } };
const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineViewportStateCreateFlags)0, // VkPipelineViewportStateCreateFlags flags;
1u, // uint32_t viewportCount;
&viewport, // const VkViewport* pViewports;
1u, // uint32_t scissorCount;
&rectScissorRenderSize, // const VkRect2D* pScissors;
};
const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineRasterizationStateCreateFlags)0, // VkPipelineRasterizationStateCreateFlags flags;
VK_FALSE, // VkBool32 depthClampEnable;
VK_FALSE, // VkBool32 rasterizerDiscardEnable;
VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
VK_FALSE, // VkBool32 depthBiasEnable;
0.0f, // float depthBiasConstantFactor;
0.0f, // float depthBiasClamp;
0.0f, // float depthBiasSlopeFactor;
1.0f, // float lineWidth;
};
const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineMultisampleStateCreateFlags)0, // VkPipelineMultisampleStateCreateFlags flags;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
VK_FALSE, // VkBool32 sampleShadingEnable;
0.0f, // float minSampleShading;
DE_NULL, // const VkSampleMask* pSampleMask;
VK_FALSE, // VkBool32 alphaToCoverageEnable;
VK_FALSE // VkBool32 alphaToOneEnable;
};
const VkStencilOpState stencilOp = makeStencilOpState(
VK_STENCIL_OP_ZERO, // stencil fail
VK_STENCIL_OP_INCREMENT_AND_CLAMP, // depth & stencil pass
VK_STENCIL_OP_INCREMENT_AND_CLAMP, // depth only fail
VK_COMPARE_OP_NOT_EQUAL, // compare op
240u, // compare mask
255u, // write mask
255u); // reference
VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineDepthStencilStateCreateFlags)0, // VkPipelineDepthStencilStateCreateFlags flags;
VK_TRUE, // VkBool32 depthTestEnable;
VK_TRUE, // VkBool32 depthWriteEnable;
VK_COMPARE_OP_ALWAYS, // VkCompareOp depthCompareOp;
VK_FALSE, // VkBool32 depthBoundsTestEnable;
VK_TRUE, // VkBool32 stencilTestEnable;
stencilOp, // VkStencilOpState front;
stencilOp, // VkStencilOpState back;
0.0f, // float minDepthBounds;
1.0f, // float maxDepthBounds;
};
const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT |
VK_COLOR_COMPONENT_G_BIT |
VK_COLOR_COMPONENT_B_BIT |
VK_COLOR_COMPONENT_A_BIT;
std::vector<VkPipelineColorBlendAttachmentState> colorBlendAttachmentState;
for (deUint32 ndx = 0 ; ndx < colorAttachmentCount; ++ndx)
{
const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
{
VK_FALSE, // VkBool32 blendEnable;
VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor;
VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor;
VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor;
VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor;
VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
colorComponentsAll, // VkColorComponentFlags colorWriteMask;
};
colorBlendAttachmentState.push_back(pipelineColorBlendAttachmentState);
}
const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags;
VK_FALSE, // VkBool32 logicOpEnable;
VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
colorAttachmentCount, // deUint32 attachmentCount;
colorBlendAttachmentState.data(), // const VkPipelineColorBlendAttachmentState* pAttachments;
{ 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4];
};
const VkPipelineShaderStageCreateInfo pShaderStages[] =
{
{
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage;
vertexModule, // VkShaderModule module;
"main", // const char* pName;
DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
},
{
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
(VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage;
fragmentModule, // VkShaderModule module;
"main", // const char* pName;
DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
},
};
const VkPipelineRenderingCreateInfoKHR renderingCreateInfo
{
VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 viewMask;
colorAttachmentCount, // deUint32 colorAttachmentCount;
pColorAttachmentFormats, // const VkFormat* pColorAttachmentFormats;
depthStencilAttachmentFormat, // VkFormat depthAttachmentFormat;
depthStencilAttachmentFormat, // VkFormat stencilAttachmentFormat;
};
const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
{
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
&renderingCreateInfo, // const void* pNext;
(VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags;
2u, // deUint32 stageCount;
pShaderStages, // const VkPipelineShaderStageCreateInfo* pStages;
&vertexInputStateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
&pipelineInputAssemblyStateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
&pipelineViewportStateInfo, // const VkPipelineViewportStateCreateInfo* pViewportState;
&pipelineRasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
&pipelineMultisampleStateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
&pipelineDepthStencilStateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
&pipelineColorBlendStateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
pipelineLayout, // VkPipelineLayout layout;
VK_NULL_HANDLE, // VkRenderPass renderPass;
0u, // deUint32 subpass;
DE_NULL, // VkPipeline basePipelineHandle;
0, // deInt32 basePipelineIndex;
};
return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
}
VkFormat getSupportedStencilFormat (const InstanceInterface& vki,
VkPhysicalDevice physDev)
{
const VkFormat formatList[] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT };
const VkFormatFeatureFlags requirements = (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
for (int i = 0; i < DE_LENGTH_OF_ARRAY(formatList); ++i)
{
const auto properties = getPhysicalDeviceFormatProperties(vki, physDev, formatList[i]);
if ((properties.optimalTilingFeatures & requirements) == requirements)
return formatList[i];
}
return VK_FORMAT_UNDEFINED;
}
tcu::TextureFormat getDepthTextureFormat (const VkFormat depthStencilFormat)
{
return ((depthStencilFormat == VK_FORMAT_D24_UNORM_S8_UINT) ?
tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::UNSIGNED_INT_24_8_REV) :
tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::FLOAT));
}
tcu::TextureLevel generateColroImage (const tcu::TextureFormat format,
const UVec2& renderSize,
const int attachmentNdx)
{
tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
const float atchNdx = static_cast<float>(attachmentNdx);
const Vec4 greenColor = Vec4(0.0f, 1.0f, atchNdx * 0.15f, 1.0f);
const Vec4 yellowColor = Vec4(1.0f, 1.0f, atchNdx * 0.15f, 1.0f);
for (deUint32 y = 0; y < renderSize.y(); ++y)
{
for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
{
image.getAccess().setPixel(greenColor, x, y);
}
for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
{
image.getAccess().setPixel(yellowColor, x, y);
}
}
return image;
}
tcu::TextureLevel generateDepthImage (const tcu::TextureFormat format,
const UVec2& renderSize)
{
tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
const float value1 = 0.0f;
const float value2 = 0.2f;
for (deUint32 y = 0; y < renderSize.y(); ++y)
{
for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
{
image.getAccess().setPixDepth(value1, x, y);
}
for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
{
image.getAccess().setPixDepth(value2, x, y);
}
}
return image;
}
tcu::TextureLevel generateStencilImage (const tcu::TextureFormat format,
const UVec2& renderSize)
{
tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
const IVec4 value1 = IVec4(1,0,0,0);
const IVec4 value2 = IVec4(2,0,0,0);
for (deUint32 x = 0; x < renderSize.x(); ++x)
{
for (deUint32 y = 0; y < renderSize.y() / 2u; ++y)
{
image.getAccess().setPixel(value1, x, y);
}
for (deUint32 y = renderSize.y() / 2u; y < renderSize.y(); ++y)
{
image.getAccess().setPixel(value2, x, y);
}
}
return image;
}
void submitCommandsAndWait (const DeviceInterface& vk,
const VkDevice device,
const VkQueue queue,
const VkCommandBuffer commandBuffer,
const VkCommandBuffer commandBuffer2)
{
const Unique<VkFence> fence(createFence(vk, device));
const VkCommandBuffer cmdBuffers[2] = { commandBuffer, commandBuffer2 };
const VkSubmitInfo submitInfo =
{
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 waitSemaphoreCount;
DE_NULL, // const VkSemaphore* pWaitSemaphores;
DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
2u, // deUint32 commandBufferCount;
cmdBuffers, // const VkCommandBuffer* pCommandBuffers;
0u, // deUint32 signalSemaphoreCount;
nullptr, // const VkSemaphore* pSignalSemaphores;
};
VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
}
void beginSecondaryCmdBuffer (const DeviceInterface& vk,
const VkCommandBuffer commandBuffer,
VkRenderingFlagsKHR renderingFlags,
const deUint32 colorAttachmentCount,
const ImagesFormat& imagesFormat)
{
const VkFormat depthStencilFormat = (imagesFormat.depth != VK_FORMAT_UNDEFINED) ?
imagesFormat.depth : imagesFormat.stencil;
const VkCommandBufferInheritanceRenderingInfoKHR inheritanceRenderingInfo
{
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
renderingFlags, // VkRenderingFlagsKHR flags;
0u, // uint32_t viewMask;
colorAttachmentCount, // uint32_t colorAttachmentCount;
(colorAttachmentCount > 0) ? imagesFormat.colors : DE_NULL, // const VkFormat* pColorAttachmentFormats;
depthStencilFormat, // VkFormat depthAttachmentFormat;
depthStencilFormat, // VkFormat stencilAttachmentFormat;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
};
const VkCommandBufferInheritanceInfo bufferInheritanceInfo =
{
vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
&inheritanceRenderingInfo, // const void* pNext;
VK_NULL_HANDLE, // VkRenderPass renderPass;
0u, // deUint32 subpass;
VK_NULL_HANDLE, // VkFramebuffer framebuffer;
VK_FALSE, // VkBool32 occlusionQueryEnable;
(vk::VkQueryControlFlags)0u, // VkQueryControlFlags queryFlags;
(vk::VkQueryPipelineStatisticFlags)0u // VkQueryPipelineStatisticFlags pipelineStatistics;
};
const VkCommandBufferBeginInfo commandBufBeginParams =
{
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, // VkCommandBufferUsageFlags flags;
&bufferInheritanceInfo
};
VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
}
void beginSecondaryCmdBuffer(const DeviceInterface& vk,
const VkCommandBuffer commandBuffer)
{
const VkCommandBufferInheritanceInfo bufferInheritanceInfo =
{
vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
VK_NULL_HANDLE, // VkRenderPass renderPass;
0u, // deUint32 subpass;
VK_NULL_HANDLE, // VkFramebuffer framebuffer;
VK_FALSE, // VkBool32 occlusionQueryEnable;
(vk::VkQueryControlFlags)0u, // VkQueryControlFlags queryFlags;
(vk::VkQueryPipelineStatisticFlags)0u // VkQueryPipelineStatisticFlags pipelineStatistics;
};
const VkCommandBufferBeginInfo commandBufBeginParams =
{
VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
&bufferInheritanceInfo
};
VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
}
class DynamicRenderingTestInstance : public TestInstance
{
public:
DynamicRenderingTestInstance (Context& context,
const TestParameters& parameters);
protected:
virtual tcu::TestStatus iterate (void);
void initialize (void);
void createCmdBuffer (void);
virtual void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat);
void preBarier (const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat);
void beginRendering (VkCommandBuffer cmdBuffer,
const std::vector<VkImageView>& attachmentBindInfos,
const VkRenderingFlagsKHR flags,
const deUint32 colorAtchCount,
const ImagesFormat& imagesFormat,
const VkAttachmentLoadOp loadOp,
const VkAttachmentStoreOp storeOp);
void copyImgToBuff (VkCommandBuffer commandBuffer,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat);
void verifyResults (const deUint32 colorAtchCount,
const ImagesFormat& imagesFormat);
const TestParameters m_parameters;
VkFormat m_formatStencilDepthImage;
Move<VkImage> m_imageColor[COLOR_ATTACHMENTS_NUMBER];
Move<VkImage> m_imageStencilDepth;
Move<VkImageView> m_colorAttachmentView[COLOR_ATTACHMENTS_NUMBER];
Move<VkImageView> m_stencilDepthAttachmentView;
MovePtr<Allocation> m_imageColorAlloc[COLOR_ATTACHMENTS_NUMBER];
MovePtr<Allocation> m_imageStencilDepthAlloc;
SharedPtr<Buffer> m_imageBuffer[COLOR_ATTACHMENTS_NUMBER];
SharedPtr<Buffer> m_imageDepthBuffer;
SharedPtr<Buffer> m_imageStencilBuffer;
Move<VkShaderModule> m_vertexModule;
Move<VkShaderModule> m_fragmentModule;
SharedPtr<Buffer> m_vertexBuffer;
Move<VkPipelineLayout> m_pipelineLayout;
Move<VkCommandPool> m_cmdPool;
Move<VkCommandBuffer> m_cmdBuffer;
std::vector<tcu::TextureLevel> m_referenceImages;
};
DynamicRenderingTestInstance::DynamicRenderingTestInstance (Context& context,
const TestParameters& parameters)
: TestInstance (context)
, m_parameters (parameters)
{
const VkPhysicalDeviceDynamicRenderingFeaturesKHR& dynamicRenderingFeatures (context.getDynamicRenderingFeatures());
if (dynamicRenderingFeatures.dynamicRendering == DE_FALSE)
TCU_FAIL("dynamicRendering is not supported");
initialize();
createCmdBuffer();
}
tcu::TestStatus DynamicRenderingTestInstance::iterate (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
ImagesLayout imagesLayout
{
{
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_UNDEFINED
}, // oldColors
VK_IMAGE_LAYOUT_UNDEFINED, // oldLStencil
VK_IMAGE_LAYOUT_UNDEFINED, // oldDepth
};
for (int attachmentTest = 0; attachmentTest < TEST_ATTACHMENT_LAST; ++attachmentTest)
{
std::vector<VkImageView> attachmentBindInfos;
ImagesFormat imagesFormat
{
{
m_parameters.imageFormat,
m_parameters.imageFormat,
m_parameters.imageFormat,
m_parameters.imageFormat,
}, // colors
m_formatStencilDepthImage, // depth
m_formatStencilDepthImage, // stencil
};
deUint32 colorAtchCount = 0u;
switch(attachmentTest)
{
case TEST_ATTACHMENT_SINGLE_COLOR:
{
attachmentBindInfos.push_back(*m_colorAttachmentView[0]);
imagesFormat.depth = VK_FORMAT_UNDEFINED;
imagesFormat.stencil = VK_FORMAT_UNDEFINED;
colorAtchCount = 1u;
break;
}
case TEST_ATTACHMENT_DEPTH_ATTACHMENT:
{
attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
imagesFormat.colors[0] = VK_FORMAT_UNDEFINED;
imagesFormat.stencil = VK_FORMAT_UNDEFINED;
break;
}
case TEST_ATTACHMENT_STENCIL_ATTACHMENT:
{
attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
imagesFormat.colors[0] = VK_FORMAT_UNDEFINED;
imagesFormat.depth = VK_FORMAT_UNDEFINED;
break;
}
case TEST_ATTACHMENT_MULTIPLE_COLOR:
{
for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
colorAtchCount = COLOR_ATTACHMENTS_NUMBER;
imagesFormat.depth = VK_FORMAT_UNDEFINED;
imagesFormat.stencil = VK_FORMAT_UNDEFINED;
break;
}
case TEST_ATTACHMENT_ALL:
{
for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
colorAtchCount = COLOR_ATTACHMENTS_NUMBER;
break;
}
default:
DE_FATAL("Impossible");
};
Move<VkPipeline> pipeline = makeGraphicsPipeline(vk, device, *m_pipelineLayout,
*m_vertexModule, *m_fragmentModule,
m_parameters.renderSize, colorAtchCount, imagesFormat.colors,
((imagesFormat.depth == VK_FORMAT_UNDEFINED) ? imagesFormat.stencil : imagesFormat.depth));
rendering(*pipeline, attachmentBindInfos, colorAtchCount, imagesLayout, imagesFormat);
}
return tcu::TestStatus::pass("Pass");
}
void DynamicRenderingTestInstance::initialize (void)
{
const InstanceInterface& vki = m_context.getInstanceInterface();
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
const VkDevice device = m_context.getDevice();
Allocator& allocator = m_context.getDefaultAllocator();
// Vertices.
{
std::vector<Vec4> vertices;
// Draw a quad covering the whole renderarea
vertices.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4( 0.0f, 1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4( 0.0f, -1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4(1.0f, -1.0f, 0.2f, 1.0f));
vertices.push_back(Vec4(0.0f, -1.0f, 0.2f, 1.0f));
vertices.push_back(Vec4(1.0f, 1.0f, 0.2f, 1.0f));
vertices.push_back(Vec4(0.0f, 1.0f, 0.2f, 1.0f));
vertices.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4(-1.0f, 0.0f, 0.0f, 1.0f));
vertices.push_back(Vec4( 1.0f, 1.0f, 0.0f, 1.0f));
vertices.push_back(Vec4( 1.0f, 0.0f, 0.0f, 1.0f));
const VkDeviceSize bufferSize = sizeInBytes(vertices);
const VkBufferCreateInfo bufferInfo = makeBufferCreateInfo(bufferSize,
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
m_vertexBuffer = Buffer::createAndAlloc(vk, device,
bufferInfo,
allocator,
MemoryRequirement::HostVisible);
deMemcpy(m_vertexBuffer->getBoundMemory().getHostPtr(), vertices.data(), static_cast<std::size_t>(bufferSize));
flushAlloc(vk, device, m_vertexBuffer->getBoundMemory());
}
// Images color attachment.
{
const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
const VkDeviceSize imageBufferSize = m_parameters.renderSize.x() *
m_parameters.renderSize.y() *
tcu::getPixelSize(mapVkFormat(m_parameters.imageFormat));
const VkImageSubresourceRange imageSubresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
const VkImageCreateInfo imageInfo = makeImageCreateInfo(m_parameters.imageFormat,
m_parameters.renderSize, imageUsage);
const VkBufferCreateInfo bufferInfo = makeBufferCreateInfo(imageBufferSize,
VK_BUFFER_USAGE_TRANSFER_DST_BIT);
for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
{
m_imageColor[ndx] = makeImage(vk, device, imageInfo);
m_imageColorAlloc[ndx] = bindImage(vk, device, allocator, *m_imageColor[ndx], MemoryRequirement::Any);
m_imageBuffer[ndx] = Buffer::createAndAlloc(vk, device, bufferInfo,
allocator, MemoryRequirement::HostVisible);
m_colorAttachmentView[ndx] = makeImageView(vk, device, *m_imageColor[ndx],
VK_IMAGE_VIEW_TYPE_2D, m_parameters.imageFormat, imageSubresource);
const Allocation alloc = m_imageBuffer[ndx]->getBoundMemory();
deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferSize));
flushAlloc(vk, device, alloc);
}
}
//Image stencil and depth attachment.
{
m_formatStencilDepthImage = getSupportedStencilFormat(vki, physDevice);
const VkImageAspectFlags imageDepthStencilAspec = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
const VkImageSubresourceRange imageStencilSubresource = makeImageSubresourceRange(imageDepthStencilAspec, 0u, 1u, 0u, 1u);
const VkDeviceSize imageBufferStencilSize = m_parameters.renderSize.x() *
m_parameters.renderSize.y() *
tcu::getPixelSize(mapVkFormat(VK_FORMAT_S8_UINT));
const VkDeviceSize imageBufferDepthlSize = m_parameters.renderSize.x() *
m_parameters.renderSize.y() *
tcu::getPixelSize(getDepthTextureFormat(m_formatStencilDepthImage));
const VkImageUsageFlags imageStenciDepthlUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
const VkImageCreateInfo imageInfo = makeImageCreateInfo(m_formatStencilDepthImage,
m_parameters.renderSize, imageStenciDepthlUsage);
const VkBufferCreateInfo bufferStencilInfo = makeBufferCreateInfo(imageBufferStencilSize,
VK_BUFFER_USAGE_TRANSFER_DST_BIT);
const VkBufferCreateInfo bufferDepthlInfo = makeBufferCreateInfo(imageBufferDepthlSize,
VK_BUFFER_USAGE_TRANSFER_DST_BIT);
m_imageStencilDepth = makeImage(vk, device, imageInfo);
m_imageStencilDepthAlloc = bindImage(vk, device, allocator, *m_imageStencilDepth, MemoryRequirement::Any);
m_imageStencilBuffer = Buffer::createAndAlloc(vk, device, bufferStencilInfo,
allocator, MemoryRequirement::HostVisible);
m_imageDepthBuffer = Buffer::createAndAlloc(vk, device, bufferDepthlInfo,
allocator, MemoryRequirement::HostVisible);
m_stencilDepthAttachmentView = makeImageView(vk, device, *m_imageStencilDepth,
VK_IMAGE_VIEW_TYPE_2D, m_formatStencilDepthImage, imageStencilSubresource);
const Allocation alloc = m_imageStencilBuffer->getBoundMemory();
deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferStencilSize));
flushAlloc(vk, device, alloc);
const Allocation allocDepth = m_imageDepthBuffer->getBoundMemory();
deMemset(allocDepth.getHostPtr(), 0, static_cast<std::size_t>(imageBufferDepthlSize));
flushAlloc(vk, device, allocDepth);
}
m_pipelineLayout = makePipelineLayout(vk, device);
m_vertexModule = createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0u);
m_fragmentModule = createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0u);
for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
{
m_referenceImages.push_back(generateColroImage(mapVkFormat(m_parameters.imageFormat),
m_parameters.renderSize, ndx));
}
m_referenceImages.push_back(generateDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
m_parameters.renderSize));
m_referenceImages.push_back(generateStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
m_parameters.renderSize));
}
void DynamicRenderingTestInstance::createCmdBuffer (void)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_cmdPool = createCommandPool(vk, device,
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
m_context.getUniversalQueueFamilyIndex());
m_cmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool,
VK_COMMAND_BUFFER_LEVEL_PRIMARY);
}
void DynamicRenderingTestInstance::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
0,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
}
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
0,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
void DynamicRenderingTestInstance::preBarier (const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
std::vector<VkImageMemoryBarrier> barriers;
for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
{
const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
imagesLayout.oldColors[ndx],
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
*m_imageColor[ndx],
subresource);
barriers.push_back(barrier);
imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
}
if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
{
const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u);
const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
imagesLayout.oldDepth,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
*m_imageStencilDepth,
subresource);
imagesLayout.oldDepth = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
barriers.push_back(barrier);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
{
const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u);
const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
imagesLayout.oldStencil,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
*m_imageStencilDepth,
subresource);
imagesLayout.oldStencil = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
barriers.push_back(barrier);
}
cmdPipelineImageMemoryBarrier(vk,
*m_cmdBuffer,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
barriers.data(),
barriers.size());
}
void DynamicRenderingTestInstance::beginRendering (VkCommandBuffer cmdBuffer,
const std::vector<VkImageView>& attachmentBindInfos,
const VkRenderingFlagsKHR flags,
const deUint32 colorAtchCount,
const ImagesFormat& imagesFormat,
const VkAttachmentLoadOp loadOp,
const VkAttachmentStoreOp storeOp)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkClearValue clearValue = makeClearValueColor(m_parameters.clearColor);
const VkRect2D renderArea =
{
makeOffset2D(0, 0),
makeExtent2D(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
};
std::vector<VkRenderingAttachmentInfoKHR> attachments;
for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
{
const VkRenderingAttachmentInfoKHR renderingAtachInfo =
{
VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentBindInfos[ndx], // VkImageView imageView;
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
VK_NULL_HANDLE, // VkImageView resolveImageView;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
loadOp, // VkAttachmentLoadOp loadOp;
storeOp, // VkAttachmentStoreOp storeOp;
clearValue, // VkClearValue clearValue;
};
attachments.push_back(renderingAtachInfo);
}
if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
{
const VkRenderingAttachmentInfoKHR renderingAtachInfo =
{
VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentBindInfos[colorAtchCount], // VkImageView imageView;
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
VK_NULL_HANDLE, // VkImageView resolveImageView;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
loadOp, // VkAttachmentLoadOp loadOp;
storeOp, // VkAttachmentStoreOp storeOp;
clearValue, // VkClearValue clearValue;
};
attachments.push_back(renderingAtachInfo);
}
const deUint32 stencilNdx = colorAtchCount + ((imagesFormat.depth != VK_FORMAT_UNDEFINED) ? 1 : 0);
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
{
const VkRenderingAttachmentInfoKHR renderingAtachInfo =
{
VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
attachmentBindInfos[stencilNdx], // VkImageView imageView;
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
VK_NULL_HANDLE, // VkImageView resolveImageView;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
loadOp, // VkAttachmentLoadOp loadOp;
storeOp, // VkAttachmentStoreOp storeOp;
clearValue, // VkClearValue clearValue;
};
attachments.push_back(renderingAtachInfo);
}
const VkRenderingInfoKHR renderingInfo =
{
VK_STRUCTURE_TYPE_RENDERING_INFO_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
flags, // VkRenderingFlagsKHR flags;
renderArea, // VkRect2D renderArea;
1u, // deUint32 layerCount;
0u, // deUint32 viewMask;
colorAtchCount, // deUint32 colorAttachmentCount;
((colorAtchCount != 0) ? attachments.data() : DE_NULL), // const VkRenderingAttachmentInfoKHR* pColorAttachments;
((imagesFormat.depth != VK_FORMAT_UNDEFINED) ?
&attachments[colorAtchCount] :
DE_NULL), // const VkRenderingAttachmentInfoKHR* pDepthAttachment;
((imagesFormat.stencil != VK_FORMAT_UNDEFINED) ?
&attachments[stencilNdx] :
DE_NULL), // const VkRenderingAttachmentInfoKHR* pStencilAttachment;
};
vk.cmdBeginRendering(cmdBuffer, &renderingInfo);
}
void DynamicRenderingTestInstance::copyImgToBuff (VkCommandBuffer commandBuffer,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
{
for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
{
vk::copyImageToBuffer(vk, commandBuffer, *m_imageColor[ndx], m_imageBuffer[ndx]->object(),
tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, imagesLayout.oldColors[ndx], 1u,
VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_COLOR_BIT);
imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
}
}
if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
{
copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageDepthBuffer->object(),
tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldDepth,
1u, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT);
imagesLayout.oldDepth = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
{
copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageStencilBuffer->object(),
tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldStencil,
1u, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_ASPECT_STENCIL_BIT);
imagesLayout.oldStencil = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
}
}
void DynamicRenderingTestInstance::verifyResults (const deUint32 colorAtchCount,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
tcu::TestLog& log = m_context.getTestContext().getLog();
if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
{
for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
{
const Allocation allocColor = m_imageBuffer[ndx]->getBoundMemory();
invalidateAlloc(vk, device, allocColor);
const tcu::ConstPixelBufferAccess resultColorImage(mapVkFormat(m_parameters.imageFormat), m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u, allocColor.getHostPtr());
if (!tcu::floatThresholdCompare(log, "Compare Color Image", "Result comparison",
m_referenceImages[ndx].getAccess(), resultColorImage,
Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
{
TCU_FAIL("Rendered color image is not correct");
}
}
}
if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
{
const Allocation allocDepth = m_imageDepthBuffer->getBoundMemory();
invalidateAlloc(vk, device, allocDepth);
const tcu::ConstPixelBufferAccess resultDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
m_parameters.renderSize.x(),
m_parameters.renderSize.y(),
1u, allocDepth.getHostPtr());
if (m_formatStencilDepthImage == VK_FORMAT_D24_UNORM_S8_UINT)
{
de::MovePtr<tcu::TextureLevel> result(new tcu::TextureLevel(mapVkFormat(m_formatStencilDepthImage),
m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u));
tcu::copy(tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH), resultDepthImage);
const tcu::ConstPixelBufferAccess depthResult = tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH);
const tcu::ConstPixelBufferAccess expectedResult = tcu::getEffectiveDepthStencilAccess(m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), tcu::Sampler::MODE_DEPTH);
if (!tcu::intThresholdCompare(log, "Compare Depth Image", "Result comparison",
expectedResult, depthResult,UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
{
TCU_FAIL("Rendered depth image is not correct");
}
}
else
{
if (!tcu::floatThresholdCompare(log, "Compare Depth Image", "Result comparison",
m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), resultDepthImage,
Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
{
TCU_FAIL("Rendered depth image is not correct");
}
}
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
{
const Allocation allocStencil = m_imageStencilBuffer->getBoundMemory();
invalidateAlloc(vk, device, allocStencil);
const tcu::ConstPixelBufferAccess resultStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
m_parameters.renderSize.x(),
m_parameters.renderSize.y(),
1u, allocStencil.getHostPtr());
if (!tcu::intThresholdCompare(log, "Compare Stencil Image", "Result comparison",
m_referenceImages[COLOR_ATTACHMENTS_NUMBER + 1].getAccess(), resultStencilImage,
UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
{
TCU_FAIL("Rendered stencil image is not correct");
}
}
}
class SingleCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
SingleCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
};
SingleCmdBufferResuming::SingleCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
}
void SingleCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
}
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class TwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
TwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_cmdBuffer2;
};
TwoPrimaryCmdBufferResuming::TwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
}
void TwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
// First Primary CommandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
}
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
vk.cmdEndRendering(*m_cmdBuffer);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Second Primary CommandBuffer
beginCommandBuffer(vk, *m_cmdBuffer2);
beginRendering(*m_cmdBuffer2,
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(*m_cmdBuffer2, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
vk.cmdBindVertexBuffers(*m_cmdBuffer2, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
}
vk.cmdDraw(*m_cmdBuffer2, 4u, 1u, 4u, 0u);
vk.cmdEndRendering(*m_cmdBuffer2);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// First Primary CommandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
vk.cmdEndRendering(*m_cmdBuffer);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Second Primary CommandBuffer
beginCommandBuffer(vk, *m_cmdBuffer2);
beginRendering(*m_cmdBuffer2,
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer2,
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer2, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(*m_cmdBuffer2);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class TwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
TwoSecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffers[2];
};
TwoSecondaryCmdBufferResuming::TwoSecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void TwoSecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
VkCommandBuffer secCmdBuffers[2] = {
*(m_secCmdBuffers[0]),
*(m_secCmdBuffers[1])
};
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffersFirst
beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
beginRendering(secCmdBuffers[0],
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
vk.cmdEndRendering(secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffersSecond
beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
beginRendering(secCmdBuffers[1],
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
vk.cmdEndRendering(secCmdBuffers[1]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffersFirst
beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
beginRendering(secCmdBuffers[0],
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[0],
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
vk.cmdEndRendering(secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffersSecond
beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
beginRendering(secCmdBuffers[1],
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[1],
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(secCmdBuffers[1]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class TwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
TwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_cmdBuffer2;
Move<VkCommandBuffer> m_secCmdBuffers[2];
};
TwoSecondaryTwoPrimaryCmdBufferResuming::TwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void TwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
VkCommandBuffer secCmdBuffers[2] = {
*(m_secCmdBuffers[0]),
*(m_secCmdBuffers[1])
};
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffersFirst
beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
beginRendering(secCmdBuffers[0],
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
vk.cmdEndRendering(secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffersSecond
beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
beginRendering(secCmdBuffers[1],
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
vk.cmdEndRendering(secCmdBuffers[1]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Primary commandBuffer2
beginCommandBuffer(vk, *m_cmdBuffer2);
vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffersFirst
beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
beginRendering(secCmdBuffers[0],
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[0],
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
vk.cmdEndRendering(secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffersSecond
beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
beginRendering(secCmdBuffers[1],
attachmentBindInfos,
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[1],
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(secCmdBuffers[1]);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Primary commandBuffer2
beginCommandBuffer(vk, *m_cmdBuffer2);
vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsSecondaryCmdBuffer : public DynamicRenderingTestInstance
{
public:
ContentsSecondaryCmdBuffer (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffers;
};
ContentsSecondaryCmdBuffer::ContentsSecondaryCmdBuffer (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_secCmdBuffers = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void ContentsSecondaryCmdBuffer::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffers
beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(*m_secCmdBuffers, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(*m_secCmdBuffers, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 8u, 0u);
vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 0u, 0u);
vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 4u, 0u);
VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffers
beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(*m_secCmdBuffers,
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(*m_secCmdBuffers,
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsTwoSecondaryCmdBuffer : public DynamicRenderingTestInstance
{
public:
ContentsTwoSecondaryCmdBuffer (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffers[2];
};
ContentsTwoSecondaryCmdBuffer::ContentsTwoSecondaryCmdBuffer (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void ContentsTwoSecondaryCmdBuffer::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
VkCommandBuffer secCmdBuffers[2] = {
*(m_secCmdBuffers[0]),
*(m_secCmdBuffers[1])
};
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[0],
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[1],
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsTwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
ContentsTwoSecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffers[2];
};
ContentsTwoSecondaryCmdBufferResuming::ContentsTwoSecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void ContentsTwoSecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
VkCommandBuffer secCmdBuffers[2] = {
*(m_secCmdBuffers[0]),
*(m_secCmdBuffers[1])
};
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[0],
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[1],
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsTwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
ContentsTwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_cmdBuffer2;
Move<VkCommandBuffer> m_secCmdBuffers[2];
};
ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::ContentsTwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
VkCommandBuffer secCmdBuffers[2] = {
*(m_secCmdBuffers[0]),
*(m_secCmdBuffers[1])
};
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
vk.cmdEndRendering(*m_cmdBuffer);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Primary commandBuffer2
beginCommandBuffer(vk, *m_cmdBuffer2);
beginRendering(*m_cmdBuffer2,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
vk.cmdEndRendering(*m_cmdBuffer2);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffers
beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[0],
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
// secCmdBuffers2
beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(secCmdBuffers[1],
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
vk.cmdEndRendering(*m_cmdBuffer);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
// Primary commandBuffer2
beginCommandBuffer(vk, *m_cmdBuffer2);
beginRendering(*m_cmdBuffer2,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
vk.cmdEndRendering(*m_cmdBuffer2);
copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsPrimarySecondaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
ContentsPrimarySecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffer;
};
ContentsPrimarySecondaryCmdBufferResuming::ContentsPrimarySecondaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
m_secCmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
}
void ContentsPrimarySecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat)
{
const DeviceInterface& vk = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
{
const VkBuffer vertexBuffer = m_vertexBuffer->object();
const VkDeviceSize vertexBufferOffset = 0ull;
// secCmdBuffer
beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 4u, 0u);
VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
(static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
{
verifyResults(colorAtchCount, imagesFormat);
const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
// secCmdBuffer
beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
if (clearData.colorDepthClear1.size() != 0)
{
vk.cmdClearAttachments(*m_secCmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear1.size()),
clearData.colorDepthClear1.data(),
1, &clearData.rectColorDepth1);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
// Primary commandBuffer
beginCommandBuffer(vk, *m_cmdBuffer);
preBarier(colorAtchCount, imagesLayout, imagesFormat);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_SUSPENDING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
if (clearData.colorDepthClear2.size() != 0)
{
vk.cmdClearAttachments(*m_cmdBuffer,
static_cast<deUint32>(clearData.colorDepthClear2.size()),
clearData.colorDepthClear2.data(),
1, &clearData.rectColorDepth2);
}
if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
vk.cmdEndRendering(*m_cmdBuffer);
beginRendering(*m_cmdBuffer,
attachmentBindInfos,
VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
VK_RENDERING_RESUMING_BIT_KHR,
colorAtchCount,
imagesFormat,
static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
vk.cmdEndRendering(*m_cmdBuffer);
copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
verifyResults(colorAtchCount, imagesFormat);
}
}
}
class ContentsSecondaryPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
{
public:
ContentsSecondaryPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters);
protected:
void rendering (const VkPipeline pipeline,
const std::vector<VkImageView>& attachmentBindInfos,
const deUint32 colorAtchCount,
ImagesLayout& imagesLayout,
const ImagesFormat& imagesFormat) override;
Move<VkCommandBuffer> m_secCmdBuffer;
};
ContentsSecondaryPrimaryCmdBufferResuming::ContentsSecondaryPrimaryCmdBufferResuming (Context& context,
const TestParameters& parameters)
: DynamicRenderingTestInstance(context, parameters)
{
const DeviceInterface& vk = m_context.getDeviceInterface();