1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2021 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Vulkan Dynamic Rendering Tests
22 *//*--------------------------------------------------------------------*/
23
24 #include "deRandom.hpp"
25 #include "deUniquePtr.hpp"
26
27 #include "tcuImageCompare.hpp"
28 #include "tcuRGBA.hpp"
29 #include "tcuTestLog.hpp"
30 #include "tcuTextureUtil.hpp"
31 #include "tcuVectorUtil.hpp"
32
33 #include "vkBarrierUtil.hpp"
34 #include "vkBuilderUtil.hpp"
35 #include "vkCmdUtil.hpp"
36 #include "vktDrawBufferObjectUtil.hpp"
37 #include "vktDynamicRenderingTests.hpp"
38 #include "vkImageUtil.hpp"
39 #include "vkObjUtil.hpp"
40 #include "vkQueryUtil.hpp"
41 #include "vkRefUtil.hpp"
42 #include "vktTestGroupUtil.hpp"
43 #include "vktTestCase.hpp"
44 #include "vkTypeUtil.hpp"
45
46 #include <iostream>
47
48 namespace vkt
49 {
50 namespace renderpass
51 {
52 namespace
53 {
54
55 using namespace vk;
56 using namespace Draw;
57
58 using de::MovePtr;
59 using de::UniquePtr;
60 using de::SharedPtr;
61
62 using tcu::UVec2;
63 using tcu::Vec4;
64 using tcu::IVec4;
65 using tcu::UVec4;
66
67 constexpr auto VK_NULL_HANDLE = DE_NULL;
68 // maxColorAttachments is guaranteed to be at least 4.
69 constexpr deUint32 COLOR_ATTACHMENTS_NUMBER = 4;
70
71 constexpr deUint32 TEST_ATTACHMENT_LOAD_OP_LAST = 3;
72
73 enum TestType
74 {
75 // Draw two triangles in a single primary command buffer, beginning and ending the render pass instance.
76 TEST_TYPE_SINGLE_CMDBUF = 0,
77 // Draw two triangles in a single primary command buffer, but across two render pass instances, with the second RESUMING the first.
78 TEST_TYPE_SINGLE_CMDBUF_RESUMING,
79 // Draw two triangles in two primary command buffers, across two render pass instances, with the second RESUMING the first.
80 TEST_TYPE_TWO_CMDBUF_RESUMING,
81 // Draw two triangles in two secondary command buffers, across two render pass instances,
82 //with the second RESUMING the first, both recorded to the same primary command buffer.
83 TEST_TYPE_SECONDARY_CMDBUF_RESUMING,
84 // Draw two triangles in two secondary command buffers, across two render pass instances,
85 // with the second RESUMING the first, executed in the two primary command buffers.
86 TEST_TYPE_SECONDARY_CMDBUF_TWO_PRIMARY_RESUMING,
87 // Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in one secondary command buffer,
88 // and execute it inside a single render pass instance in one primary command buffer.
89 TEST_TYPE_CONTENTS_SECONDARY_COMMAND_BUFFER,
90 // Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
91 // and execute them inside a single render pass instance in one primary command buffer.
92 TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER,
93 // Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
94 // and execute them inside two render pass instances, with the second RESUMING the first, both recorded in the same primary command buffer.
95 TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER_RESUMING,
96 // Using CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw two triangles in two secondary command buffers,
97 // and execute them inside two render pass instances, with the second RESUMING the first, recorded into two primary command buffers.
98 TEST_TYPE_CONTENTS_2_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
99 // In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
100 // draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
101 // draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
102 TEST_TYPE_CONTENTS_PRIMARY_SECONDARY_COMDBUF_RESUMING,
103 // In one primary command buffer, record two render pass instances, with the second resuming the first.In the first,
104 // use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer,
105 // and execute it in that first render pass instance.In the second, draw one triangle directly in the primary command buffer.
106 TEST_TYPE_CONTENTS_SECONDARY_PRIMARY_COMDBUF_RESUMING,
107 // In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
108 // draw one triangle directly in the primary command buffer.For the second, use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR,
109 // draw the second triangle in a secondary command buffer, and execute it in that second render pass instance.
110 TEST_TYPE_CONTENTS_2_PRIMARY_SECONDARY_COMDBUF_RESUMING,
111 // In two primary command buffers, record two render pass instances(one in each), with the second resuming the first.In the first,
112 // use CONTENTS_SECONDARY_COMMAND_BUFFER_BIT_KHR, draw the first triangle in a secondary command buffer, and execute it in that first
113 // render pass instance.In the second, draw one triangle directly in the primary command buffer.
114 TEST_TYPE_CONTENTS_SECONDARY_2_PRIMARY_COMDBUF_RESUMING,
115 TEST_TYPE_LAST
116 };
117
118 enum TestAttachmentType
119 {
120 TEST_ATTACHMENT_SINGLE_COLOR = 0,
121 TEST_ATTACHMENT_DEPTH_ATTACHMENT,
122 TEST_ATTACHMENT_STENCIL_ATTACHMENT,
123 TEST_ATTACHMENT_MULTIPLE_COLOR,
124 TEST_ATTACHMENT_ALL,
125 TEST_ATTACHMENT_LAST
126 };
127
128 enum TestAttachmentStoreOp
129 {
130 TEST_ATTACHMENT_STORE_OP_STORE = VK_ATTACHMENT_STORE_OP_STORE,
131 TEST_ATTACHMENT_STORE_OP_DONT_CARE =VK_ATTACHMENT_STORE_OP_DONT_CARE,
132 TEST_ATTACHMENT_STORE_OP_LAST
133 };
134
135 struct TestParameters
136 {
137 TestType testType;
138 const Vec4 clearColor;
139 const VkFormat imageFormat;
140 const UVec2 renderSize;
141 };
142
143 struct ImagesLayout
144 {
145 VkImageLayout oldColors[COLOR_ATTACHMENTS_NUMBER];
146 VkImageLayout oldStencil;
147 VkImageLayout oldDepth;
148 };
149
150 struct ImagesFormat
151 {
152 VkFormat colors[COLOR_ATTACHMENTS_NUMBER];
153 VkFormat depth;
154 VkFormat stencil;
155 };
156
157 struct ClearAttachmentData
158 {
159 std::vector<VkClearAttachment> colorDepthClear1;
160 std::vector<VkClearAttachment> colorDepthClear2;
161 VkClearAttachment stencilClear1;
162 VkClearAttachment stencilClear2;
163 VkClearRect rectColorDepth1;
164 VkClearRect rectColorDepth2;
165 VkClearRect rectStencil1;
166 VkClearRect rectStencil2;
167
ClearAttachmentDatavkt::renderpass::__anona1bf8b7c0111::ClearAttachmentData168 ClearAttachmentData (const deUint32 colorAtchCount,
169 const VkFormat depth,
170 const VkFormat stencil)
171 {
172 if (colorAtchCount != 0)
173 {
174 for (deUint32 atchNdx = 0; atchNdx < colorAtchCount; ++atchNdx)
175 {
176 const VkClearAttachment green =
177 {
178 VK_IMAGE_ASPECT_COLOR_BIT,
179 atchNdx,
180 makeClearValueColorF32(0.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
181 };
182 colorDepthClear1.push_back(green);
183
184 const VkClearAttachment yellow =
185 {
186 VK_IMAGE_ASPECT_COLOR_BIT,
187 atchNdx,
188 makeClearValueColorF32(1.0f, 1.0f, static_cast<float>(atchNdx) * 0.15f, 1.0f)
189 };
190 colorDepthClear2.push_back(yellow);
191 }
192 }
193
194 if (depth != VK_FORMAT_UNDEFINED)
195 {
196 const VkClearAttachment zero =
197 {
198 VK_IMAGE_ASPECT_DEPTH_BIT,
199 0,
200 makeClearValueDepthStencil(0.0f, 0)
201 };
202 colorDepthClear1.push_back(zero);
203
204 const VkClearAttachment one =
205 {
206 VK_IMAGE_ASPECT_DEPTH_BIT,
207 0,
208 makeClearValueDepthStencil(0.2f, 0)
209 };
210 colorDepthClear2.push_back(one);
211 }
212
213 if (stencil != VK_FORMAT_UNDEFINED)
214 {
215 stencilClear1 =
216 {
217 VK_IMAGE_ASPECT_STENCIL_BIT,
218 0,
219 makeClearValueDepthStencil(0.0f, 1)
220 };
221
222 stencilClear2 =
223 {
224 VK_IMAGE_ASPECT_STENCIL_BIT,
225 0,
226 makeClearValueDepthStencil(0.0f, 2)
227 };
228
229 rectStencil1 =
230 {
231 makeRect2D(0, 0, 32, 16),
232 0u,
233 1u,
234 };
235
236 rectStencil2 =
237 {
238 makeRect2D(0, 16, 32, 16),
239 0u,
240 1u,
241 };
242 }
243
244 rectColorDepth1 =
245 {
246 makeRect2D(0, 0, 16, 32),
247 0u,
248 1u,
249 };
250
251 rectColorDepth2 =
252 {
253 makeRect2D(16, 0, 16, 32),
254 0u,
255 1u,
256 };
257 }
258 };
259
260 template<typename T>
sizeInBytes(const std::vector<T> & vec)261 inline VkDeviceSize sizeInBytes (const std::vector<T>& vec)
262 {
263 return vec.size() * sizeof(vec[0]);
264 }
265
makeImageCreateInfo(const VkFormat format,const UVec2 & size,VkImageUsageFlags usage)266 VkImageCreateInfo makeImageCreateInfo (const VkFormat format,
267 const UVec2& size,
268 VkImageUsageFlags usage)
269 {
270 const VkImageCreateInfo imageParams =
271 {
272 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
273 DE_NULL, // const void* pNext;
274 (VkImageCreateFlags)0, // VkImageCreateFlags flags;
275 VK_IMAGE_TYPE_2D, // VkImageType imageType;
276 format, // VkFormat format;
277 makeExtent3D(size.x(), size.y(), 1), // VkExtent3D extent;
278 1u, // deUint32 mipLevels;
279 1u, // deUint32 arrayLayers;
280 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
281 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
282 usage, // VkImageUsageFlags usage;
283 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
284 0u, // deUint32 queueFamilyIndexCount;
285 DE_NULL, // const deUint32* pQueueFamilyIndices;
286 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
287 };
288 return imageParams;
289 }
290
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 depthAttachmentFormat,const VkFormat stencilAttachmentFormat)291 Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk,
292 const VkDevice device,
293 const VkPipelineLayout pipelineLayout,
294 const VkShaderModule vertexModule,
295 const VkShaderModule fragmentModule,
296 const UVec2 renderSize,
297 const deUint32 colorAttachmentCount,
298 const VkFormat* pColorAttachmentFormats,
299 const VkFormat depthAttachmentFormat,
300 const VkFormat stencilAttachmentFormat)
301 {
302 const VkVertexInputBindingDescription vertexInputBindingDescription =
303 {
304 0u, // uint32_t binding;
305 sizeof(Vec4), // uint32_t stride;
306 VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
307 };
308
309 const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
310 {
311 {
312 0u, // uint32_t location;
313 0u, // uint32_t binding;
314 VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
315 0u, // uint32_t offset;
316 },
317 };
318
319 const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
320 {
321 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
322 DE_NULL, // const void* pNext;
323 (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags;
324 1u, // uint32_t vertexBindingDescriptionCount;
325 &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
326 DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions), // uint32_t vertexAttributeDescriptionCount;
327 vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
328 };
329
330 const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
331 {
332 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
333 DE_NULL, // const void* pNext;
334 (VkPipelineInputAssemblyStateCreateFlags)0, // VkPipelineInputAssemblyStateCreateFlags flags;
335 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, // VkPrimitiveTopology topology;
336 VK_FALSE, // VkBool32 primitiveRestartEnable;
337 };
338
339 VkViewport viewport = makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()), 0.0f, 1.0f);
340 const VkRect2D rectScissorRenderSize = { { 0, 0 }, { renderSize.x(), renderSize.y() } };
341
342 const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
343 {
344 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
345 DE_NULL, // const void* pNext;
346 (VkPipelineViewportStateCreateFlags)0, // VkPipelineViewportStateCreateFlags flags;
347 1u, // uint32_t viewportCount;
348 &viewport, // const VkViewport* pViewports;
349 1u, // uint32_t scissorCount;
350 &rectScissorRenderSize, // const VkRect2D* pScissors;
351 };
352
353 const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
354 {
355 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
356 DE_NULL, // const void* pNext;
357 (VkPipelineRasterizationStateCreateFlags)0, // VkPipelineRasterizationStateCreateFlags flags;
358 VK_FALSE, // VkBool32 depthClampEnable;
359 VK_FALSE, // VkBool32 rasterizerDiscardEnable;
360 VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
361 VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
362 VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
363 VK_FALSE, // VkBool32 depthBiasEnable;
364 0.0f, // float depthBiasConstantFactor;
365 0.0f, // float depthBiasClamp;
366 0.0f, // float depthBiasSlopeFactor;
367 1.0f, // float lineWidth;
368 };
369
370 const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
371 {
372 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
373 DE_NULL, // const void* pNext;
374 (VkPipelineMultisampleStateCreateFlags)0, // VkPipelineMultisampleStateCreateFlags flags;
375 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
376 VK_FALSE, // VkBool32 sampleShadingEnable;
377 0.0f, // float minSampleShading;
378 DE_NULL, // const VkSampleMask* pSampleMask;
379 VK_FALSE, // VkBool32 alphaToCoverageEnable;
380 VK_FALSE // VkBool32 alphaToOneEnable;
381 };
382
383 const VkStencilOpState stencilOp = makeStencilOpState(
384 VK_STENCIL_OP_ZERO, // stencil fail
385 VK_STENCIL_OP_INCREMENT_AND_CLAMP, // depth & stencil pass
386 VK_STENCIL_OP_INCREMENT_AND_CLAMP, // depth only fail
387 VK_COMPARE_OP_NOT_EQUAL, // compare op
388 240u, // compare mask
389 255u, // write mask
390 255u); // reference
391
392 VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
393 {
394 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
395 DE_NULL, // const void* pNext;
396 (VkPipelineDepthStencilStateCreateFlags)0, // VkPipelineDepthStencilStateCreateFlags flags;
397 VK_TRUE, // VkBool32 depthTestEnable;
398 VK_TRUE, // VkBool32 depthWriteEnable;
399 VK_COMPARE_OP_ALWAYS, // VkCompareOp depthCompareOp;
400 VK_FALSE, // VkBool32 depthBoundsTestEnable;
401 VK_TRUE, // VkBool32 stencilTestEnable;
402 stencilOp, // VkStencilOpState front;
403 stencilOp, // VkStencilOpState back;
404 0.0f, // float minDepthBounds;
405 1.0f, // float maxDepthBounds;
406 };
407
408 const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT |
409 VK_COLOR_COMPONENT_G_BIT |
410 VK_COLOR_COMPONENT_B_BIT |
411 VK_COLOR_COMPONENT_A_BIT;
412
413 std::vector<VkPipelineColorBlendAttachmentState> colorBlendAttachmentState;
414
415 for (deUint32 ndx = 0 ; ndx < colorAttachmentCount; ++ndx)
416 {
417 const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
418 {
419 VK_FALSE, // VkBool32 blendEnable;
420 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor;
421 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor;
422 VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
423 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor;
424 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor;
425 VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
426 colorComponentsAll, // VkColorComponentFlags colorWriteMask;
427 };
428
429 colorBlendAttachmentState.push_back(pipelineColorBlendAttachmentState);
430 }
431
432 const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
433 {
434 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
435 DE_NULL, // const void* pNext;
436 (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags;
437 VK_FALSE, // VkBool32 logicOpEnable;
438 VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
439 colorAttachmentCount, // deUint32 attachmentCount;
440 colorBlendAttachmentState.data(), // const VkPipelineColorBlendAttachmentState* pAttachments;
441 { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4];
442 };
443
444 const VkPipelineShaderStageCreateInfo pShaderStages[] =
445 {
446 {
447 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
448 DE_NULL, // const void* pNext;
449 (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
450 VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage;
451 vertexModule, // VkShaderModule module;
452 "main", // const char* pName;
453 DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
454 },
455 {
456 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
457 DE_NULL, // const void* pNext;
458 (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
459 VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage;
460 fragmentModule, // VkShaderModule module;
461 "main", // const char* pName;
462 DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
463 },
464 };
465
466 const VkPipelineRenderingCreateInfoKHR renderingCreateInfo
467 {
468 VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR, // VkStructureType sType;
469 DE_NULL, // const void* pNext;
470 0u, // deUint32 viewMask;
471 colorAttachmentCount, // deUint32 colorAttachmentCount;
472 pColorAttachmentFormats, // const VkFormat* pColorAttachmentFormats;
473 depthAttachmentFormat, // VkFormat depthAttachmentFormat;
474 stencilAttachmentFormat, // VkFormat stencilAttachmentFormat;
475 };
476
477 const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
478 {
479 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
480 &renderingCreateInfo, // const void* pNext;
481 (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags;
482 2u, // deUint32 stageCount;
483 pShaderStages, // const VkPipelineShaderStageCreateInfo* pStages;
484 &vertexInputStateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
485 &pipelineInputAssemblyStateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
486 DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
487 &pipelineViewportStateInfo, // const VkPipelineViewportStateCreateInfo* pViewportState;
488 &pipelineRasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
489 &pipelineMultisampleStateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
490 &pipelineDepthStencilStateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
491 &pipelineColorBlendStateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
492 DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
493 pipelineLayout, // VkPipelineLayout layout;
494 VK_NULL_HANDLE, // VkRenderPass renderPass;
495 0u, // deUint32 subpass;
496 DE_NULL, // VkPipeline basePipelineHandle;
497 0, // deInt32 basePipelineIndex;
498 };
499
500 return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
501 }
502
getSupportedStencilFormat(const InstanceInterface & vki,VkPhysicalDevice physDev)503 VkFormat getSupportedStencilFormat (const InstanceInterface& vki,
504 VkPhysicalDevice physDev)
505 {
506 const VkFormat formatList[] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT };
507 const VkFormatFeatureFlags requirements = (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT |
508 VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
509
510 for (int i = 0; i < DE_LENGTH_OF_ARRAY(formatList); ++i)
511 {
512 const auto properties = getPhysicalDeviceFormatProperties(vki, physDev, formatList[i]);
513 if ((properties.optimalTilingFeatures & requirements) == requirements)
514 return formatList[i];
515 }
516
517 return VK_FORMAT_UNDEFINED;
518 }
519
getDepthTextureFormat(const VkFormat depthStencilFormat)520 tcu::TextureFormat getDepthTextureFormat (const VkFormat depthStencilFormat)
521 {
522 return ((depthStencilFormat == VK_FORMAT_D24_UNORM_S8_UINT) ?
523 tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::UNSIGNED_INT_24_8_REV) :
524 tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::FLOAT));
525 }
526
generateColroImage(const tcu::TextureFormat format,const UVec2 & renderSize,const int attachmentNdx)527 tcu::TextureLevel generateColroImage (const tcu::TextureFormat format,
528 const UVec2& renderSize,
529 const int attachmentNdx)
530 {
531 tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
532 const float atchNdx = static_cast<float>(attachmentNdx);
533 const Vec4 greenColor = Vec4(0.0f, 1.0f, atchNdx * 0.15f, 1.0f);
534 const Vec4 yellowColor = Vec4(1.0f, 1.0f, atchNdx * 0.15f, 1.0f);
535
536 for (deUint32 y = 0; y < renderSize.y(); ++y)
537 {
538 for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
539 {
540 image.getAccess().setPixel(greenColor, x, y);
541 }
542 for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
543 {
544 image.getAccess().setPixel(yellowColor, x, y);
545 }
546 }
547
548 return image;
549 }
550
generateDepthImage(const tcu::TextureFormat format,const UVec2 & renderSize)551 tcu::TextureLevel generateDepthImage (const tcu::TextureFormat format,
552 const UVec2& renderSize)
553 {
554 tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
555 const float value1 = 0.0f;
556 const float value2 = 0.2f;
557
558 for (deUint32 y = 0; y < renderSize.y(); ++y)
559 {
560 for (deUint32 x = 0; x < renderSize.x() / 2u; ++x)
561 {
562 image.getAccess().setPixDepth(value1, x, y);
563 }
564 for (deUint32 x = renderSize.x() / 2u; x < renderSize.x(); ++x)
565 {
566 image.getAccess().setPixDepth(value2, x, y);
567 }
568 }
569
570 return image;
571 }
572
generateStencilImage(const tcu::TextureFormat format,const UVec2 & renderSize)573 tcu::TextureLevel generateStencilImage (const tcu::TextureFormat format,
574 const UVec2& renderSize)
575 {
576 tcu::TextureLevel image (format, renderSize.x(), renderSize.y());
577 const IVec4 value1 = IVec4(1,0,0,0);
578 const IVec4 value2 = IVec4(2,0,0,0);
579
580 for (deUint32 x = 0; x < renderSize.x(); ++x)
581 {
582 for (deUint32 y = 0; y < renderSize.y() / 2u; ++y)
583 {
584 image.getAccess().setPixel(value1, x, y);
585 }
586 for (deUint32 y = renderSize.y() / 2u; y < renderSize.y(); ++y)
587 {
588 image.getAccess().setPixel(value2, x, y);
589 }
590 }
591
592 return image;
593 }
594
submitCommandsAndWait(const DeviceInterface & vk,const VkDevice device,const VkQueue queue,const VkCommandBuffer commandBuffer,const VkCommandBuffer commandBuffer2)595 void submitCommandsAndWait (const DeviceInterface& vk,
596 const VkDevice device,
597 const VkQueue queue,
598 const VkCommandBuffer commandBuffer,
599 const VkCommandBuffer commandBuffer2)
600 {
601 const Unique<VkFence> fence(createFence(vk, device));
602 const VkCommandBuffer cmdBuffers[2] = { commandBuffer, commandBuffer2 };
603
604 const VkSubmitInfo submitInfo =
605 {
606 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
607 DE_NULL, // const void* pNext;
608 0u, // deUint32 waitSemaphoreCount;
609 DE_NULL, // const VkSemaphore* pWaitSemaphores;
610 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
611 2u, // deUint32 commandBufferCount;
612 cmdBuffers, // const VkCommandBuffer* pCommandBuffers;
613 0u, // deUint32 signalSemaphoreCount;
614 nullptr, // const VkSemaphore* pSignalSemaphores;
615 };
616
617 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
618 VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
619 }
620
beginSecondaryCmdBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,VkRenderingFlagsKHR renderingFlags,const deUint32 colorAttachmentCount,const ImagesFormat & imagesFormat)621 void beginSecondaryCmdBuffer (const DeviceInterface& vk,
622 const VkCommandBuffer commandBuffer,
623 VkRenderingFlagsKHR renderingFlags,
624 const deUint32 colorAttachmentCount,
625 const ImagesFormat& imagesFormat)
626 {
627 const VkCommandBufferInheritanceRenderingInfoKHR inheritanceRenderingInfo
628 {
629 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR, // VkStructureType sType;
630 DE_NULL, // const void* pNext;
631 renderingFlags, // VkRenderingFlagsKHR flags;
632 0u, // uint32_t viewMask;
633 colorAttachmentCount, // uint32_t colorAttachmentCount;
634 (colorAttachmentCount > 0) ? imagesFormat.colors : DE_NULL, // const VkFormat* pColorAttachmentFormats;
635 imagesFormat.depth, // VkFormat depthAttachmentFormat;
636 imagesFormat.stencil, // VkFormat stencilAttachmentFormat;
637 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
638 };
639
640 const VkCommandBufferInheritanceInfo bufferInheritanceInfo =
641 {
642 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
643 &inheritanceRenderingInfo, // const void* pNext;
644 VK_NULL_HANDLE, // VkRenderPass renderPass;
645 0u, // deUint32 subpass;
646 VK_NULL_HANDLE, // VkFramebuffer framebuffer;
647 VK_FALSE, // VkBool32 occlusionQueryEnable;
648 (vk::VkQueryControlFlags)0u, // VkQueryControlFlags queryFlags;
649 (vk::VkQueryPipelineStatisticFlags)0u // VkQueryPipelineStatisticFlags pipelineStatistics;
650 };
651
652 const VkCommandBufferBeginInfo commandBufBeginParams =
653 {
654 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
655 DE_NULL, // const void* pNext;
656 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
657 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, // VkCommandBufferUsageFlags flags;
658 &bufferInheritanceInfo
659 };
660 VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
661 }
662
beginSecondaryCmdBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer)663 void beginSecondaryCmdBuffer(const DeviceInterface& vk,
664 const VkCommandBuffer commandBuffer)
665 {
666 const VkCommandBufferInheritanceInfo bufferInheritanceInfo =
667 {
668 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
669 DE_NULL, // const void* pNext;
670 VK_NULL_HANDLE, // VkRenderPass renderPass;
671 0u, // deUint32 subpass;
672 VK_NULL_HANDLE, // VkFramebuffer framebuffer;
673 VK_FALSE, // VkBool32 occlusionQueryEnable;
674 (vk::VkQueryControlFlags)0u, // VkQueryControlFlags queryFlags;
675 (vk::VkQueryPipelineStatisticFlags)0u // VkQueryPipelineStatisticFlags pipelineStatistics;
676 };
677
678 const VkCommandBufferBeginInfo commandBufBeginParams =
679 {
680 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
681 DE_NULL, // const void* pNext;
682 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
683 &bufferInheritanceInfo
684 };
685 VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
686 }
687
688 class DynamicRenderingTestInstance : public TestInstance
689 {
690 public:
691 DynamicRenderingTestInstance (Context& context,
692 const TestParameters& parameters);
693 protected:
694 virtual tcu::TestStatus iterate (void);
695 void initialize (void);
696 void createCmdBuffer (void);
697 virtual void rendering (const VkPipeline pipeline,
698 const std::vector<VkImageView>& attachmentBindInfos,
699 const deUint32 colorAtchCount,
700 ImagesLayout& imagesLayout,
701 const ImagesFormat& imagesFormat);
702 void preBarier (const deUint32 colorAtchCount,
703 ImagesLayout& imagesLayout,
704 const ImagesFormat& imagesFormat);
705 void beginRendering (VkCommandBuffer cmdBuffer,
706 const std::vector<VkImageView>& attachmentBindInfos,
707 const VkRenderingFlagsKHR flags,
708 const deUint32 colorAtchCount,
709 const ImagesFormat& imagesFormat,
710 const VkAttachmentLoadOp loadOp,
711 const VkAttachmentStoreOp storeOp);
712 void copyImgToBuff (VkCommandBuffer commandBuffer,
713 const deUint32 colorAtchCount,
714 ImagesLayout& imagesLayout,
715 const ImagesFormat& imagesFormat);
716 void verifyResults (const deUint32 colorAtchCount,
717 const ImagesFormat& imagesFormat);
718
719 const TestParameters m_parameters;
720 VkFormat m_formatStencilDepthImage;
721 Move<VkImage> m_imageColor[COLOR_ATTACHMENTS_NUMBER];
722 Move<VkImage> m_imageStencilDepth;
723 Move<VkImageView> m_colorAttachmentView[COLOR_ATTACHMENTS_NUMBER];
724 Move<VkImageView> m_stencilDepthAttachmentView;
725 MovePtr<Allocation> m_imageColorAlloc[COLOR_ATTACHMENTS_NUMBER];
726 MovePtr<Allocation> m_imageStencilDepthAlloc;
727 SharedPtr<Buffer> m_imageBuffer[COLOR_ATTACHMENTS_NUMBER];
728 SharedPtr<Buffer> m_imageDepthBuffer;
729 SharedPtr<Buffer> m_imageStencilBuffer;
730
731 Move<VkShaderModule> m_vertexModule;
732 Move<VkShaderModule> m_fragmentModule;
733 SharedPtr<Buffer> m_vertexBuffer;
734 Move<VkPipelineLayout> m_pipelineLayout;
735
736 Move<VkCommandPool> m_cmdPool;
737 Move<VkCommandBuffer> m_cmdBuffer;
738
739 std::vector<tcu::TextureLevel> m_referenceImages;
740 };
741
DynamicRenderingTestInstance(Context & context,const TestParameters & parameters)742 DynamicRenderingTestInstance::DynamicRenderingTestInstance (Context& context,
743 const TestParameters& parameters)
744 : TestInstance (context)
745 , m_parameters (parameters)
746 {
747 const VkPhysicalDeviceDynamicRenderingFeaturesKHR& dynamicRenderingFeatures (context.getDynamicRenderingFeatures());
748
749 if (dynamicRenderingFeatures.dynamicRendering == DE_FALSE)
750 TCU_FAIL("dynamicRendering is not supported");
751
752 initialize();
753 createCmdBuffer();
754 }
755
iterate(void)756 tcu::TestStatus DynamicRenderingTestInstance::iterate (void)
757 {
758 const DeviceInterface& vk = m_context.getDeviceInterface();
759 const VkDevice device = m_context.getDevice();
760
761 ImagesLayout imagesLayout
762 {
763 {
764 VK_IMAGE_LAYOUT_UNDEFINED,
765 VK_IMAGE_LAYOUT_UNDEFINED,
766 VK_IMAGE_LAYOUT_UNDEFINED,
767 VK_IMAGE_LAYOUT_UNDEFINED
768 }, // oldColors
769 VK_IMAGE_LAYOUT_UNDEFINED, // oldLStencil
770 VK_IMAGE_LAYOUT_UNDEFINED, // oldDepth
771 };
772
773 for (int attachmentTest = 0; attachmentTest < TEST_ATTACHMENT_LAST; ++attachmentTest)
774 {
775 std::vector<VkImageView> attachmentBindInfos;
776
777 ImagesFormat imagesFormat
778 {
779 {
780 m_parameters.imageFormat,
781 m_parameters.imageFormat,
782 m_parameters.imageFormat,
783 m_parameters.imageFormat,
784 }, // colors
785 m_formatStencilDepthImage, // depth
786 m_formatStencilDepthImage, // stencil
787 };
788
789 deUint32 colorAtchCount = 0u;
790
791 switch(attachmentTest)
792 {
793 case TEST_ATTACHMENT_SINGLE_COLOR:
794 {
795 attachmentBindInfos.push_back(*m_colorAttachmentView[0]);
796 imagesFormat.depth = VK_FORMAT_UNDEFINED;
797 imagesFormat.stencil = VK_FORMAT_UNDEFINED;
798 colorAtchCount = 1u;
799 break;
800 }
801 case TEST_ATTACHMENT_DEPTH_ATTACHMENT:
802 {
803 attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
804 imagesFormat.colors[0] = VK_FORMAT_UNDEFINED;
805 imagesFormat.stencil = VK_FORMAT_UNDEFINED;
806 break;
807 }
808 case TEST_ATTACHMENT_STENCIL_ATTACHMENT:
809 {
810 attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
811 imagesFormat.colors[0] = VK_FORMAT_UNDEFINED;
812 imagesFormat.depth = VK_FORMAT_UNDEFINED;
813 break;
814 }
815 case TEST_ATTACHMENT_MULTIPLE_COLOR:
816 {
817 for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
818 attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
819
820 colorAtchCount = COLOR_ATTACHMENTS_NUMBER;
821 imagesFormat.depth = VK_FORMAT_UNDEFINED;
822 imagesFormat.stencil = VK_FORMAT_UNDEFINED;
823 break;
824 }
825 case TEST_ATTACHMENT_ALL:
826 {
827 for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ndx++)
828 attachmentBindInfos.push_back(*m_colorAttachmentView[ndx]);
829
830 attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
831 attachmentBindInfos.push_back(*m_stencilDepthAttachmentView);
832
833 colorAtchCount = COLOR_ATTACHMENTS_NUMBER;
834 break;
835 }
836 default:
837 DE_FATAL("Impossible");
838 };
839 Move<VkPipeline> pipeline = makeGraphicsPipeline(vk, device, *m_pipelineLayout,
840 *m_vertexModule, *m_fragmentModule,
841 m_parameters.renderSize, colorAtchCount, imagesFormat.colors,
842 imagesFormat.depth, imagesFormat.stencil);
843
844 rendering(*pipeline, attachmentBindInfos, colorAtchCount, imagesLayout, imagesFormat);
845 }
846 return tcu::TestStatus::pass("Pass");
847 }
848
initialize(void)849 void DynamicRenderingTestInstance::initialize (void)
850 {
851 const InstanceInterface& vki = m_context.getInstanceInterface();
852 const DeviceInterface& vk = m_context.getDeviceInterface();
853 const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
854 const VkDevice device = m_context.getDevice();
855 Allocator& allocator = m_context.getDefaultAllocator();
856
857 // Vertices.
858 {
859 std::vector<Vec4> vertices;
860
861 // Draw a quad covering the whole renderarea
862 vertices.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f));
863 vertices.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
864 vertices.push_back(Vec4( 0.0f, 1.0f, 0.0f, 1.0f));
865 vertices.push_back(Vec4( 0.0f, -1.0f, 0.0f, 1.0f));
866
867 vertices.push_back(Vec4(1.0f, -1.0f, 0.2f, 1.0f));
868 vertices.push_back(Vec4(0.0f, -1.0f, 0.2f, 1.0f));
869 vertices.push_back(Vec4(1.0f, 1.0f, 0.2f, 1.0f));
870 vertices.push_back(Vec4(0.0f, 1.0f, 0.2f, 1.0f));
871
872 vertices.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f));
873 vertices.push_back(Vec4(-1.0f, 0.0f, 0.0f, 1.0f));
874 vertices.push_back(Vec4( 1.0f, 1.0f, 0.0f, 1.0f));
875 vertices.push_back(Vec4( 1.0f, 0.0f, 0.0f, 1.0f));
876
877 const VkDeviceSize bufferSize = sizeInBytes(vertices);
878 const VkBufferCreateInfo bufferInfo = makeBufferCreateInfo(bufferSize,
879 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
880
881 m_vertexBuffer = Buffer::createAndAlloc(vk, device,
882 bufferInfo,
883 allocator,
884 MemoryRequirement::HostVisible);
885 deMemcpy(m_vertexBuffer->getBoundMemory().getHostPtr(), vertices.data(), static_cast<std::size_t>(bufferSize));
886 flushAlloc(vk, device, m_vertexBuffer->getBoundMemory());
887 }
888
889 // Images color attachment.
890 {
891 const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
892 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
893 const VkDeviceSize imageBufferSize = m_parameters.renderSize.x() *
894 m_parameters.renderSize.y() *
895 tcu::getPixelSize(mapVkFormat(m_parameters.imageFormat));
896 const VkImageSubresourceRange imageSubresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
897 const VkImageCreateInfo imageInfo = makeImageCreateInfo(m_parameters.imageFormat,
898 m_parameters.renderSize, imageUsage);
899 const VkBufferCreateInfo bufferInfo = makeBufferCreateInfo(imageBufferSize,
900 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
901
902 for(deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
903 {
904 m_imageColor[ndx] = makeImage(vk, device, imageInfo);
905 m_imageColorAlloc[ndx] = bindImage(vk, device, allocator, *m_imageColor[ndx], MemoryRequirement::Any);
906 m_imageBuffer[ndx] = Buffer::createAndAlloc(vk, device, bufferInfo,
907 allocator, MemoryRequirement::HostVisible);
908 m_colorAttachmentView[ndx] = makeImageView(vk, device, *m_imageColor[ndx],
909 VK_IMAGE_VIEW_TYPE_2D, m_parameters.imageFormat, imageSubresource);
910
911 const Allocation alloc = m_imageBuffer[ndx]->getBoundMemory();
912 deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferSize));
913 flushAlloc(vk, device, alloc);
914 }
915 }
916
917 //Image stencil and depth attachment.
918 {
919 m_formatStencilDepthImage = getSupportedStencilFormat(vki, physDevice);
920
921 const VkImageAspectFlags imageDepthStencilAspec = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
922 const VkImageSubresourceRange imageStencilSubresource = makeImageSubresourceRange(imageDepthStencilAspec, 0u, 1u, 0u, 1u);
923 const VkDeviceSize imageBufferStencilSize = m_parameters.renderSize.x() *
924 m_parameters.renderSize.y() *
925 tcu::getPixelSize(mapVkFormat(VK_FORMAT_S8_UINT));
926 const VkDeviceSize imageBufferDepthlSize = m_parameters.renderSize.x() *
927 m_parameters.renderSize.y() *
928 tcu::getPixelSize(getDepthTextureFormat(m_formatStencilDepthImage));
929
930 const VkImageUsageFlags imageStenciDepthlUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
931 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
932 const VkImageCreateInfo imageInfo = makeImageCreateInfo(m_formatStencilDepthImage,
933 m_parameters.renderSize, imageStenciDepthlUsage);
934 const VkBufferCreateInfo bufferStencilInfo = makeBufferCreateInfo(imageBufferStencilSize,
935 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
936 const VkBufferCreateInfo bufferDepthlInfo = makeBufferCreateInfo(imageBufferDepthlSize,
937 VK_BUFFER_USAGE_TRANSFER_DST_BIT);
938
939 m_imageStencilDepth = makeImage(vk, device, imageInfo);
940 m_imageStencilDepthAlloc = bindImage(vk, device, allocator, *m_imageStencilDepth, MemoryRequirement::Any);
941
942 m_imageStencilBuffer = Buffer::createAndAlloc(vk, device, bufferStencilInfo,
943 allocator, MemoryRequirement::HostVisible);
944 m_imageDepthBuffer = Buffer::createAndAlloc(vk, device, bufferDepthlInfo,
945 allocator, MemoryRequirement::HostVisible);
946 m_stencilDepthAttachmentView = makeImageView(vk, device, *m_imageStencilDepth,
947 VK_IMAGE_VIEW_TYPE_2D, m_formatStencilDepthImage, imageStencilSubresource);
948
949 const Allocation alloc = m_imageStencilBuffer->getBoundMemory();
950 deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(imageBufferStencilSize));
951 flushAlloc(vk, device, alloc);
952
953 const Allocation allocDepth = m_imageDepthBuffer->getBoundMemory();
954 deMemset(allocDepth.getHostPtr(), 0, static_cast<std::size_t>(imageBufferDepthlSize));
955 flushAlloc(vk, device, allocDepth);
956 }
957
958 m_pipelineLayout = makePipelineLayout(vk, device);
959 m_vertexModule = createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0u);
960 m_fragmentModule = createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0u);
961
962 for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
963 {
964 m_referenceImages.push_back(generateColroImage(mapVkFormat(m_parameters.imageFormat),
965 m_parameters.renderSize, ndx));
966 }
967
968 m_referenceImages.push_back(generateDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
969 m_parameters.renderSize));
970
971 m_referenceImages.push_back(generateStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
972 m_parameters.renderSize));
973 }
974
createCmdBuffer(void)975 void DynamicRenderingTestInstance::createCmdBuffer (void)
976 {
977 const DeviceInterface& vk = m_context.getDeviceInterface();
978 const VkDevice device = m_context.getDevice();
979
980 m_cmdPool = createCommandPool(vk, device,
981 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
982 m_context.getUniversalQueueFamilyIndex());
983 m_cmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool,
984 VK_COMMAND_BUFFER_LEVEL_PRIMARY);
985 }
986
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)987 void DynamicRenderingTestInstance::rendering (const VkPipeline pipeline,
988 const std::vector<VkImageView>& attachmentBindInfos,
989 const deUint32 colorAtchCount,
990 ImagesLayout& imagesLayout,
991 const ImagesFormat& imagesFormat)
992 {
993 const DeviceInterface& vk = m_context.getDeviceInterface();
994 const VkDevice device = m_context.getDevice();
995 const VkQueue queue = m_context.getUniversalQueue();
996
997 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
998 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
999 {
1000
1001 beginCommandBuffer(vk, *m_cmdBuffer);
1002 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1003
1004 beginRendering(*m_cmdBuffer,
1005 attachmentBindInfos,
1006 0,
1007 colorAtchCount,
1008 imagesFormat,
1009 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1010 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1011
1012 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1013
1014 {
1015 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1016 const VkDeviceSize vertexBufferOffset = 0ull;
1017 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1018 }
1019
1020 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1021 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1022 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
1023
1024 vk.cmdEndRendering(*m_cmdBuffer);
1025
1026 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1027
1028 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1029 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1030
1031 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1032 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1033 {
1034 verifyResults(colorAtchCount, imagesFormat);
1035
1036 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1037
1038 beginCommandBuffer(vk, *m_cmdBuffer);
1039 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1040
1041 beginRendering(*m_cmdBuffer,
1042 attachmentBindInfos,
1043 0,
1044 colorAtchCount,
1045 imagesFormat,
1046 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1047 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1048
1049 if (clearData.colorDepthClear1.size() != 0)
1050 {
1051 vk.cmdClearAttachments(*m_cmdBuffer,
1052 static_cast<deUint32>(clearData.colorDepthClear1.size()),
1053 clearData.colorDepthClear1.data(),
1054 1, &clearData.rectColorDepth1);
1055 }
1056
1057 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1058 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1059
1060 if (clearData.colorDepthClear2.size() != 0)
1061 {
1062 vk.cmdClearAttachments(*m_cmdBuffer,
1063 static_cast<deUint32>(clearData.colorDepthClear2.size()),
1064 clearData.colorDepthClear2.data(),
1065 1, &clearData.rectColorDepth2);
1066 }
1067
1068 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1069 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1070
1071 vk.cmdEndRendering(*m_cmdBuffer);
1072
1073 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1074
1075 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1076 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1077
1078 verifyResults(colorAtchCount, imagesFormat);
1079 }
1080 }
1081 }
1082
preBarier(const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1083 void DynamicRenderingTestInstance::preBarier (const deUint32 colorAtchCount,
1084 ImagesLayout& imagesLayout,
1085 const ImagesFormat& imagesFormat)
1086 {
1087 const DeviceInterface& vk = m_context.getDeviceInterface();
1088
1089 std::vector<VkImageMemoryBarrier> barriers;
1090
1091 for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
1092 {
1093 const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
1094 const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1095 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
1096 imagesLayout.oldColors[ndx],
1097 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1098 *m_imageColor[ndx],
1099 subresource);
1100 barriers.push_back(barrier);
1101 imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
1102 }
1103
1104 if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1105 {
1106 const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u);
1107 const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1108 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
1109 imagesLayout.oldDepth,
1110 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1111 *m_imageStencilDepth,
1112 subresource);
1113 imagesLayout.oldDepth = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
1114 barriers.push_back(barrier);
1115 }
1116
1117 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1118 {
1119 const VkImageSubresourceRange subresource = makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u);
1120 const VkImageMemoryBarrier barrier = makeImageMemoryBarrier(VK_ACCESS_NONE_KHR,
1121 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
1122 imagesLayout.oldStencil,
1123 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1124 *m_imageStencilDepth,
1125 subresource);
1126 imagesLayout.oldStencil = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
1127 barriers.push_back(barrier);
1128 }
1129
1130 cmdPipelineImageMemoryBarrier(vk,
1131 *m_cmdBuffer,
1132 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
1133 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
1134 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
1135 barriers.data(),
1136 barriers.size());
1137 }
1138
beginRendering(VkCommandBuffer cmdBuffer,const std::vector<VkImageView> & attachmentBindInfos,const VkRenderingFlagsKHR flags,const deUint32 colorAtchCount,const ImagesFormat & imagesFormat,const VkAttachmentLoadOp loadOp,const VkAttachmentStoreOp storeOp)1139 void DynamicRenderingTestInstance::beginRendering (VkCommandBuffer cmdBuffer,
1140 const std::vector<VkImageView>& attachmentBindInfos,
1141 const VkRenderingFlagsKHR flags,
1142 const deUint32 colorAtchCount,
1143 const ImagesFormat& imagesFormat,
1144 const VkAttachmentLoadOp loadOp,
1145 const VkAttachmentStoreOp storeOp)
1146 {
1147 const DeviceInterface& vk = m_context.getDeviceInterface();
1148 const VkClearValue clearValue = makeClearValueColor(m_parameters.clearColor);
1149 const VkRect2D renderArea =
1150 {
1151 makeOffset2D(0, 0),
1152 makeExtent2D(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1153 };
1154
1155 std::vector<VkRenderingAttachmentInfoKHR> attachments;
1156
1157 for (deUint32 ndx = 0; ndx < colorAtchCount; ++ndx)
1158 {
1159 const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1160 {
1161 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
1162 DE_NULL, // const void* pNext;
1163 attachmentBindInfos[ndx], // VkImageView imageView;
1164 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
1165 VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
1166 VK_NULL_HANDLE, // VkImageView resolveImageView;
1167 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
1168 loadOp, // VkAttachmentLoadOp loadOp;
1169 storeOp, // VkAttachmentStoreOp storeOp;
1170 clearValue, // VkClearValue clearValue;
1171 };
1172
1173 attachments.push_back(renderingAtachInfo);
1174 }
1175
1176 if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1177 {
1178 const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1179 {
1180 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
1181 DE_NULL, // const void* pNext;
1182 attachmentBindInfos[colorAtchCount], // VkImageView imageView;
1183 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
1184 VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
1185 VK_NULL_HANDLE, // VkImageView resolveImageView;
1186 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
1187 loadOp, // VkAttachmentLoadOp loadOp;
1188 storeOp, // VkAttachmentStoreOp storeOp;
1189 clearValue, // VkClearValue clearValue;
1190 };
1191
1192 attachments.push_back(renderingAtachInfo);
1193 }
1194
1195 const deUint32 stencilNdx = colorAtchCount + ((imagesFormat.depth != VK_FORMAT_UNDEFINED) ? 1 : 0);
1196
1197 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1198 {
1199 const VkRenderingAttachmentInfoKHR renderingAtachInfo =
1200 {
1201 VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR, // VkStructureType sType;
1202 DE_NULL, // const void* pNext;
1203 attachmentBindInfos[stencilNdx], // VkImageView imageView;
1204 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout imageLayout;
1205 VK_RESOLVE_MODE_NONE, // VkResolveModeFlagBits resolveMode;
1206 VK_NULL_HANDLE, // VkImageView resolveImageView;
1207 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout resolveImageLayout;
1208 loadOp, // VkAttachmentLoadOp loadOp;
1209 storeOp, // VkAttachmentStoreOp storeOp;
1210 clearValue, // VkClearValue clearValue;
1211 };
1212
1213 attachments.push_back(renderingAtachInfo);
1214 }
1215
1216 const VkRenderingInfoKHR renderingInfo =
1217 {
1218 VK_STRUCTURE_TYPE_RENDERING_INFO_KHR, // VkStructureType sType;
1219 DE_NULL, // const void* pNext;
1220 flags, // VkRenderingFlagsKHR flags;
1221 renderArea, // VkRect2D renderArea;
1222 1u, // deUint32 layerCount;
1223 0u, // deUint32 viewMask;
1224 colorAtchCount, // deUint32 colorAttachmentCount;
1225 ((colorAtchCount != 0) ? attachments.data() : DE_NULL), // const VkRenderingAttachmentInfoKHR* pColorAttachments;
1226 ((imagesFormat.depth != VK_FORMAT_UNDEFINED) ?
1227 &attachments[colorAtchCount] :
1228 DE_NULL), // const VkRenderingAttachmentInfoKHR* pDepthAttachment;
1229 ((imagesFormat.stencil != VK_FORMAT_UNDEFINED) ?
1230 &attachments[stencilNdx] :
1231 DE_NULL), // const VkRenderingAttachmentInfoKHR* pStencilAttachment;
1232 };
1233
1234 vk.cmdBeginRendering(cmdBuffer, &renderingInfo);
1235 }
1236
copyImgToBuff(VkCommandBuffer commandBuffer,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1237 void DynamicRenderingTestInstance::copyImgToBuff (VkCommandBuffer commandBuffer,
1238 const deUint32 colorAtchCount,
1239 ImagesLayout& imagesLayout,
1240 const ImagesFormat& imagesFormat)
1241 {
1242 const DeviceInterface& vk = m_context.getDeviceInterface();
1243
1244 if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
1245 {
1246 for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
1247 {
1248 vk::copyImageToBuffer(vk, commandBuffer, *m_imageColor[ndx], m_imageBuffer[ndx]->object(),
1249 tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1250 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, imagesLayout.oldColors[ndx], 1u,
1251 VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_COLOR_BIT);
1252 imagesLayout.oldColors[ndx] = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1253 }
1254 }
1255 if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1256 {
1257 copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageDepthBuffer->object(),
1258 tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1259 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldDepth,
1260 1u, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT);
1261 imagesLayout.oldDepth = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1262 }
1263 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1264 {
1265 copyImageToBuffer(vk, commandBuffer, *m_imageStencilDepth, m_imageStencilBuffer->object(),
1266 tcu::IVec2(m_parameters.renderSize.x(), m_parameters.renderSize.y()),
1267 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, imagesLayout.oldStencil,
1268 1u, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_ASPECT_STENCIL_BIT);
1269 imagesLayout.oldStencil = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
1270 }
1271 }
1272
verifyResults(const deUint32 colorAtchCount,const ImagesFormat & imagesFormat)1273 void DynamicRenderingTestInstance::verifyResults (const deUint32 colorAtchCount,
1274 const ImagesFormat& imagesFormat)
1275 {
1276 const DeviceInterface& vk = m_context.getDeviceInterface();
1277 const VkDevice device = m_context.getDevice();
1278 tcu::TestLog& log = m_context.getTestContext().getLog();
1279
1280 if (imagesFormat.colors[0] != VK_FORMAT_UNDEFINED)
1281 {
1282 for (deUint32 ndx = 0; ndx < colorAtchCount; ndx++)
1283 {
1284 const Allocation allocColor = m_imageBuffer[ndx]->getBoundMemory();
1285 invalidateAlloc(vk, device, allocColor);
1286 const tcu::ConstPixelBufferAccess resultColorImage(mapVkFormat(m_parameters.imageFormat), m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u, allocColor.getHostPtr());
1287
1288 if (!tcu::floatThresholdCompare(log, "Compare Color Image", "Result comparison",
1289 m_referenceImages[ndx].getAccess(), resultColorImage,
1290 Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
1291 {
1292 TCU_FAIL("Rendered color image is not correct");
1293 }
1294 }
1295 }
1296
1297 if (imagesFormat.depth != VK_FORMAT_UNDEFINED)
1298 {
1299 const Allocation allocDepth = m_imageDepthBuffer->getBoundMemory();
1300 invalidateAlloc(vk, device, allocDepth);
1301
1302 const tcu::ConstPixelBufferAccess resultDepthImage(getDepthTextureFormat(m_formatStencilDepthImage),
1303 m_parameters.renderSize.x(),
1304 m_parameters.renderSize.y(),
1305 1u, allocDepth.getHostPtr());
1306 if (m_formatStencilDepthImage == VK_FORMAT_D24_UNORM_S8_UINT)
1307 {
1308 de::MovePtr<tcu::TextureLevel> result(new tcu::TextureLevel(mapVkFormat(m_formatStencilDepthImage),
1309 m_parameters.renderSize.x(), m_parameters.renderSize.y(), 1u));
1310 tcu::copy(tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH), resultDepthImage);
1311
1312 const tcu::ConstPixelBufferAccess depthResult = tcu::getEffectiveDepthStencilAccess(result->getAccess(), tcu::Sampler::MODE_DEPTH);
1313 const tcu::ConstPixelBufferAccess expectedResult = tcu::getEffectiveDepthStencilAccess(m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), tcu::Sampler::MODE_DEPTH);
1314
1315 if (!tcu::intThresholdCompare(log, "Compare Depth Image", "Result comparison",
1316 expectedResult, depthResult,UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
1317 {
1318 TCU_FAIL("Rendered depth image is not correct");
1319 }
1320 }
1321 else
1322 {
1323 if (!tcu::floatThresholdCompare(log, "Compare Depth Image", "Result comparison",
1324 m_referenceImages[COLOR_ATTACHMENTS_NUMBER].getAccess(), resultDepthImage,
1325 Vec4(0.02f), tcu::COMPARE_LOG_ON_ERROR))
1326 {
1327 TCU_FAIL("Rendered depth image is not correct");
1328 }
1329 }
1330 }
1331
1332 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1333 {
1334 const Allocation allocStencil = m_imageStencilBuffer->getBoundMemory();
1335 invalidateAlloc(vk, device, allocStencil);
1336 const tcu::ConstPixelBufferAccess resultStencilImage(mapVkFormat(VK_FORMAT_S8_UINT),
1337 m_parameters.renderSize.x(),
1338 m_parameters.renderSize.y(),
1339 1u, allocStencil.getHostPtr());
1340
1341 if (!tcu::intThresholdCompare(log, "Compare Stencil Image", "Result comparison",
1342 m_referenceImages[COLOR_ATTACHMENTS_NUMBER + 1].getAccess(), resultStencilImage,
1343 UVec4(0, 0, 0, 0), tcu::COMPARE_LOG_ON_ERROR))
1344 {
1345 TCU_FAIL("Rendered stencil image is not correct");
1346 }
1347 }
1348 }
1349
1350 class SingleCmdBufferResuming : public DynamicRenderingTestInstance
1351 {
1352 public:
1353 SingleCmdBufferResuming (Context& context,
1354 const TestParameters& parameters);
1355 protected:
1356 void rendering (const VkPipeline pipeline,
1357 const std::vector<VkImageView>& attachmentBindInfos,
1358 const deUint32 colorAtchCount,
1359 ImagesLayout& imagesLayout,
1360 const ImagesFormat& imagesFormat) override;
1361 };
1362
SingleCmdBufferResuming(Context & context,const TestParameters & parameters)1363 SingleCmdBufferResuming::SingleCmdBufferResuming (Context& context,
1364 const TestParameters& parameters)
1365 : DynamicRenderingTestInstance(context, parameters)
1366 {
1367 }
1368
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1369 void SingleCmdBufferResuming::rendering (const VkPipeline pipeline,
1370 const std::vector<VkImageView>& attachmentBindInfos,
1371 const deUint32 colorAtchCount,
1372 ImagesLayout& imagesLayout,
1373 const ImagesFormat& imagesFormat)
1374 {
1375 const DeviceInterface& vk = m_context.getDeviceInterface();
1376 const VkDevice device = m_context.getDevice();
1377 const VkQueue queue = m_context.getUniversalQueue();
1378
1379 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
1380 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1381 {
1382 beginCommandBuffer(vk, *m_cmdBuffer);
1383 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1384
1385 beginRendering(*m_cmdBuffer,
1386 attachmentBindInfos,
1387 VK_RENDERING_SUSPENDING_BIT_KHR,
1388 colorAtchCount,
1389 imagesFormat,
1390 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1391 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1392
1393 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1394
1395 {
1396 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1397 const VkDeviceSize vertexBufferOffset = 0ull;
1398 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1399 }
1400
1401 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1402 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1403 vk.cmdEndRendering(*m_cmdBuffer);
1404
1405 beginRendering(*m_cmdBuffer,
1406 attachmentBindInfos,
1407 VK_RENDERING_RESUMING_BIT_KHR,
1408 colorAtchCount,
1409 imagesFormat,
1410 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1411 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1412
1413 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
1414
1415 vk.cmdEndRendering(*m_cmdBuffer);
1416
1417 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1418
1419 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1420 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1421
1422 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1423 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1424 {
1425 verifyResults(colorAtchCount, imagesFormat);
1426
1427 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1428
1429 beginCommandBuffer(vk, *m_cmdBuffer);
1430 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1431
1432 beginRendering(*m_cmdBuffer,
1433 attachmentBindInfos,
1434 VK_RENDERING_SUSPENDING_BIT_KHR,
1435 colorAtchCount,
1436 imagesFormat,
1437 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1438 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1439
1440 if (clearData.colorDepthClear1.size() != 0)
1441 {
1442 vk.cmdClearAttachments(*m_cmdBuffer,
1443 static_cast<deUint32>(clearData.colorDepthClear1.size()),
1444 clearData.colorDepthClear1.data(),
1445 1, &clearData.rectColorDepth1);
1446 }
1447
1448 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1449 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1450
1451 vk.cmdEndRendering(*m_cmdBuffer);
1452
1453 beginRendering(*m_cmdBuffer,
1454 attachmentBindInfos,
1455 VK_RENDERING_RESUMING_BIT_KHR,
1456 colorAtchCount,
1457 imagesFormat,
1458 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1459 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1460
1461 if (clearData.colorDepthClear2.size() != 0)
1462 {
1463 vk.cmdClearAttachments(*m_cmdBuffer,
1464 static_cast<deUint32>(clearData.colorDepthClear2.size()),
1465 clearData.colorDepthClear2.data(),
1466 1, &clearData.rectColorDepth2);
1467 }
1468
1469 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1470 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1471
1472 vk.cmdEndRendering(*m_cmdBuffer);
1473
1474 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1475
1476 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1477 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1478
1479 verifyResults(colorAtchCount, imagesFormat);
1480 }
1481 }
1482 }
1483
1484 class TwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
1485 {
1486 public:
1487 TwoPrimaryCmdBufferResuming (Context& context,
1488 const TestParameters& parameters);
1489 protected:
1490 void rendering (const VkPipeline pipeline,
1491 const std::vector<VkImageView>& attachmentBindInfos,
1492 const deUint32 colorAtchCount,
1493 ImagesLayout& imagesLayout,
1494 const ImagesFormat& imagesFormat) override;
1495
1496 Move<VkCommandBuffer> m_cmdBuffer2;
1497 };
1498
TwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)1499 TwoPrimaryCmdBufferResuming::TwoPrimaryCmdBufferResuming (Context& context,
1500 const TestParameters& parameters)
1501 : DynamicRenderingTestInstance(context, parameters)
1502 {
1503 const DeviceInterface& vk = m_context.getDeviceInterface();
1504 const VkDevice device = m_context.getDevice();
1505
1506 m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
1507 }
1508
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1509 void TwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
1510 const std::vector<VkImageView>& attachmentBindInfos,
1511 const deUint32 colorAtchCount,
1512 ImagesLayout& imagesLayout,
1513 const ImagesFormat& imagesFormat)
1514 {
1515 const DeviceInterface& vk = m_context.getDeviceInterface();
1516 const VkDevice device = m_context.getDevice();
1517 const VkQueue queue = m_context.getUniversalQueue();
1518
1519 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
1520 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1521 {
1522 // First Primary CommandBuffer
1523 beginCommandBuffer(vk, *m_cmdBuffer);
1524 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1525
1526 beginRendering(*m_cmdBuffer,
1527 attachmentBindInfos,
1528 VK_RENDERING_SUSPENDING_BIT_KHR,
1529 colorAtchCount,
1530 imagesFormat,
1531 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1532 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1533
1534 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1535
1536 {
1537 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1538 const VkDeviceSize vertexBufferOffset = 0ull;
1539 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1540 }
1541
1542 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
1543 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
1544
1545 vk.cmdEndRendering(*m_cmdBuffer);
1546
1547 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1548
1549 // Second Primary CommandBuffer
1550 beginCommandBuffer(vk, *m_cmdBuffer2);
1551
1552 beginRendering(*m_cmdBuffer2,
1553 attachmentBindInfos,
1554 VK_RENDERING_RESUMING_BIT_KHR,
1555 colorAtchCount,
1556 imagesFormat,
1557 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1558 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1559
1560 vk.cmdBindPipeline(*m_cmdBuffer2, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1561
1562 {
1563 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1564 const VkDeviceSize vertexBufferOffset = 0ull;
1565 vk.cmdBindVertexBuffers(*m_cmdBuffer2, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1566 }
1567
1568 vk.cmdDraw(*m_cmdBuffer2, 4u, 1u, 4u, 0u);
1569
1570 vk.cmdEndRendering(*m_cmdBuffer2);
1571
1572 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1573
1574 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1575
1576 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1577
1578 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1579 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1580 {
1581 verifyResults(colorAtchCount, imagesFormat);
1582
1583 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1584
1585 // First Primary CommandBuffer
1586 beginCommandBuffer(vk, *m_cmdBuffer);
1587 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1588
1589 beginRendering(*m_cmdBuffer,
1590 attachmentBindInfos,
1591 VK_RENDERING_SUSPENDING_BIT_KHR,
1592 colorAtchCount,
1593 imagesFormat,
1594 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1595 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1596
1597 if (clearData.colorDepthClear1.size() != 0)
1598 {
1599 vk.cmdClearAttachments(*m_cmdBuffer,
1600 static_cast<deUint32>(clearData.colorDepthClear1.size()),
1601 clearData.colorDepthClear1.data(),
1602 1, &clearData.rectColorDepth1);
1603 }
1604
1605 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1606 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1607
1608 vk.cmdEndRendering(*m_cmdBuffer);
1609
1610 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1611
1612 // Second Primary CommandBuffer
1613 beginCommandBuffer(vk, *m_cmdBuffer2);
1614
1615 beginRendering(*m_cmdBuffer2,
1616 attachmentBindInfos,
1617 VK_RENDERING_RESUMING_BIT_KHR,
1618 colorAtchCount,
1619 imagesFormat,
1620 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1621 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1622
1623 if (clearData.colorDepthClear2.size() != 0)
1624 {
1625 vk.cmdClearAttachments(*m_cmdBuffer2,
1626 static_cast<deUint32>(clearData.colorDepthClear2.size()),
1627 clearData.colorDepthClear2.data(),
1628 1, &clearData.rectColorDepth2);
1629 }
1630
1631 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1632 vk.cmdClearAttachments(*m_cmdBuffer2, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1633
1634 vk.cmdEndRendering(*m_cmdBuffer2);
1635
1636 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1637
1638 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1639
1640 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1641
1642 verifyResults(colorAtchCount, imagesFormat);
1643 }
1644 }
1645 }
1646
1647 class TwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
1648 {
1649 public:
1650 TwoSecondaryCmdBufferResuming (Context& context,
1651 const TestParameters& parameters);
1652 protected:
1653 void rendering (const VkPipeline pipeline,
1654 const std::vector<VkImageView>& attachmentBindInfos,
1655 const deUint32 colorAtchCount,
1656 ImagesLayout& imagesLayout,
1657 const ImagesFormat& imagesFormat) override;
1658
1659 Move<VkCommandBuffer> m_secCmdBuffers[2];
1660 };
1661
TwoSecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)1662 TwoSecondaryCmdBufferResuming::TwoSecondaryCmdBufferResuming (Context& context,
1663 const TestParameters& parameters)
1664 : DynamicRenderingTestInstance(context, parameters)
1665 {
1666 const DeviceInterface& vk = m_context.getDeviceInterface();
1667 const VkDevice device = m_context.getDevice();
1668
1669 m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1670 m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1671 }
1672
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1673 void TwoSecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
1674 const std::vector<VkImageView>& attachmentBindInfos,
1675 const deUint32 colorAtchCount,
1676 ImagesLayout& imagesLayout,
1677 const ImagesFormat& imagesFormat)
1678 {
1679 const DeviceInterface& vk = m_context.getDeviceInterface();
1680 const VkDevice device = m_context.getDevice();
1681 const VkQueue queue = m_context.getUniversalQueue();
1682
1683 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
1684 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1685 {
1686 VkCommandBuffer secCmdBuffers[2] = {
1687 *(m_secCmdBuffers[0]),
1688 *(m_secCmdBuffers[1])
1689 };
1690 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1691 const VkDeviceSize vertexBufferOffset = 0ull;
1692
1693 // secCmdBuffersFirst
1694 beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1695
1696 beginRendering(secCmdBuffers[0],
1697 attachmentBindInfos,
1698 VK_RENDERING_SUSPENDING_BIT_KHR,
1699 colorAtchCount,
1700 imagesFormat,
1701 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1702 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1703
1704 vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1705 vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1706
1707 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
1708 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
1709
1710 vk.cmdEndRendering(secCmdBuffers[0]);
1711 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1712
1713 // secCmdBuffersSecond
1714 beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1715
1716 beginRendering(secCmdBuffers[1],
1717 attachmentBindInfos,
1718 VK_RENDERING_RESUMING_BIT_KHR,
1719 colorAtchCount,
1720 imagesFormat,
1721 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1722 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1723
1724 vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1725 vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1726
1727 vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
1728
1729 vk.cmdEndRendering(secCmdBuffers[1]);
1730 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1731
1732 // Primary commandBuffer
1733 beginCommandBuffer(vk, *m_cmdBuffer);
1734 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1735
1736 vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
1737
1738 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1739 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1740
1741 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1742
1743 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1744 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1745 {
1746 verifyResults(colorAtchCount, imagesFormat);
1747
1748 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1749
1750 // secCmdBuffersFirst
1751 beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1752
1753 beginRendering(secCmdBuffers[0],
1754 attachmentBindInfos,
1755 VK_RENDERING_SUSPENDING_BIT_KHR,
1756 colorAtchCount,
1757 imagesFormat,
1758 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1759 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1760
1761 if (clearData.colorDepthClear1.size() != 0)
1762 {
1763 vk.cmdClearAttachments(secCmdBuffers[0],
1764 static_cast<deUint32>(clearData.colorDepthClear1.size()),
1765 clearData.colorDepthClear1.data(),
1766 1, &clearData.rectColorDepth1);
1767 }
1768
1769 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1770 vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1771
1772 vk.cmdEndRendering(secCmdBuffers[0]);
1773 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1774
1775 // secCmdBuffersSecond
1776 beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1777
1778 beginRendering(secCmdBuffers[1],
1779 attachmentBindInfos,
1780 VK_RENDERING_RESUMING_BIT_KHR,
1781 colorAtchCount,
1782 imagesFormat,
1783 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1784 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1785
1786 if (clearData.colorDepthClear2.size() != 0)
1787 {
1788 vk.cmdClearAttachments(secCmdBuffers[1],
1789 static_cast<deUint32>(clearData.colorDepthClear2.size()),
1790 clearData.colorDepthClear2.data(),
1791 1, &clearData.rectColorDepth2);
1792 }
1793
1794 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1795 vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1796
1797 vk.cmdEndRendering(secCmdBuffers[1]);
1798 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1799
1800 // Primary commandBuffer
1801 beginCommandBuffer(vk, *m_cmdBuffer);
1802 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1803
1804 vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
1805
1806 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
1807 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1808
1809 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
1810
1811 verifyResults(colorAtchCount, imagesFormat);
1812 }
1813 }
1814 }
1815
1816 class TwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
1817 {
1818 public:
1819 TwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
1820 const TestParameters& parameters);
1821 protected:
1822 void rendering (const VkPipeline pipeline,
1823 const std::vector<VkImageView>& attachmentBindInfos,
1824 const deUint32 colorAtchCount,
1825 ImagesLayout& imagesLayout,
1826 const ImagesFormat& imagesFormat) override;
1827
1828 Move<VkCommandBuffer> m_cmdBuffer2;
1829 Move<VkCommandBuffer> m_secCmdBuffers[2];
1830 };
1831
TwoSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)1832 TwoSecondaryTwoPrimaryCmdBufferResuming::TwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
1833 const TestParameters& parameters)
1834 : DynamicRenderingTestInstance(context, parameters)
1835 {
1836 const DeviceInterface& vk = m_context.getDeviceInterface();
1837 const VkDevice device = m_context.getDevice();
1838
1839 m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
1840 m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1841 m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1842 }
1843
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)1844 void TwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
1845 const std::vector<VkImageView>& attachmentBindInfos,
1846 const deUint32 colorAtchCount,
1847 ImagesLayout& imagesLayout,
1848 const ImagesFormat& imagesFormat)
1849 {
1850 const DeviceInterface& vk = m_context.getDeviceInterface();
1851 const VkDevice device = m_context.getDevice();
1852 const VkQueue queue = m_context.getUniversalQueue();
1853
1854 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
1855 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
1856 {
1857 VkCommandBuffer secCmdBuffers[2] = {
1858 *(m_secCmdBuffers[0]),
1859 *(m_secCmdBuffers[1])
1860 };
1861 const VkBuffer vertexBuffer = m_vertexBuffer->object();
1862 const VkDeviceSize vertexBufferOffset = 0ull;
1863
1864 // secCmdBuffersFirst
1865 beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1866
1867 beginRendering(secCmdBuffers[0],
1868 attachmentBindInfos,
1869 VK_RENDERING_SUSPENDING_BIT_KHR,
1870 colorAtchCount,
1871 imagesFormat,
1872 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1873 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1874
1875 vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1876 vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1877
1878 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
1879 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
1880
1881 vk.cmdEndRendering(secCmdBuffers[0]);
1882 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1883
1884
1885 // secCmdBuffersSecond
1886 beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1887
1888 beginRendering(secCmdBuffers[1],
1889 attachmentBindInfos,
1890 VK_RENDERING_RESUMING_BIT_KHR,
1891 colorAtchCount,
1892 imagesFormat,
1893 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1894 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1895
1896 vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1897 vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
1898
1899 vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
1900
1901 vk.cmdEndRendering(secCmdBuffers[1]);
1902 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1903
1904 // Primary commandBuffer
1905 beginCommandBuffer(vk, *m_cmdBuffer);
1906 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1907
1908 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
1909
1910 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1911
1912 // Primary commandBuffer2
1913 beginCommandBuffer(vk, *m_cmdBuffer2);
1914
1915 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
1916
1917 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1918 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1919
1920 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1921
1922 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
1923 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
1924 {
1925 verifyResults(colorAtchCount, imagesFormat);
1926
1927 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
1928
1929 // secCmdBuffersFirst
1930 beginSecondaryCmdBuffer(vk, secCmdBuffers[0]);
1931
1932 beginRendering(secCmdBuffers[0],
1933 attachmentBindInfos,
1934 VK_RENDERING_SUSPENDING_BIT_KHR,
1935 colorAtchCount,
1936 imagesFormat,
1937 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1938 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1939
1940 if (clearData.colorDepthClear1.size() != 0)
1941 {
1942 vk.cmdClearAttachments(secCmdBuffers[0],
1943 static_cast<deUint32>(clearData.colorDepthClear1.size()),
1944 clearData.colorDepthClear1.data(),
1945 1, &clearData.rectColorDepth1);
1946 }
1947
1948 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1949 vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
1950
1951 vk.cmdEndRendering(secCmdBuffers[0]);
1952 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
1953
1954 // secCmdBuffersSecond
1955 beginSecondaryCmdBuffer(vk, secCmdBuffers[1]);
1956
1957 beginRendering(secCmdBuffers[1],
1958 attachmentBindInfos,
1959 VK_RENDERING_RESUMING_BIT_KHR,
1960 colorAtchCount,
1961 imagesFormat,
1962 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
1963 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
1964
1965 if (clearData.colorDepthClear2.size() != 0)
1966 {
1967 vk.cmdClearAttachments(secCmdBuffers[1],
1968 static_cast<deUint32>(clearData.colorDepthClear2.size()),
1969 clearData.colorDepthClear2.data(),
1970 1, &clearData.rectColorDepth2);
1971 }
1972
1973 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
1974 vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
1975
1976 vk.cmdEndRendering(secCmdBuffers[1]);
1977 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
1978
1979 // Primary commandBuffer
1980 beginCommandBuffer(vk, *m_cmdBuffer);
1981 preBarier(colorAtchCount, imagesLayout, imagesFormat);
1982
1983 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
1984
1985 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
1986
1987 // Primary commandBuffer2
1988 beginCommandBuffer(vk, *m_cmdBuffer2);
1989
1990 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
1991
1992 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
1993 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
1994
1995 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
1996
1997 verifyResults(colorAtchCount, imagesFormat);
1998 }
1999 }
2000 }
2001
2002 class ContentsSecondaryCmdBuffer : public DynamicRenderingTestInstance
2003 {
2004 public:
2005 ContentsSecondaryCmdBuffer (Context& context,
2006 const TestParameters& parameters);
2007 protected:
2008 void rendering (const VkPipeline pipeline,
2009 const std::vector<VkImageView>& attachmentBindInfos,
2010 const deUint32 colorAtchCount,
2011 ImagesLayout& imagesLayout,
2012 const ImagesFormat& imagesFormat) override;
2013
2014 Move<VkCommandBuffer> m_secCmdBuffers;
2015 };
2016
ContentsSecondaryCmdBuffer(Context & context,const TestParameters & parameters)2017 ContentsSecondaryCmdBuffer::ContentsSecondaryCmdBuffer (Context& context,
2018 const TestParameters& parameters)
2019 : DynamicRenderingTestInstance(context, parameters)
2020 {
2021 const DeviceInterface& vk = m_context.getDeviceInterface();
2022 const VkDevice device = m_context.getDevice();
2023
2024 m_secCmdBuffers = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2025 }
2026
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2027 void ContentsSecondaryCmdBuffer::rendering (const VkPipeline pipeline,
2028 const std::vector<VkImageView>& attachmentBindInfos,
2029 const deUint32 colorAtchCount,
2030 ImagesLayout& imagesLayout,
2031 const ImagesFormat& imagesFormat)
2032 {
2033 const DeviceInterface& vk = m_context.getDeviceInterface();
2034 const VkDevice device = m_context.getDevice();
2035 const VkQueue queue = m_context.getUniversalQueue();
2036
2037 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2038 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2039 {
2040 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2041 const VkDeviceSize vertexBufferOffset = 0ull;
2042
2043 // secCmdBuffers
2044 beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2045
2046 vk.cmdBindPipeline(*m_secCmdBuffers, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2047 vk.cmdBindVertexBuffers(*m_secCmdBuffers, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2048
2049 vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 8u, 0u);
2050 vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 0u, 0u);
2051 vk.cmdDraw(*m_secCmdBuffers, 4u, 1u, 4u, 0u);
2052
2053 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
2054
2055 // Primary commandBuffer
2056 beginCommandBuffer(vk, *m_cmdBuffer);
2057 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2058
2059 beginRendering(*m_cmdBuffer,
2060 attachmentBindInfos,
2061 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2062 colorAtchCount,
2063 imagesFormat,
2064 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2065 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2066
2067 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
2068
2069 vk.cmdEndRendering(*m_cmdBuffer);
2070
2071 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2072 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2073
2074 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2075
2076 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2077 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2078 {
2079 verifyResults(colorAtchCount, imagesFormat);
2080
2081 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2082
2083 // secCmdBuffers
2084 beginSecondaryCmdBuffer(vk, *m_secCmdBuffers, (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2085
2086 if (clearData.colorDepthClear1.size() != 0)
2087 {
2088 vk.cmdClearAttachments(*m_secCmdBuffers,
2089 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2090 clearData.colorDepthClear1.data(),
2091 1, &clearData.rectColorDepth1);
2092 }
2093
2094 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2095 vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2096
2097 if (clearData.colorDepthClear2.size() != 0)
2098 {
2099 vk.cmdClearAttachments(*m_secCmdBuffers,
2100 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2101 clearData.colorDepthClear2.data(),
2102 1, &clearData.rectColorDepth2);
2103 }
2104
2105 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2106 vk.cmdClearAttachments(*m_secCmdBuffers, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2107
2108 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffers));
2109
2110 // Primary commandBuffer
2111 beginCommandBuffer(vk, *m_cmdBuffer);
2112 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2113
2114 beginRendering(*m_cmdBuffer,
2115 attachmentBindInfos,
2116 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2117 colorAtchCount,
2118 imagesFormat,
2119 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2120 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2121
2122 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffers));
2123
2124 vk.cmdEndRendering(*m_cmdBuffer);
2125
2126 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2127 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2128
2129 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2130
2131 verifyResults(colorAtchCount, imagesFormat);
2132 }
2133 }
2134 }
2135
2136 class ContentsTwoSecondaryCmdBuffer : public DynamicRenderingTestInstance
2137 {
2138 public:
2139 ContentsTwoSecondaryCmdBuffer (Context& context,
2140 const TestParameters& parameters);
2141 protected:
2142 void rendering (const VkPipeline pipeline,
2143 const std::vector<VkImageView>& attachmentBindInfos,
2144 const deUint32 colorAtchCount,
2145 ImagesLayout& imagesLayout,
2146 const ImagesFormat& imagesFormat) override;
2147
2148 Move<VkCommandBuffer> m_secCmdBuffers[2];
2149 };
2150
ContentsTwoSecondaryCmdBuffer(Context & context,const TestParameters & parameters)2151 ContentsTwoSecondaryCmdBuffer::ContentsTwoSecondaryCmdBuffer (Context& context,
2152 const TestParameters& parameters)
2153 : DynamicRenderingTestInstance(context, parameters)
2154 {
2155 const DeviceInterface& vk = m_context.getDeviceInterface();
2156 const VkDevice device = m_context.getDevice();
2157
2158 m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2159 m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2160 }
2161
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2162 void ContentsTwoSecondaryCmdBuffer::rendering (const VkPipeline pipeline,
2163 const std::vector<VkImageView>& attachmentBindInfos,
2164 const deUint32 colorAtchCount,
2165 ImagesLayout& imagesLayout,
2166 const ImagesFormat& imagesFormat)
2167 {
2168 const DeviceInterface& vk = m_context.getDeviceInterface();
2169 const VkDevice device = m_context.getDevice();
2170 const VkQueue queue = m_context.getUniversalQueue();
2171
2172 VkCommandBuffer secCmdBuffers[2] = {
2173 *(m_secCmdBuffers[0]),
2174 *(m_secCmdBuffers[1])
2175 };
2176
2177 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2178 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2179 {
2180 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2181 const VkDeviceSize vertexBufferOffset = 0ull;
2182
2183 // secCmdBuffers
2184 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2185
2186 vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2187 vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2188
2189 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2190 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2191
2192 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2193
2194 // secCmdBuffers2
2195 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2196
2197 vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2198 vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2199
2200 vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2201
2202 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2203
2204 // Primary commandBuffer
2205 beginCommandBuffer(vk, *m_cmdBuffer);
2206 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2207
2208 beginRendering(*m_cmdBuffer,
2209 attachmentBindInfos,
2210 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2211 colorAtchCount,
2212 imagesFormat,
2213 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2214 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2215
2216 vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
2217
2218 vk.cmdEndRendering(*m_cmdBuffer);
2219
2220 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2221 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2222
2223 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2224
2225 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2226 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2227 {
2228 verifyResults(colorAtchCount, imagesFormat);
2229
2230 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2231
2232 // secCmdBuffers
2233 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2234
2235 if (clearData.colorDepthClear1.size() != 0)
2236 {
2237 vk.cmdClearAttachments(secCmdBuffers[0],
2238 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2239 clearData.colorDepthClear1.data(),
2240 1, &clearData.rectColorDepth1);
2241 }
2242
2243 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2244 vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2245
2246 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2247
2248 // secCmdBuffers2
2249 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], (VkRenderingFlagsKHR)0u, colorAtchCount, imagesFormat);
2250
2251 if (clearData.colorDepthClear2.size() != 0)
2252 {
2253 vk.cmdClearAttachments(secCmdBuffers[1],
2254 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2255 clearData.colorDepthClear2.data(),
2256 1, &clearData.rectColorDepth2);
2257 }
2258
2259 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2260 vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2261
2262 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2263
2264 // Primary commandBuffer
2265 beginCommandBuffer(vk, *m_cmdBuffer);
2266 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2267
2268 beginRendering(*m_cmdBuffer,
2269 attachmentBindInfos,
2270 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR,
2271 colorAtchCount,
2272 imagesFormat,
2273 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2274 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2275
2276 vk.cmdExecuteCommands(*m_cmdBuffer, 2u, secCmdBuffers);
2277
2278 vk.cmdEndRendering(*m_cmdBuffer);
2279
2280 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2281 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2282
2283 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2284
2285 verifyResults(colorAtchCount, imagesFormat);
2286 }
2287 }
2288 }
2289
2290 class ContentsTwoSecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2291 {
2292 public:
2293 ContentsTwoSecondaryCmdBufferResuming (Context& context,
2294 const TestParameters& parameters);
2295 protected:
2296 void rendering (const VkPipeline pipeline,
2297 const std::vector<VkImageView>& attachmentBindInfos,
2298 const deUint32 colorAtchCount,
2299 ImagesLayout& imagesLayout,
2300 const ImagesFormat& imagesFormat) override;
2301
2302 Move<VkCommandBuffer> m_secCmdBuffers[2];
2303 };
2304
ContentsTwoSecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)2305 ContentsTwoSecondaryCmdBufferResuming::ContentsTwoSecondaryCmdBufferResuming (Context& context,
2306 const TestParameters& parameters)
2307 : DynamicRenderingTestInstance(context, parameters)
2308 {
2309 const DeviceInterface& vk = m_context.getDeviceInterface();
2310 const VkDevice device = m_context.getDevice();
2311
2312 m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2313 m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2314 }
2315
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2316 void ContentsTwoSecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
2317 const std::vector<VkImageView>& attachmentBindInfos,
2318 const deUint32 colorAtchCount,
2319 ImagesLayout& imagesLayout,
2320 const ImagesFormat& imagesFormat)
2321 {
2322 const DeviceInterface& vk = m_context.getDeviceInterface();
2323 const VkDevice device = m_context.getDevice();
2324 const VkQueue queue = m_context.getUniversalQueue();
2325
2326 VkCommandBuffer secCmdBuffers[2] = {
2327 *(m_secCmdBuffers[0]),
2328 *(m_secCmdBuffers[1])
2329 };
2330
2331 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2332 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2333 {
2334 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2335 const VkDeviceSize vertexBufferOffset = 0ull;
2336
2337 // secCmdBuffers
2338 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2339
2340 vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2341 vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2342
2343 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2344 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2345
2346 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2347
2348 // secCmdBuffers2
2349 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2350
2351 vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2352 vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2353
2354 vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2355
2356 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2357
2358 // Primary commandBuffer
2359 beginCommandBuffer(vk, *m_cmdBuffer);
2360 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2361
2362 beginRendering(*m_cmdBuffer,
2363 attachmentBindInfos,
2364 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2365 VK_RENDERING_SUSPENDING_BIT_KHR,
2366 colorAtchCount,
2367 imagesFormat,
2368 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2369 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2370
2371 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2372
2373 vk.cmdEndRendering(*m_cmdBuffer);
2374
2375 beginRendering(*m_cmdBuffer,
2376 attachmentBindInfos,
2377 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2378 VK_RENDERING_RESUMING_BIT_KHR,
2379 colorAtchCount,
2380 imagesFormat,
2381 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2382 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2383
2384 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
2385
2386 vk.cmdEndRendering(*m_cmdBuffer);
2387
2388 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2389 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2390
2391 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2392
2393 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2394 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2395 {
2396 verifyResults(colorAtchCount, imagesFormat);
2397
2398 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2399
2400 // secCmdBuffers
2401 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2402
2403 if (clearData.colorDepthClear1.size() != 0)
2404 {
2405 vk.cmdClearAttachments(secCmdBuffers[0],
2406 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2407 clearData.colorDepthClear1.data(),
2408 1, &clearData.rectColorDepth1);
2409 }
2410
2411 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2412 vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2413
2414 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2415
2416 // secCmdBuffers2
2417 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2418
2419 if (clearData.colorDepthClear2.size() != 0)
2420 {
2421 vk.cmdClearAttachments(secCmdBuffers[1],
2422 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2423 clearData.colorDepthClear2.data(),
2424 1, &clearData.rectColorDepth2);
2425 }
2426
2427 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2428 vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2429
2430 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2431
2432 // Primary commandBuffer
2433 beginCommandBuffer(vk, *m_cmdBuffer);
2434 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2435
2436 beginRendering(*m_cmdBuffer,
2437 attachmentBindInfos,
2438 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2439 VK_RENDERING_SUSPENDING_BIT_KHR,
2440 colorAtchCount,
2441 imagesFormat,
2442 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2443 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2444
2445 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2446
2447 vk.cmdEndRendering(*m_cmdBuffer);
2448
2449 beginRendering(*m_cmdBuffer,
2450 attachmentBindInfos,
2451 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2452 VK_RENDERING_RESUMING_BIT_KHR,
2453 colorAtchCount,
2454 imagesFormat,
2455 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2456 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2457
2458 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[1]);
2459
2460 vk.cmdEndRendering(*m_cmdBuffer);
2461
2462 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2463 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2464
2465 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2466
2467 verifyResults(colorAtchCount, imagesFormat);
2468 }
2469 }
2470 }
2471
2472 class ContentsTwoSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
2473 {
2474 public:
2475 ContentsTwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
2476 const TestParameters& parameters);
2477 protected:
2478 void rendering (const VkPipeline pipeline,
2479 const std::vector<VkImageView>& attachmentBindInfos,
2480 const deUint32 colorAtchCount,
2481 ImagesLayout& imagesLayout,
2482 const ImagesFormat& imagesFormat) override;
2483
2484 Move<VkCommandBuffer> m_cmdBuffer2;
2485 Move<VkCommandBuffer> m_secCmdBuffers[2];
2486 };
2487
ContentsTwoSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)2488 ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::ContentsTwoSecondaryTwoPrimaryCmdBufferResuming (Context& context,
2489 const TestParameters& parameters)
2490 : DynamicRenderingTestInstance(context, parameters)
2491 {
2492 const DeviceInterface& vk = m_context.getDeviceInterface();
2493 const VkDevice device = m_context.getDevice();
2494
2495 m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
2496 m_secCmdBuffers[0] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2497 m_secCmdBuffers[1] = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2498 }
2499
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2500 void ContentsTwoSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
2501 const std::vector<VkImageView>& attachmentBindInfos,
2502 const deUint32 colorAtchCount,
2503 ImagesLayout& imagesLayout,
2504 const ImagesFormat& imagesFormat)
2505 {
2506 const DeviceInterface& vk = m_context.getDeviceInterface();
2507 const VkDevice device = m_context.getDevice();
2508 const VkQueue queue = m_context.getUniversalQueue();
2509
2510 VkCommandBuffer secCmdBuffers[2] = {
2511 *(m_secCmdBuffers[0]),
2512 *(m_secCmdBuffers[1])
2513 };
2514
2515 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2516 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2517 {
2518 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2519 const VkDeviceSize vertexBufferOffset = 0ull;
2520
2521 // secCmdBuffers
2522 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2523
2524 vk.cmdBindPipeline(secCmdBuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2525 vk.cmdBindVertexBuffers(secCmdBuffers[0], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2526
2527 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 8u, 0u);
2528 vk.cmdDraw(secCmdBuffers[0], 4u, 1u, 0u, 0u);
2529
2530 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2531
2532 // secCmdBuffers2
2533 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2534
2535 vk.cmdBindPipeline(secCmdBuffers[1], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2536 vk.cmdBindVertexBuffers(secCmdBuffers[1], 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2537
2538 vk.cmdDraw(secCmdBuffers[1], 4u, 1u, 4u, 0u);
2539
2540 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2541
2542 // Primary commandBuffer
2543 beginCommandBuffer(vk, *m_cmdBuffer);
2544 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2545
2546 beginRendering(*m_cmdBuffer,
2547 attachmentBindInfos,
2548 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2549 VK_RENDERING_SUSPENDING_BIT_KHR,
2550 colorAtchCount,
2551 imagesFormat,
2552 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2553 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2554
2555 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2556
2557 vk.cmdEndRendering(*m_cmdBuffer);
2558
2559 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2560
2561 // Primary commandBuffer2
2562 beginCommandBuffer(vk, *m_cmdBuffer2);
2563
2564 beginRendering(*m_cmdBuffer2,
2565 attachmentBindInfos,
2566 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2567 VK_RENDERING_RESUMING_BIT_KHR,
2568 colorAtchCount,
2569 imagesFormat,
2570 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2571 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2572
2573 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
2574
2575 vk.cmdEndRendering(*m_cmdBuffer2);
2576
2577 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
2578
2579 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
2580
2581 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
2582
2583 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2584 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2585 {
2586 verifyResults(colorAtchCount, imagesFormat);
2587
2588 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2589
2590 // secCmdBuffers
2591 beginSecondaryCmdBuffer(vk, secCmdBuffers[0], VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2592
2593 if (clearData.colorDepthClear1.size() != 0)
2594 {
2595 vk.cmdClearAttachments(secCmdBuffers[0],
2596 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2597 clearData.colorDepthClear1.data(),
2598 1, &clearData.rectColorDepth1);
2599 }
2600
2601 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2602 vk.cmdClearAttachments(secCmdBuffers[0], 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2603
2604 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[0]));
2605
2606 // secCmdBuffers2
2607 beginSecondaryCmdBuffer(vk, secCmdBuffers[1], VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2608
2609 if (clearData.colorDepthClear2.size() != 0)
2610 {
2611 vk.cmdClearAttachments(secCmdBuffers[1],
2612 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2613 clearData.colorDepthClear2.data(),
2614 1, &clearData.rectColorDepth2);
2615 }
2616
2617 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2618 vk.cmdClearAttachments(secCmdBuffers[1], 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2619
2620 VK_CHECK(vk.endCommandBuffer(secCmdBuffers[1]));
2621
2622 // Primary commandBuffer
2623 beginCommandBuffer(vk, *m_cmdBuffer);
2624 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2625
2626 beginRendering(*m_cmdBuffer,
2627 attachmentBindInfos,
2628 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2629 VK_RENDERING_SUSPENDING_BIT_KHR,
2630 colorAtchCount,
2631 imagesFormat,
2632 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2633 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2634
2635 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &secCmdBuffers[0]);
2636
2637 vk.cmdEndRendering(*m_cmdBuffer);
2638
2639 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2640
2641 // Primary commandBuffer2
2642 beginCommandBuffer(vk, *m_cmdBuffer2);
2643
2644 beginRendering(*m_cmdBuffer2,
2645 attachmentBindInfos,
2646 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2647 VK_RENDERING_RESUMING_BIT_KHR,
2648 colorAtchCount,
2649 imagesFormat,
2650 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2651 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2652
2653 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &secCmdBuffers[1]);
2654
2655 vk.cmdEndRendering(*m_cmdBuffer2);
2656
2657 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
2658
2659 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
2660
2661 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
2662
2663 verifyResults(colorAtchCount, imagesFormat);
2664 }
2665 }
2666 }
2667
2668 class ContentsPrimarySecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2669 {
2670 public:
2671 ContentsPrimarySecondaryCmdBufferResuming (Context& context,
2672 const TestParameters& parameters);
2673 protected:
2674 void rendering (const VkPipeline pipeline,
2675 const std::vector<VkImageView>& attachmentBindInfos,
2676 const deUint32 colorAtchCount,
2677 ImagesLayout& imagesLayout,
2678 const ImagesFormat& imagesFormat) override;
2679
2680 Move<VkCommandBuffer> m_secCmdBuffer;
2681 };
2682
ContentsPrimarySecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)2683 ContentsPrimarySecondaryCmdBufferResuming::ContentsPrimarySecondaryCmdBufferResuming (Context& context,
2684 const TestParameters& parameters)
2685 : DynamicRenderingTestInstance(context, parameters)
2686 {
2687 const DeviceInterface& vk = m_context.getDeviceInterface();
2688 const VkDevice device = m_context.getDevice();
2689
2690 m_secCmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2691 }
2692
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2693 void ContentsPrimarySecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
2694 const std::vector<VkImageView>& attachmentBindInfos,
2695 const deUint32 colorAtchCount,
2696 ImagesLayout& imagesLayout,
2697 const ImagesFormat& imagesFormat)
2698 {
2699 const DeviceInterface& vk = m_context.getDeviceInterface();
2700 const VkDevice device = m_context.getDevice();
2701 const VkQueue queue = m_context.getUniversalQueue();
2702
2703 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2704 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2705 {
2706 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2707 const VkDeviceSize vertexBufferOffset = 0ull;
2708
2709 // secCmdBuffer
2710 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2711
2712 vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2713 vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2714
2715 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 4u, 0u);
2716
2717 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2718
2719 // Primary commandBuffer
2720 beginCommandBuffer(vk, *m_cmdBuffer);
2721 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2722
2723 beginRendering(*m_cmdBuffer,
2724 attachmentBindInfos,
2725 VK_RENDERING_SUSPENDING_BIT_KHR,
2726 colorAtchCount,
2727 imagesFormat,
2728 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2729 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2730
2731 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2732 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2733
2734 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
2735 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
2736
2737 vk.cmdEndRendering(*m_cmdBuffer);
2738
2739 beginRendering(*m_cmdBuffer,
2740 attachmentBindInfos,
2741 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2742 VK_RENDERING_RESUMING_BIT_KHR,
2743 colorAtchCount,
2744 imagesFormat,
2745 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2746 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2747
2748 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2749
2750 vk.cmdEndRendering(*m_cmdBuffer);
2751
2752 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2753
2754 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2755
2756 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2757
2758 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2759 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2760 {
2761 verifyResults(colorAtchCount, imagesFormat);
2762
2763 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2764
2765 // secCmdBuffer
2766 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
2767
2768 if (clearData.colorDepthClear1.size() != 0)
2769 {
2770 vk.cmdClearAttachments(*m_secCmdBuffer,
2771 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2772 clearData.colorDepthClear1.data(),
2773 1, &clearData.rectColorDepth1);
2774 }
2775
2776 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2777 vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2778
2779 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2780
2781 // Primary commandBuffer
2782 beginCommandBuffer(vk, *m_cmdBuffer);
2783 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2784
2785 beginRendering(*m_cmdBuffer,
2786 attachmentBindInfos,
2787 VK_RENDERING_SUSPENDING_BIT_KHR,
2788 colorAtchCount,
2789 imagesFormat,
2790 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2791 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2792
2793 if (clearData.colorDepthClear2.size() != 0)
2794 {
2795 vk.cmdClearAttachments(*m_cmdBuffer,
2796 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2797 clearData.colorDepthClear2.data(),
2798 1, &clearData.rectColorDepth2);
2799 }
2800
2801 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2802 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2803
2804 vk.cmdEndRendering(*m_cmdBuffer);
2805
2806 beginRendering(*m_cmdBuffer,
2807 attachmentBindInfos,
2808 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2809 VK_RENDERING_RESUMING_BIT_KHR,
2810 colorAtchCount,
2811 imagesFormat,
2812 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2813 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2814
2815 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2816
2817 vk.cmdEndRendering(*m_cmdBuffer);
2818
2819 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2820
2821 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2822
2823 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2824
2825 verifyResults(colorAtchCount, imagesFormat);
2826 }
2827 }
2828 }
2829
2830 class ContentsSecondaryPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
2831 {
2832 public:
2833 ContentsSecondaryPrimaryCmdBufferResuming (Context& context,
2834 const TestParameters& parameters);
2835 protected:
2836 void rendering (const VkPipeline pipeline,
2837 const std::vector<VkImageView>& attachmentBindInfos,
2838 const deUint32 colorAtchCount,
2839 ImagesLayout& imagesLayout,
2840 const ImagesFormat& imagesFormat) override;
2841
2842 Move<VkCommandBuffer> m_secCmdBuffer;
2843 };
2844
ContentsSecondaryPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)2845 ContentsSecondaryPrimaryCmdBufferResuming::ContentsSecondaryPrimaryCmdBufferResuming (Context& context,
2846 const TestParameters& parameters)
2847 : DynamicRenderingTestInstance(context, parameters)
2848 {
2849 const DeviceInterface& vk = m_context.getDeviceInterface();
2850 const VkDevice device = m_context.getDevice();
2851
2852 m_secCmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
2853 }
2854
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)2855 void ContentsSecondaryPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
2856 const std::vector<VkImageView>& attachmentBindInfos,
2857 const deUint32 colorAtchCount,
2858 ImagesLayout& imagesLayout,
2859 const ImagesFormat& imagesFormat)
2860 {
2861 const DeviceInterface& vk = m_context.getDeviceInterface();
2862 const VkDevice device = m_context.getDevice();
2863 const VkQueue queue = m_context.getUniversalQueue();
2864
2865 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
2866 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
2867 {
2868 const VkBuffer vertexBuffer = m_vertexBuffer->object();
2869 const VkDeviceSize vertexBufferOffset = 0ull;
2870
2871 // secCmdBuffer
2872 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2873
2874 vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2875 vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2876
2877 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 8u, 0u);
2878 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 0u, 0u);
2879
2880 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2881
2882 // Primary commandBuffer
2883 beginCommandBuffer(vk, *m_cmdBuffer);
2884 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2885
2886 beginRendering(*m_cmdBuffer,
2887 attachmentBindInfos,
2888 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2889 VK_RENDERING_SUSPENDING_BIT_KHR,
2890 colorAtchCount,
2891 imagesFormat,
2892 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2893 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2894
2895 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2896
2897 vk.cmdEndRendering(*m_cmdBuffer);
2898
2899 beginRendering(*m_cmdBuffer,
2900 attachmentBindInfos,
2901 VK_RENDERING_RESUMING_BIT_KHR,
2902 colorAtchCount,
2903 imagesFormat,
2904 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2905 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2906
2907 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
2908 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
2909
2910 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 4u, 0u);
2911
2912 vk.cmdEndRendering(*m_cmdBuffer);
2913
2914 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2915
2916 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2917
2918 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2919
2920 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
2921 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
2922 {
2923 verifyResults(colorAtchCount, imagesFormat);
2924
2925 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
2926
2927 // secCmdBuffer
2928 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
2929
2930 if (clearData.colorDepthClear1.size() != 0)
2931 {
2932 vk.cmdClearAttachments(*m_secCmdBuffer,
2933 static_cast<deUint32>(clearData.colorDepthClear1.size()),
2934 clearData.colorDepthClear1.data(),
2935 1, &clearData.rectColorDepth1);
2936 }
2937
2938 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2939 vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
2940
2941 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
2942
2943 // Primary commandBuffer
2944 beginCommandBuffer(vk, *m_cmdBuffer);
2945 preBarier(colorAtchCount, imagesLayout, imagesFormat);
2946
2947 beginRendering(*m_cmdBuffer,
2948 attachmentBindInfos,
2949 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
2950 VK_RENDERING_SUSPENDING_BIT_KHR,
2951 colorAtchCount,
2952 imagesFormat,
2953 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2954 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2955
2956 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
2957
2958 vk.cmdEndRendering(*m_cmdBuffer);
2959
2960 beginRendering(*m_cmdBuffer,
2961 attachmentBindInfos,
2962 VK_RENDERING_RESUMING_BIT_KHR,
2963 colorAtchCount,
2964 imagesFormat,
2965 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
2966 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
2967
2968 if (clearData.colorDepthClear2.size() != 0)
2969 {
2970 vk.cmdClearAttachments(*m_cmdBuffer,
2971 static_cast<deUint32>(clearData.colorDepthClear2.size()),
2972 clearData.colorDepthClear2.data(),
2973 1, &clearData.rectColorDepth2);
2974 }
2975
2976 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
2977 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
2978
2979 vk.cmdEndRendering(*m_cmdBuffer);
2980
2981 copyImgToBuff(*m_cmdBuffer, colorAtchCount, imagesLayout, imagesFormat);
2982
2983 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
2984
2985 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
2986
2987 verifyResults(colorAtchCount, imagesFormat);
2988 }
2989 }
2990 }
2991
2992 class ContentsTwoPrimarySecondaryCmdBufferResuming : public DynamicRenderingTestInstance
2993 {
2994 public:
2995 ContentsTwoPrimarySecondaryCmdBufferResuming (Context& context,
2996 const TestParameters& parameters);
2997 protected:
2998 void rendering (const VkPipeline pipeline,
2999 const std::vector<VkImageView>& attachmentBindInfos,
3000 const deUint32 colorAtchCount,
3001 ImagesLayout& imagesLayout,
3002 const ImagesFormat& imagesFormat) override;
3003
3004 Move<VkCommandBuffer> m_cmdBuffer2;
3005 Move<VkCommandBuffer> m_secCmdBuffer;
3006 };
3007
ContentsTwoPrimarySecondaryCmdBufferResuming(Context & context,const TestParameters & parameters)3008 ContentsTwoPrimarySecondaryCmdBufferResuming::ContentsTwoPrimarySecondaryCmdBufferResuming (Context& context,
3009 const TestParameters& parameters)
3010 : DynamicRenderingTestInstance(context, parameters)
3011 {
3012 const DeviceInterface& vk = m_context.getDeviceInterface();
3013 const VkDevice device = m_context.getDevice();
3014
3015 m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
3016 m_secCmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
3017 }
3018
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)3019 void ContentsTwoPrimarySecondaryCmdBufferResuming::rendering (const VkPipeline pipeline,
3020 const std::vector<VkImageView>& attachmentBindInfos,
3021 const deUint32 colorAtchCount,
3022 ImagesLayout& imagesLayout,
3023 const ImagesFormat& imagesFormat)
3024 {
3025 const DeviceInterface& vk = m_context.getDeviceInterface();
3026 const VkDevice device = m_context.getDevice();
3027 const VkQueue queue = m_context.getUniversalQueue();
3028
3029 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
3030 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
3031 {
3032 const VkBuffer vertexBuffer = m_vertexBuffer->object();
3033 const VkDeviceSize vertexBufferOffset = 0ull;
3034
3035 // secCmdBuffer
3036 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
3037
3038 vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3039 vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3040
3041 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 4u, 0u);
3042
3043 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3044
3045 // Primary commandBuffer
3046 beginCommandBuffer(vk, *m_cmdBuffer);
3047 preBarier(colorAtchCount, imagesLayout, imagesFormat);
3048
3049 beginRendering(*m_cmdBuffer,
3050 attachmentBindInfos,
3051 VK_RENDERING_SUSPENDING_BIT_KHR,
3052 colorAtchCount,
3053 imagesFormat,
3054 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3055 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3056
3057 vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3058 vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3059
3060 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 8u, 0u);
3061 vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
3062
3063 vk.cmdEndRendering(*m_cmdBuffer);
3064 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3065
3066 // Primary commandBuffer2
3067 beginCommandBuffer(vk, *m_cmdBuffer2);
3068
3069 beginRendering(*m_cmdBuffer2,
3070 attachmentBindInfos,
3071 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3072 VK_RENDERING_RESUMING_BIT_KHR,
3073 colorAtchCount,
3074 imagesFormat,
3075 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3076 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3077
3078 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &(*m_secCmdBuffer));
3079
3080 vk.cmdEndRendering(*m_cmdBuffer2);
3081
3082 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3083
3084 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3085
3086 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3087
3088 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
3089 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
3090 {
3091 verifyResults(colorAtchCount, imagesFormat);
3092
3093 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
3094
3095 // secCmdBuffer
3096 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_RESUMING_BIT_KHR, colorAtchCount, imagesFormat);
3097
3098 if (clearData.colorDepthClear1.size() != 0)
3099 {
3100 vk.cmdClearAttachments(*m_secCmdBuffer,
3101 static_cast<deUint32>(clearData.colorDepthClear1.size()),
3102 clearData.colorDepthClear1.data(),
3103 1, &clearData.rectColorDepth1);
3104 }
3105
3106 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3107 vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
3108
3109 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3110
3111 // Primary commandBuffer
3112 beginCommandBuffer(vk, *m_cmdBuffer);
3113 preBarier(colorAtchCount, imagesLayout, imagesFormat);
3114
3115 beginRendering(*m_cmdBuffer,
3116 attachmentBindInfos,
3117 VK_RENDERING_SUSPENDING_BIT_KHR,
3118 colorAtchCount,
3119 imagesFormat,
3120 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3121 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3122
3123 if (clearData.colorDepthClear2.size() != 0)
3124 {
3125 vk.cmdClearAttachments(*m_cmdBuffer,
3126 static_cast<deUint32>(clearData.colorDepthClear2.size()),
3127 clearData.colorDepthClear2.data(),
3128 1, &clearData.rectColorDepth2);
3129 }
3130
3131 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3132 vk.cmdClearAttachments(*m_cmdBuffer, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
3133
3134 vk.cmdEndRendering(*m_cmdBuffer);
3135 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3136
3137 // Primary commandBuffer2
3138 beginCommandBuffer(vk, *m_cmdBuffer2);
3139
3140 beginRendering(*m_cmdBuffer2,
3141 attachmentBindInfos,
3142 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3143 VK_RENDERING_RESUMING_BIT_KHR,
3144 colorAtchCount,
3145 imagesFormat,
3146 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3147 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3148
3149 vk.cmdExecuteCommands(*m_cmdBuffer2, 1u, &(*m_secCmdBuffer));
3150
3151 vk.cmdEndRendering(*m_cmdBuffer2);
3152
3153 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3154
3155 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3156
3157 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3158
3159 verifyResults(colorAtchCount, imagesFormat);
3160 }
3161 }
3162 }
3163
3164 class ContentsSecondaryTwoPrimaryCmdBufferResuming : public DynamicRenderingTestInstance
3165 {
3166 public:
3167 ContentsSecondaryTwoPrimaryCmdBufferResuming (Context& context,
3168 const TestParameters& parameters);
3169 protected:
3170 void rendering (const VkPipeline pipeline,
3171 const std::vector<VkImageView>& attachmentBindInfos,
3172 const deUint32 colorAtchCount,
3173 ImagesLayout& imagesLayout,
3174 const ImagesFormat& imagesFormat) override;
3175
3176 Move<VkCommandBuffer> m_cmdBuffer2;
3177 Move<VkCommandBuffer> m_secCmdBuffer;
3178 };
3179
ContentsSecondaryTwoPrimaryCmdBufferResuming(Context & context,const TestParameters & parameters)3180 ContentsSecondaryTwoPrimaryCmdBufferResuming::ContentsSecondaryTwoPrimaryCmdBufferResuming (Context& context,
3181 const TestParameters& parameters)
3182 : DynamicRenderingTestInstance(context, parameters)
3183 {
3184 const DeviceInterface& vk = m_context.getDeviceInterface();
3185 const VkDevice device = m_context.getDevice();
3186
3187 m_cmdBuffer2 = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
3188 m_secCmdBuffer = allocateCommandBuffer(vk, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
3189 }
3190
rendering(const VkPipeline pipeline,const std::vector<VkImageView> & attachmentBindInfos,const deUint32 colorAtchCount,ImagesLayout & imagesLayout,const ImagesFormat & imagesFormat)3191 void ContentsSecondaryTwoPrimaryCmdBufferResuming::rendering (const VkPipeline pipeline,
3192 const std::vector<VkImageView>& attachmentBindInfos,
3193 const deUint32 colorAtchCount,
3194 ImagesLayout& imagesLayout,
3195 const ImagesFormat& imagesFormat)
3196 {
3197 const DeviceInterface& vk = m_context.getDeviceInterface();
3198 const VkDevice device = m_context.getDevice();
3199 const VkQueue queue = m_context.getUniversalQueue();
3200
3201 for (deUint32 attachmentLoadOp = 0; attachmentLoadOp < TEST_ATTACHMENT_LOAD_OP_LAST; ++attachmentLoadOp)
3202 for (deUint32 attachmentStoreOp = 0; attachmentStoreOp < TEST_ATTACHMENT_STORE_OP_LAST; ++attachmentStoreOp)
3203 {
3204 const VkBuffer vertexBuffer = m_vertexBuffer->object();
3205 const VkDeviceSize vertexBufferOffset = 0ull;
3206
3207 // secCmdBuffer
3208 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
3209
3210 vk.cmdBindPipeline(*m_secCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3211 vk.cmdBindVertexBuffers(*m_secCmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3212
3213 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 8u, 0u);
3214 vk.cmdDraw(*m_secCmdBuffer, 4u, 1u, 0u, 0u);
3215
3216 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3217
3218 // Primary commandBuffer
3219 beginCommandBuffer(vk, *m_cmdBuffer);
3220 preBarier(colorAtchCount, imagesLayout, imagesFormat);
3221
3222 beginRendering(*m_cmdBuffer,
3223 attachmentBindInfos,
3224 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3225 VK_RENDERING_SUSPENDING_BIT_KHR,
3226 colorAtchCount,
3227 imagesFormat,
3228 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3229 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3230
3231 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
3232
3233 vk.cmdEndRendering(*m_cmdBuffer);
3234 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3235
3236 // Primary commandBuffer2
3237 beginCommandBuffer(vk, *m_cmdBuffer2);
3238
3239 beginRendering(*m_cmdBuffer2,
3240 attachmentBindInfos,
3241 VK_RENDERING_RESUMING_BIT_KHR,
3242 colorAtchCount,
3243 imagesFormat,
3244 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3245 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3246
3247 vk.cmdBindPipeline(*m_cmdBuffer2, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
3248 vk.cmdBindVertexBuffers(*m_cmdBuffer2, 0u, 1u, &vertexBuffer, &vertexBufferOffset);
3249
3250 vk.cmdDraw(*m_cmdBuffer2, 4u, 1u, 4u, 0u);
3251
3252 vk.cmdEndRendering(*m_cmdBuffer2);
3253
3254 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3255
3256 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3257
3258 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3259
3260 if ((static_cast<VkAttachmentLoadOp>(attachmentLoadOp) == VK_ATTACHMENT_LOAD_OP_CLEAR) &&
3261 (static_cast<VkAttachmentStoreOp>(attachmentStoreOp) == VK_ATTACHMENT_STORE_OP_STORE))
3262 {
3263 verifyResults(colorAtchCount, imagesFormat);
3264
3265 const ClearAttachmentData clearData(colorAtchCount, imagesFormat.depth, imagesFormat.stencil);
3266
3267 // secCmdBuffer
3268 beginSecondaryCmdBuffer(vk, *m_secCmdBuffer, VK_RENDERING_SUSPENDING_BIT_KHR, colorAtchCount, imagesFormat);
3269
3270 if (clearData.colorDepthClear1.size() != 0)
3271 {
3272 vk.cmdClearAttachments(*m_secCmdBuffer,
3273 static_cast<deUint32>(clearData.colorDepthClear1.size()),
3274 clearData.colorDepthClear1.data(),
3275 1, &clearData.rectColorDepth1);
3276 }
3277
3278 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3279 vk.cmdClearAttachments(*m_secCmdBuffer, 1u, &clearData.stencilClear1, 1, &clearData.rectStencil1);
3280
3281 VK_CHECK(vk.endCommandBuffer(*m_secCmdBuffer));
3282
3283 // Primary commandBuffer
3284 beginCommandBuffer(vk, *m_cmdBuffer);
3285 preBarier(colorAtchCount, imagesLayout, imagesFormat);
3286
3287 beginRendering(*m_cmdBuffer,
3288 attachmentBindInfos,
3289 VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR |
3290 VK_RENDERING_SUSPENDING_BIT_KHR,
3291 colorAtchCount,
3292 imagesFormat,
3293 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3294 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3295
3296 vk.cmdExecuteCommands(*m_cmdBuffer, 1u, &(*m_secCmdBuffer));
3297
3298 vk.cmdEndRendering(*m_cmdBuffer);
3299 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
3300
3301 // Primary commandBuffer2
3302 beginCommandBuffer(vk, *m_cmdBuffer2);
3303
3304 beginRendering(*m_cmdBuffer2,
3305 attachmentBindInfos,
3306 VK_RENDERING_RESUMING_BIT_KHR,
3307 colorAtchCount,
3308 imagesFormat,
3309 static_cast<VkAttachmentLoadOp>(attachmentLoadOp),
3310 static_cast<VkAttachmentStoreOp>(attachmentStoreOp));
3311
3312 if (clearData.colorDepthClear2.size() != 0)
3313 {
3314 vk.cmdClearAttachments(*m_cmdBuffer2,
3315 static_cast<deUint32>(clearData.colorDepthClear2.size()),
3316 clearData.colorDepthClear2.data(),
3317 1, &clearData.rectColorDepth2);
3318 }
3319
3320 if (imagesFormat.stencil != VK_FORMAT_UNDEFINED)
3321 vk.cmdClearAttachments(*m_cmdBuffer2, 1u, &clearData.stencilClear2, 1, &clearData.rectStencil2);
3322
3323 vk.cmdEndRendering(*m_cmdBuffer2);
3324
3325 copyImgToBuff(*m_cmdBuffer2, colorAtchCount, imagesLayout, imagesFormat);
3326
3327 VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer2));
3328
3329 submitCommandsAndWait(vk, device, queue, *m_cmdBuffer, *m_cmdBuffer2);
3330
3331 verifyResults(colorAtchCount, imagesFormat);
3332 }
3333 }
3334 }
3335
3336 class BaseTestCase : public TestCase
3337 {
3338 public:
3339 BaseTestCase (tcu::TestContext& context,
3340 const std::string& name,
3341 const std::string& description,
3342 const TestParameters& parameters);
3343 virtual ~BaseTestCase (void);
3344
3345 protected:
3346 virtual void checkSupport (Context& context) const;
3347 virtual void initPrograms (SourceCollections& programCollection) const;
3348 virtual TestInstance* createInstance (Context& context) const;
3349
3350 const TestParameters m_parameters;
3351 };
3352
BaseTestCase(tcu::TestContext & context,const std::string & name,const std::string & description,const TestParameters & parameters)3353 BaseTestCase::BaseTestCase (tcu::TestContext& context,
3354 const std::string& name,
3355 const std::string& description,
3356 const TestParameters& parameters)
3357 : TestCase (context, name, description)
3358 , m_parameters (parameters)
3359 {
3360 }
3361
~BaseTestCase()3362 BaseTestCase::~BaseTestCase ()
3363 {
3364 }
3365
checkSupport(Context & context) const3366 void BaseTestCase::checkSupport (Context& context) const
3367 {
3368 if(!context.requireDeviceFunctionality("VK_KHR_dynamic_rendering"))
3369 TCU_THROW(NotSupportedError, "VK_KHR_dynamic_rendering not supported");
3370 }
3371
initPrograms(SourceCollections & programCollection) const3372 void BaseTestCase::initPrograms (SourceCollections& programCollection) const
3373 {
3374 // Vertex
3375 {
3376 std::ostringstream src;
3377 src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
3378 << "\n"
3379 << "layout(location = 0) in highp vec4 position;\n"
3380 << "layout(location = 0) out highp vec4 vsColor;\n"
3381 << "\n"
3382 << "out gl_PerVertex {\n"
3383 << " vec4 gl_Position;\n"
3384 << "};\n"
3385 << "\n"
3386 << "void main (void)\n"
3387 << "{\n"
3388 << " gl_Position = position;\n"
3389 << " vsColor = vec4(gl_Position.z * 5.0f, 1.0f, 0.0f, 1.0f);\n"
3390 << "}\n";
3391 programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
3392 }
3393
3394 // Fragment multi color attachment
3395 {
3396 std::ostringstream src;
3397 src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
3398 << "\n"
3399 << "layout(location = 0) in highp vec4 vsColor;\n";
3400
3401 for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
3402 src << "layout(location = " << ndx << ") out highp vec4 fsColor" << ndx << ";\n";
3403
3404 src << "\n"
3405 << "void main (void)\n"
3406 << "{\n"
3407 << " vec4 color = vsColor;\n";
3408 for (deUint32 ndx = 0; ndx < COLOR_ATTACHMENTS_NUMBER; ++ndx)
3409 {
3410 src << " color.z = 0.15f * " << ndx << ".0f;\n"
3411 << " fsColor" << ndx << " = color;\n";
3412 }
3413 src << "}\n";
3414 programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
3415 }
3416 }
3417
createInstance(Context & context) const3418 TestInstance* BaseTestCase::createInstance (Context& context) const
3419 {
3420 switch(m_parameters.testType)
3421 {
3422 case TEST_TYPE_SINGLE_CMDBUF:
3423 {
3424 return new DynamicRenderingTestInstance(context, m_parameters);
3425 }
3426 case TEST_TYPE_SINGLE_CMDBUF_RESUMING:
3427 {
3428 return new SingleCmdBufferResuming(context, m_parameters);
3429 }
3430 case TEST_TYPE_TWO_CMDBUF_RESUMING:
3431 {
3432 return new TwoPrimaryCmdBufferResuming(context, m_parameters);
3433 }
3434 case TEST_TYPE_SECONDARY_CMDBUF_RESUMING:
3435 {
3436 return new TwoSecondaryCmdBufferResuming(context, m_parameters);
3437 }
3438 case TEST_TYPE_SECONDARY_CMDBUF_TWO_PRIMARY_RESUMING:
3439 {
3440 return new TwoSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3441 }
3442 case TEST_TYPE_CONTENTS_SECONDARY_COMMAND_BUFFER:
3443 {
3444 return new ContentsSecondaryCmdBuffer(context, m_parameters);
3445 }
3446 case TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER:
3447 {
3448 return new ContentsTwoSecondaryCmdBuffer(context, m_parameters);
3449 }
3450 case TEST_TYPE_CONTENTS_2_SECONDARY_COMMAND_BUFFER_RESUMING:
3451 {
3452 return new ContentsTwoSecondaryCmdBufferResuming(context, m_parameters);
3453 }
3454 case TEST_TYPE_CONTENTS_2_SECONDARY_2_PRIMARY_COMDBUF_RESUMING:
3455 {
3456 return new ContentsTwoSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3457 }
3458 case TEST_TYPE_CONTENTS_PRIMARY_SECONDARY_COMDBUF_RESUMING:
3459 {
3460 return new ContentsPrimarySecondaryCmdBufferResuming(context, m_parameters);
3461 }
3462 case TEST_TYPE_CONTENTS_SECONDARY_PRIMARY_COMDBUF_RESUMING:
3463 {
3464 return new ContentsSecondaryPrimaryCmdBufferResuming(context, m_parameters);
3465 }
3466 case TEST_TYPE_CONTENTS_2_PRIMARY_SECONDARY_COMDBUF_RESUMING:
3467 {
3468 return new ContentsTwoPrimarySecondaryCmdBufferResuming(context, m_parameters);
3469 }
3470 case TEST_TYPE_CONTENTS_SECONDARY_2_PRIMARY_COMDBUF_RESUMING:
3471 {
3472 return new ContentsSecondaryTwoPrimaryCmdBufferResuming(context, m_parameters);
3473 }
3474 default:
3475 DE_FATAL("Impossible");
3476 }
3477 return nullptr;
3478 }
3479
dynamicRenderingTests(tcu::TestContext & testCtx,const TestParameters & parameters)3480 tcu::TestNode* dynamicRenderingTests (tcu::TestContext& testCtx, const TestParameters& parameters)
3481 {
3482 const std::string testName[TEST_TYPE_LAST] =
3483 {
3484 "single_cmdbuffer",
3485 "single_cmdbuffer_resuming",
3486 "2_cmdbuffers_resuming",
3487 "2_secondary_cmdbuffers_resuming",
3488 "2_secondary_2_primary_cmdbuffers_resuming",
3489 "contents_secondary_cmdbuffers",
3490 "contents_2_secondary_cmdbuffers",
3491 "contents_2_secondary_cmdbuffers_resuming",
3492 "contents_2_secondary_2_primary_cmdbuffers_resuming",
3493 "contents_primary_secondary_cmdbuffers_resuming",
3494 "contents_secondary_primary_cmdbuffers_resuming",
3495 "contents_2_primary_secondary_cmdbuffers_resuming",
3496 "contents_secondary_2_primary_cmdbuffers_resuming",
3497 };
3498
3499 return new BaseTestCase(testCtx, testName[parameters.testType], "Dynamic Rendering tests", parameters);
3500 }
3501
3502 } // anonymous
3503
createDynamicRenderingBasicTests(tcu::TestContext & testCtx)3504 tcu::TestCaseGroup* createDynamicRenderingBasicTests(tcu::TestContext& testCtx)
3505 {
3506 de::MovePtr<tcu::TestCaseGroup> dynamicRenderingGroup (new tcu::TestCaseGroup(testCtx, "basic", "Basic dynamic rendering tests"));
3507
3508 for (int testType = 0; testType < TEST_TYPE_LAST; ++testType)
3509 {
3510 const TestParameters parameters =
3511 {
3512 static_cast<TestType>(testType), // TestType testType;
3513 Vec4(0.0f, 0.0f, 0.0f, 1.0f), // const Vec4 clearColor;
3514 VK_FORMAT_R8G8B8A8_UNORM, // const VkFormat imageFormat;
3515 (UVec2(32, 32)) // const UVec2 renderSize;
3516 };
3517
3518 dynamicRenderingGroup->addChild(dynamicRenderingTests(testCtx, parameters));
3519 }
3520
3521 return dynamicRenderingGroup.release();
3522 }
3523
3524 } // renderpass
3525 } // vkt
3526