1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2017 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 Multi View Render Util
22 *//*--------------------------------------------------------------------*/
23
24 #include "vktMultiViewRenderUtil.hpp"
25 #include "vktMultiViewRenderPassUtil.hpp"
26
27 #include "vktTestCase.hpp"
28 #include "vkBuilderUtil.hpp"
29 #include "vkRefUtil.hpp"
30 #include "vkQueryUtil.hpp"
31 #include "vkTypeUtil.hpp"
32 #include "vkPrograms.hpp"
33 #include "vkPlatform.hpp"
34 #include "vkMemUtil.hpp"
35 #include "vkImageUtil.hpp"
36
37 #include "tcuTestLog.hpp"
38 #include "tcuResource.hpp"
39 #include "tcuImageCompare.hpp"
40 #include "tcuCommandLine.hpp"
41 #include "tcuTextureUtil.hpp"
42 #include "tcuRGBA.hpp"
43
44 namespace vkt
45 {
46 namespace MultiView
47 {
48 using namespace vk;
49 using de::MovePtr;
50 using de::UniquePtr;
51 using std::vector;
52
getAspectFlags(tcu::TextureFormat format)53 VkImageAspectFlags getAspectFlags(tcu::TextureFormat format)
54 {
55 VkImageAspectFlags aspectFlag = 0;
56 aspectFlag |= (tcu::hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0);
57 aspectFlag |= (tcu::hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0);
58
59 if (!aspectFlag)
60 aspectFlag = VK_IMAGE_ASPECT_COLOR_BIT;
61
62 return aspectFlag;
63 }
64
getStencilBufferFormat(const vk::VkFormat depthStencilImageFormat)65 VkFormat getStencilBufferFormat(const vk::VkFormat depthStencilImageFormat)
66 {
67 const tcu::TextureFormat tcuFormat = mapVkFormat(depthStencilImageFormat);
68 const VkFormat result = (tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS) ?
69 VK_FORMAT_S8_UINT :
70 VK_FORMAT_UNDEFINED;
71
72 DE_ASSERT(result != VK_FORMAT_UNDEFINED);
73
74 return result;
75 }
76
getDepthBufferFormat(const vk::VkFormat depthStencilImageFormat)77 VkFormat getDepthBufferFormat(const vk::VkFormat depthStencilImageFormat)
78 {
79 VkFormat result = VK_FORMAT_UNDEFINED;
80
81 switch (depthStencilImageFormat)
82 {
83 case VK_FORMAT_D16_UNORM:
84 case VK_FORMAT_D16_UNORM_S8_UINT:
85 {
86 result = VK_FORMAT_D16_UNORM;
87
88 break;
89 }
90
91 case VK_FORMAT_D32_SFLOAT:
92 case VK_FORMAT_D32_SFLOAT_S8_UINT:
93 {
94 result = VK_FORMAT_D32_SFLOAT;
95 break;
96 }
97
98 case VK_FORMAT_X8_D24_UNORM_PACK32:
99 case VK_FORMAT_D24_UNORM_S8_UINT:
100 {
101 result = VK_FORMAT_D24_UNORM_S8_UINT;
102 break;
103 }
104
105 default:
106 result = VK_FORMAT_UNDEFINED;
107 }
108
109 DE_ASSERT(result != VK_FORMAT_UNDEFINED);
110
111 return result;
112 }
113
makeImageCreateInfo(const VkImageType imageType,const VkExtent3D & extent,const VkFormat format,const VkImageUsageFlags usage,const VkSampleCountFlagBits samples)114 VkImageCreateInfo makeImageCreateInfo(const VkImageType imageType, const VkExtent3D &extent, const VkFormat format,
115 const VkImageUsageFlags usage, const VkSampleCountFlagBits samples)
116 {
117 const VkImageCreateInfo imageInfo = {
118 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
119 DE_NULL, // const void* pNext;
120 (VkImageCreateFlags)0, // VkImageCreateFlags flags;
121 imageType, // VkImageType imageType;
122 format, // VkFormat format;
123 {extent.width, extent.height, 1u}, // VkExtent3D extent;
124 1u, // uint32_t mipLevels;
125 extent.depth, // uint32_t arrayLayers;
126 samples, // VkSampleCountFlagBits samples;
127 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
128 usage, // VkImageUsageFlags usage;
129 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
130 0u, // uint32_t queueFamilyIndexCount;
131 DE_NULL, // const uint32_t* pQueueFamilyIndices;
132 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
133 };
134 return imageInfo;
135 }
136
makeDescriptorSetLayout(const DeviceInterface & vk,const VkDevice device)137 Move<VkDescriptorSetLayout> makeDescriptorSetLayout(const DeviceInterface &vk, const VkDevice device)
138 {
139 const VkDescriptorSetLayoutBinding binding = {
140 0u, //uint32_t binding;
141 vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, //VkDescriptorType descriptorType;
142 1u, //uint32_t descriptorCount;
143 vk::VK_SHADER_STAGE_FRAGMENT_BIT, //VkShaderStageFlags stageFlags;
144 DE_NULL //const VkSampler* pImmutableSamplers;
145 };
146
147 const VkDescriptorSetLayoutCreateInfo createInfo = {
148 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, //VkStructureType sType;
149 DE_NULL, //const void* pNext;
150 0u, //VkDescriptorSetLayoutCreateFlags flags;
151 1u, //uint32_t bindingCount;
152 &binding //const VkDescriptorSetLayoutBinding* pBindings;
153 };
154 return vk::createDescriptorSetLayout(vk, device, &createInfo);
155 }
156
157 template <typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep,
158 typename RenderPassCreateInfo>
makeRenderPass(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<uint32_t> & viewMasks,const VkSampleCountFlagBits samples,const VkAttachmentLoadOp colorLoadOp,const VkFormat dsFormat)159 Move<VkRenderPass> makeRenderPass(const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat,
160 const vector<uint32_t> &viewMasks, const VkSampleCountFlagBits samples,
161 const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat)
162 {
163 const bool dsAttacmentAvailable = (dsFormat != vk::VK_FORMAT_UNDEFINED);
164 const uint32_t subpassCount = static_cast<uint32_t>(viewMasks.size());
165 const AttachmentDesc
166 colorAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR
167 (
168 // || VkStructureType sType;
169 DE_NULL, // || const void* pNext;
170 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags;
171 colorFormat, // VkFormat format; || VkFormat format;
172 samples, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples;
173 colorLoadOp, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp;
174 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp;
175 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp;
176 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp;
177 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout;
178 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout;
179 );
180
181 const AttachmentRef
182 colorAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
183 (
184 // || VkStructureType sType;
185 DE_NULL, // || const void* pNext;
186 0u, // uint32_t attachment; || uint32_t attachment;
187 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; || VkImageLayout layout;
188 0u // || VkImageAspectFlags aspectMask;
189 );
190
191 const AttachmentDesc
192 dsAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR
193 (
194 // || VkStructureType sType;
195 DE_NULL, // || const void* pNext;
196 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags;
197 dsFormat, // VkFormat format; || VkFormat format;
198 samples, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples;
199 VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp;
200 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp;
201 VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp;
202 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp;
203 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout;
204 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout;
205 );
206
207 const AttachmentRef
208 depthAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
209 (
210 // || VkStructureType sType;
211 DE_NULL, // || const void* pNext;
212 dsAttacmentAvailable ? 1u : VK_ATTACHMENT_UNUSED, // uint32_t attachment; || uint32_t attachment;
213 dsAttacmentAvailable ? // VkImageLayout layout; || VkImageLayout layout;
214 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
215 VK_IMAGE_LAYOUT_UNDEFINED,
216 0u // || VkImageAspectFlags aspectMask;
217 );
218
219 const AttachmentDesc attachmentDescriptions[] = {
220 colorAttachmentDescription,
221 dsAttachmentDescription,
222 };
223
224 DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) ||
225 (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)));
226
227 vector<SubpassDesc> subpassDescriptions;
228 for (uint32_t subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
229 {
230 const uint32_t viewMask =
231 (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)) ? viewMasks[subpassNdx] : 0u;
232 const SubpassDesc
233 subpassDescription // VkSubpassDescription || VkSubpassDescription2KHR
234 (
235 // || VkStructureType sType;
236 DE_NULL, // || const void* pNext;
237 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; || VkSubpassDescriptionFlags flags;
238 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; || VkPipelineBindPoint pipelineBindPoint;
239 viewMask, // || uint32_t viewMask;
240 0u, // uint32_t inputAttachmentCount; || uint32_t inputAttachmentCount;
241 DE_NULL, // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2KHR* pInputAttachments;
242 1u, // uint32_t colorAttachmentCount; || uint32_t colorAttachmentCount;
243 &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2KHR* pColorAttachments;
244 DE_NULL, // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2KHR* pResolveAttachments;
245 &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2KHR* pDepthStencilAttachment;
246 0u, // uint32_t preserveAttachmentCount; || uint32_t preserveAttachmentCount;
247 DE_NULL // const uint32_t* pPreserveAttachments; || const uint32_t* pPreserveAttachments;
248 );
249
250 subpassDescriptions.push_back(subpassDescription);
251 }
252
253 const VkRenderPassMultiviewCreateInfo renderPassMultiviewInfo = {
254 VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, // VkStructureType sType;
255 DE_NULL, // const void* pNext;
256 subpassCount, // uint32_t subpassCount;
257 &viewMasks[0], // const uint32_t* pViewMasks;
258 0u, // uint32_t dependencyCount;
259 DE_NULL, // const int32_t* pViewOffsets;
260 0u, // uint32_t correlationMaskCount;
261 DE_NULL, // const uint32_t* pCorrelationMasks;
262 };
263 const VkRenderPassMultiviewCreateInfo *renderPassMultiviewInfoPtr =
264 (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) ? &renderPassMultiviewInfo : DE_NULL;
265
266 const VkPipelineStageFlags srcStageMask = dsAttacmentAvailable ? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT :
267 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
268 const VkAccessFlags srcAccessMask =
269 dsAttacmentAvailable ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
270 vector<SubpassDep> subpassDependencies;
271 for (uint32_t subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
272 {
273 const auto dependencyFlags = (subpassNdx == subpassCount - 1u) ?
274 (VK_DEPENDENCY_BY_REGION_BIT | VK_DEPENDENCY_VIEW_LOCAL_BIT) :
275 VK_DEPENDENCY_VIEW_LOCAL_BIT;
276
277 const SubpassDep
278 subpassDependency // VkSubpassDependency || VkSubpassDependency2KHR
279 (
280 // || VkStructureType sType;
281 DE_NULL, // || const void* pNext;
282 subpassNdx, // uint32_t srcSubpass; || uint32_t srcSubpass;
283 (subpassNdx == subpassCount - 1u) ? subpassNdx :
284 subpassNdx + 1u, // uint32_t dstSubpass; || uint32_t dstSubpass;
285 srcStageMask, // VkPipelineStageFlags srcStageMask; || VkPipelineStageFlags srcStageMask;
286 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask; || VkPipelineStageFlags dstStageMask;
287 srcAccessMask, // VkAccessFlags srcAccessMask; || VkAccessFlags srcAccessMask;
288 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask; || VkAccessFlags dstAccessMask;
289 dependencyFlags, // VkDependencyFlags dependencyFlags; || VkDependencyFlags dependencyFlags;
290 0 // || int32_t viewOffset;
291 );
292 subpassDependencies.push_back(subpassDependency);
293 }
294
295 const RenderPassCreateInfo
296 renderPassInfo // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR
297 (
298 // VkStructureType sType; || VkStructureType sType;
299 renderPassMultiviewInfoPtr, // const void* pNext; || const void* pNext;
300 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags;
301 dsAttacmentAvailable ? 2u : 1u, // uint32_t attachmentCount; || uint32_t attachmentCount;
302 attachmentDescriptions, // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2KHR* pAttachments;
303 subpassCount, // uint32_t subpassCount; || uint32_t subpassCount;
304 &subpassDescriptions
305 [0], // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2KHR* pSubpasses;
306 subpassCount, // uint32_t dependencyCount; || uint32_t dependencyCount;
307 &subpassDependencies
308 [0], // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2KHR* pDependencies;
309 0u, // || uint32_t correlatedViewMaskCount;
310 DE_NULL // || const uint32_t* pCorrelatedViewMasks;
311 );
312
313 return renderPassInfo.createRenderPass(vk, device);
314 }
315
316 // Instantiate function for legacy renderpass structures
317 template Move<VkRenderPass> makeRenderPass<AttachmentDescription1, AttachmentReference1, SubpassDescription1,
318 SubpassDependency1, RenderPassCreateInfo1>(
319 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
320 const VkSampleCountFlagBits samples, const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat);
321
322 // Instantiate function for renderpass2 structures
323 template Move<VkRenderPass> makeRenderPass<AttachmentDescription2, AttachmentReference2, SubpassDescription2,
324 SubpassDependency2, RenderPassCreateInfo2>(
325 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
326 const VkSampleCountFlagBits samples, const VkAttachmentLoadOp colorLoadOp, const VkFormat dsFormat);
327
328 template <typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep,
329 typename RenderPassCreateInfo>
makeRenderPassWithDepth(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<uint32_t> & viewMasks,const VkFormat dsFormat)330 Move<VkRenderPass> makeRenderPassWithDepth(const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat,
331 const vector<uint32_t> &viewMasks, const VkFormat dsFormat)
332 {
333 return makeRenderPass<AttachmentDesc, AttachmentRef, SubpassDesc, SubpassDep, RenderPassCreateInfo>(
334 vk, device, colorFormat, viewMasks, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR, dsFormat);
335 }
336
337 // Instantiate function for legacy renderpass structures
338 template Move<VkRenderPass> makeRenderPassWithDepth<AttachmentDescription1, AttachmentReference1, SubpassDescription1,
339 SubpassDependency1, RenderPassCreateInfo1>(
340 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
341 const VkFormat dsFormat);
342
343 // Instantiate function for renderpass2 structures
344 template Move<VkRenderPass> makeRenderPassWithDepth<AttachmentDescription2, AttachmentReference2, SubpassDescription2,
345 SubpassDependency2, RenderPassCreateInfo2>(
346 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
347 const VkFormat dsFormat);
348
349 template <typename AttachmentDesc, typename AttachmentRef, typename SubpassDesc, typename SubpassDep,
350 typename RenderPassCreateInfo>
makeRenderPassWithAttachments(const DeviceInterface & vk,const VkDevice device,const VkFormat colorFormat,const vector<uint32_t> & viewMasks,bool useAspects)351 Move<VkRenderPass> makeRenderPassWithAttachments(const DeviceInterface &vk, const VkDevice device,
352 const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
353 bool useAspects)
354 {
355 const uint32_t subpassCount = static_cast<uint32_t>(viewMasks.size());
356
357 const AttachmentDesc
358 colorAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR
359 (
360 // || VkStructureType sType;
361 DE_NULL, // || const void* pNext;
362 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags;
363 colorFormat, // VkFormat format; || VkFormat format;
364 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples;
365 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp;
366 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp;
367 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp;
368 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp;
369 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout;
370 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout; || VkImageLayout finalLayout;
371 );
372
373 const AttachmentDesc
374 inputAttachmentDescription // VkAttachmentDescription || VkAttachmentDescription2KHR
375 (
376 // || VkStructureType sType;
377 DE_NULL, // || const void* pNext;
378 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; || VkAttachmentDescriptionFlags flags;
379 colorFormat, // VkFormat format; || VkFormat format;
380 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; || VkSampleCountFlagBits samples;
381 VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp; || VkAttachmentLoadOp loadOp;
382 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; || VkAttachmentStoreOp storeOp;
383 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; || VkAttachmentLoadOp stencilLoadOp;
384 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; || VkAttachmentStoreOp stencilStoreOp;
385 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout initialLayout; || VkImageLayout initialLayout;
386 VK_IMAGE_LAYOUT_GENERAL // VkImageLayout finalLayout; || VkImageLayout finalLayout;
387 );
388
389 vector<AttachmentDesc> attachments;
390 attachments.push_back(colorAttachmentDescription);
391 attachments.push_back(inputAttachmentDescription);
392
393 const AttachmentRef
394 colorAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
395 (
396 // || VkStructureType sType;
397 DE_NULL, // || const void* pNext;
398 0u, // uint32_t attachment; || uint32_t attachment;
399 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout; || VkImageLayout layout;
400 0u // || VkImageAspectFlags aspectMask;
401 );
402
403 const AttachmentRef
404 inputAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
405 (
406 // || VkStructureType sType;
407 DE_NULL, // || const void* pNext;
408 1u, // uint32_t attachment; || uint32_t attachment;
409 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout layout; || VkImageLayout layout;
410 useAspects ? VK_IMAGE_ASPECT_COLOR_BIT :
411 static_cast<VkImageAspectFlagBits>(0u) // || VkImageAspectFlags aspectMask;
412 );
413
414 const AttachmentRef
415 depthAttachmentReference // VkAttachmentReference || VkAttachmentReference2KHR
416 (
417 // || VkStructureType sType;
418 DE_NULL, // || const void* pNext;
419 VK_ATTACHMENT_UNUSED, // uint32_t attachment; || uint32_t attachment;
420 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout layout; || VkImageLayout layout;
421 0u // || VkImageAspectFlags aspectMask;
422 );
423
424 DE_ASSERT((typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1)) ||
425 (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)));
426
427 vector<SubpassDesc> subpassDescriptions;
428 for (uint32_t subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx)
429 {
430 const uint32_t viewMask =
431 (typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo2)) ? viewMasks[subpassNdx] : 0u;
432 const SubpassDesc
433 subpassDescription // VkSubpassDescription || VkSubpassDescription2KHR
434 (
435 // || VkStructureType sType;
436 DE_NULL, // || const void* pNext;
437 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; || VkSubpassDescriptionFlags flags;
438 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; || VkPipelineBindPoint pipelineBindPoint;
439 viewMask, // || uint32_t viewMask;
440 1u, // uint32_t inputAttachmentCount; || uint32_t inputAttachmentCount;
441 &inputAttachmentReference, // const VkAttachmentReference* pInputAttachments; || const VkAttachmentReference2KHR* pInputAttachments;
442 1u, // uint32_t colorAttachmentCount; || uint32_t colorAttachmentCount;
443 &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; || const VkAttachmentReference2KHR* pColorAttachments;
444 DE_NULL, // const VkAttachmentReference* pResolveAttachments; || const VkAttachmentReference2KHR* pResolveAttachments;
445 &depthAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; || const VkAttachmentReference2KHR* pDepthStencilAttachment;
446 0u, // uint32_t preserveAttachmentCount; || uint32_t preserveAttachmentCount;
447 DE_NULL // const uint32_t* pPreserveAttachments; || const uint32_t* pPreserveAttachments;
448 );
449 subpassDescriptions.push_back(subpassDescription);
450 }
451
452 const VkRenderPassMultiviewCreateInfo renderPassMultiviewInfo = {
453 VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, //VkStructureType sType;
454 DE_NULL, //const void* pNext;
455 subpassCount, //uint32_t subpassCount;
456 &viewMasks[0], //const uint32_t* pViewMasks;
457 0u, //uint32_t dependencyCount;
458 DE_NULL, //const int32_t* pViewOffsets;
459 0u, //uint32_t correlationMaskCount;
460 DE_NULL, //const uint32_t* pCorrelationMasks;
461 };
462 const VkRenderPassMultiviewCreateInfo *renderPassMultiviewInfoPtr =
463 typeid(RenderPassCreateInfo) == typeid(RenderPassCreateInfo1) ? &renderPassMultiviewInfo : DE_NULL;
464
465 vector<SubpassDep> subpassDependencies;
466 for (uint32_t subpassNdx = 0u; subpassNdx < subpassCount; ++subpassNdx)
467 {
468 const auto dependencyFlags = (subpassNdx == subpassCount - 1u) ?
469 (VK_DEPENDENCY_BY_REGION_BIT | VK_DEPENDENCY_VIEW_LOCAL_BIT) :
470 VK_DEPENDENCY_VIEW_LOCAL_BIT;
471
472 const SubpassDep
473 subpassDependency // VkSubpassDependency || VkSubpassDependency2KHR
474 (
475 // || VkStructureType sType;
476 DE_NULL, // || const void* pNext;
477 subpassNdx, // uint32_t srcSubpass; || uint32_t srcSubpass;
478 (subpassNdx == subpassCount - 1u) ? subpassNdx :
479 subpassNdx + 1u, // uint32_t dstSubpass; || uint32_t dstSubpass;
480 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask; || VkPipelineStageFlags srcStageMask;
481 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask; || VkPipelineStageFlags dstStageMask;
482 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; || VkAccessFlags srcAccessMask;
483 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask; || VkAccessFlags dstAccessMask;
484 dependencyFlags, // VkDependencyFlags dependencyFlags; || VkDependencyFlags dependencyFlags;
485 0 // || int32_t viewOffset;
486 );
487 subpassDependencies.push_back(subpassDependency);
488 }
489
490 const RenderPassCreateInfo
491 renderPassInfo // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR
492 (
493 // VkStructureType sType; || VkStructureType sType;
494 renderPassMultiviewInfoPtr, // const void* pNext; || const void* pNext;
495 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; || VkRenderPassCreateFlags flags;
496 2u, // uint32_t attachmentCount; || uint32_t attachmentCount;
497 &attachments
498 [0], // const VkAttachmentDescription* pAttachments; || const VkAttachmentDescription2KHR* pAttachments;
499 subpassCount, // uint32_t subpassCount; || uint32_t subpassCount;
500 &subpassDescriptions
501 [0], // const VkSubpassDescription* pSubpasses; || const VkSubpassDescription2KHR* pSubpasses;
502 subpassCount, // uint32_t dependencyCount; || uint32_t dependencyCount;
503 &subpassDependencies
504 [0], // const VkSubpassDependency* pDependencies; || const VkSubpassDependency2KHR* pDependencies;
505 0u, // || uint32_t correlatedViewMaskCount;
506 DE_NULL // || const uint32_t* pCorrelatedViewMasks;
507 );
508
509 return renderPassInfo.createRenderPass(vk, device);
510 }
511
512 // Instantiate function for legacy renderpass structures
513 template Move<VkRenderPass> makeRenderPassWithAttachments<
514 AttachmentDescription1, AttachmentReference1, SubpassDescription1, SubpassDependency1, RenderPassCreateInfo1>(
515 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
516 bool useAspects);
517
518 // Instantiate function for renderpass2 structures
519 template Move<VkRenderPass> makeRenderPassWithAttachments<
520 AttachmentDescription2, AttachmentReference2, SubpassDescription2, SubpassDependency2, RenderPassCreateInfo2>(
521 const DeviceInterface &vk, const VkDevice device, const VkFormat colorFormat, const vector<uint32_t> &viewMasks,
522 bool useAspects);
523
beginSecondaryCommandBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,const VkRenderPass renderPass,const uint32_t subpass,const VkFramebuffer framebuffer)524 void beginSecondaryCommandBuffer(const DeviceInterface &vk, const VkCommandBuffer commandBuffer,
525 const VkRenderPass renderPass, const uint32_t subpass, const VkFramebuffer framebuffer)
526 {
527 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo = {
528 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, //VkStructureType sType;
529 DE_NULL, //const void* pNext;
530 renderPass, //VkRenderPass renderPass;
531 subpass, //uint32_t subpass;
532 framebuffer, //VkFramebuffer framebuffer;
533 VK_FALSE, //VkBool32 occlusionQueryEnable;
534 (VkQueryControlFlags)0u, //VkQueryControlFlags queryFlags;
535 (VkQueryPipelineStatisticFlags)0u, //VkQueryPipelineStatisticFlags pipelineStatistics;
536 };
537
538 const VkCommandBufferBeginInfo info = {
539 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
540 DE_NULL, // const void* pNext;
541 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, // VkCommandBufferUsageFlags flags;
542 &secCmdBufInheritInfo, // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
543 };
544 VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
545 }
546
imageBarrier(const DeviceInterface & vk,const VkCommandBuffer cmdBuffer,const VkImage image,const VkImageSubresourceRange subresourceRange,const VkImageLayout oldLayout,const VkImageLayout newLayout,const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkPipelineStageFlags srcStageMask,const VkPipelineStageFlags dstStageMask)547 void imageBarrier(const DeviceInterface &vk, const VkCommandBuffer cmdBuffer, const VkImage image,
548 const VkImageSubresourceRange subresourceRange, const VkImageLayout oldLayout,
549 const VkImageLayout newLayout, const VkAccessFlags srcAccessMask, const VkAccessFlags dstAccessMask,
550 const VkPipelineStageFlags srcStageMask, const VkPipelineStageFlags dstStageMask)
551 {
552 const VkImageMemoryBarrier barrier = {
553 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
554 DE_NULL, // const void* pNext;
555 srcAccessMask, // VkAccessFlags srcAccessMask;
556 dstAccessMask, // VkAccessFlags dstAccessMask;
557 oldLayout, // VkImageLayout oldLayout;
558 newLayout, // VkImageLayout newLayout;
559 VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex;
560 VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex;
561 image, // VkImage image;
562 subresourceRange, // VkImageSubresourceRange subresourceRange;
563 };
564
565 vk.cmdPipelineBarrier(cmdBuffer, srcStageMask, dstStageMask, (VkDependencyFlags)0, 0u,
566 (const VkMemoryBarrier *)DE_NULL, 0u, (const VkBufferMemoryBarrier *)DE_NULL, 1u, &barrier);
567 }
568
569 } // namespace MultiView
570 } // namespace vkt
571