1*b7893ccfSSadaf Ebrahimi /*
2*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 The Khronos Group Inc.
3*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 Valve Corporation
4*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 LunarG, Inc.
5*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 Google, Inc.
6*b7893ccfSSadaf Ebrahimi *
7*b7893ccfSSadaf Ebrahimi * Licensed under the Apache License, Version 2.0 (the "License");
8*b7893ccfSSadaf Ebrahimi * you may not use this file except in compliance with the License.
9*b7893ccfSSadaf Ebrahimi * You may obtain a copy of the License at
10*b7893ccfSSadaf Ebrahimi *
11*b7893ccfSSadaf Ebrahimi * http://www.apache.org/licenses/LICENSE-2.0
12*b7893ccfSSadaf Ebrahimi *
13*b7893ccfSSadaf Ebrahimi * Author: Chia-I Wu <[email protected]>
14*b7893ccfSSadaf Ebrahimi * Author: Chris Forbes <[email protected]>
15*b7893ccfSSadaf Ebrahimi * Author: Courtney Goeltzenleuchter <[email protected]>
16*b7893ccfSSadaf Ebrahimi * Author: Mark Lobodzinski <[email protected]>
17*b7893ccfSSadaf Ebrahimi * Author: Mike Stroyan <[email protected]>
18*b7893ccfSSadaf Ebrahimi * Author: Tobin Ehlis <[email protected]>
19*b7893ccfSSadaf Ebrahimi * Author: Tony Barbour <[email protected]>
20*b7893ccfSSadaf Ebrahimi * Author: Cody Northrop <[email protected]>
21*b7893ccfSSadaf Ebrahimi * Author: Dave Houlton <[email protected]>
22*b7893ccfSSadaf Ebrahimi * Author: Jeremy Kniager <[email protected]>
23*b7893ccfSSadaf Ebrahimi * Author: Shannon McPherson <[email protected]>
24*b7893ccfSSadaf Ebrahimi * Author: John Zulauf <[email protected]>
25*b7893ccfSSadaf Ebrahimi * Author: Tobias Hector <[email protected]>
26*b7893ccfSSadaf Ebrahimi */
27*b7893ccfSSadaf Ebrahimi
28*b7893ccfSSadaf Ebrahimi #include "cast_utils.h"
29*b7893ccfSSadaf Ebrahimi #include "layer_validation_tests.h"
30*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferRenderPassBeginImageViewMismatchTests)31*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferRenderPassBeginImageViewMismatchTests) {
32*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION(
33*b7893ccfSSadaf Ebrahimi "Begin a renderPass where the image views specified do not match the parameters used to create the framebuffer and render "
34*b7893ccfSSadaf Ebrahimi "pass.");
35*b7893ccfSSadaf Ebrahimi
36*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
37*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
38*b7893ccfSSadaf Ebrahimi } else {
39*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
40*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
41*b7893ccfSSadaf Ebrahimi return;
42*b7893ccfSSadaf Ebrahimi }
43*b7893ccfSSadaf Ebrahimi
44*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
45*b7893ccfSSadaf Ebrahimi bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
46*b7893ccfSSadaf Ebrahimi
47*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
48*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
49*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
50*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
51*b7893ccfSSadaf Ebrahimi } else {
52*b7893ccfSSadaf Ebrahimi printf("%s test requires VK_KHR_imageless_framebuffer, not available. Skipping.\n", kSkipPrefix);
53*b7893ccfSSadaf Ebrahimi return;
54*b7893ccfSSadaf Ebrahimi }
55*b7893ccfSSadaf Ebrahimi
56*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {};
57*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
58*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE;
59*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {};
60*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
61*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures;
62*b7893ccfSSadaf Ebrahimi
63*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
64*b7893ccfSSadaf Ebrahimi
65*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
66*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
67*b7893ccfSSadaf Ebrahimi VkFormat attachmentFormats[2] = {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM};
68*b7893ccfSSadaf Ebrahimi VkFormat framebufferAttachmentFormats[3] = {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM};
69*b7893ccfSSadaf Ebrahimi
70*b7893ccfSSadaf Ebrahimi // Create a renderPass with a single attachment
71*b7893ccfSSadaf Ebrahimi VkAttachmentDescription attachmentDescription = {};
72*b7893ccfSSadaf Ebrahimi attachmentDescription.format = attachmentFormats[0];
73*b7893ccfSSadaf Ebrahimi attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
74*b7893ccfSSadaf Ebrahimi attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
75*b7893ccfSSadaf Ebrahimi VkAttachmentReference attachmentReference = {};
76*b7893ccfSSadaf Ebrahimi attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
77*b7893ccfSSadaf Ebrahimi VkSubpassDescription subpassDescription = {};
78*b7893ccfSSadaf Ebrahimi subpassDescription.colorAttachmentCount = 1;
79*b7893ccfSSadaf Ebrahimi subpassDescription.pColorAttachments = &attachmentReference;
80*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPassCreateInfo = {};
81*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
82*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
83*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 1;
84*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = &attachmentDescription;
85*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
86*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
87*b7893ccfSSadaf Ebrahimi vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass);
88*b7893ccfSSadaf Ebrahimi
89*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {};
90*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
91*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
92*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.width = attachmentWidth;
93*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.height = attachmentHeight;
94*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.layerCount = 1;
95*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.viewFormatCount = 2;
96*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.pViewFormats = framebufferAttachmentFormats;
97*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
98*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
99*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1;
100*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo;
101*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
102*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
103*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
104*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
105*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
106*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
107*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
108*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 1;
109*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pAttachments = nullptr;
110*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
111*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer;
112*b7893ccfSSadaf Ebrahimi
113*b7893ccfSSadaf Ebrahimi VkImageFormatListCreateInfoKHR imageFormatListCreateInfo = {};
114*b7893ccfSSadaf Ebrahimi imageFormatListCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
115*b7893ccfSSadaf Ebrahimi imageFormatListCreateInfo.viewFormatCount = 2;
116*b7893ccfSSadaf Ebrahimi imageFormatListCreateInfo.pViewFormats = attachmentFormats;
117*b7893ccfSSadaf Ebrahimi VkImageCreateInfo imageCreateInfo = {};
118*b7893ccfSSadaf Ebrahimi imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
119*b7893ccfSSadaf Ebrahimi imageCreateInfo.pNext = &imageFormatListCreateInfo;
120*b7893ccfSSadaf Ebrahimi imageCreateInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
121*b7893ccfSSadaf Ebrahimi imageCreateInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
122*b7893ccfSSadaf Ebrahimi imageCreateInfo.extent.width = attachmentWidth;
123*b7893ccfSSadaf Ebrahimi imageCreateInfo.extent.height = attachmentHeight;
124*b7893ccfSSadaf Ebrahimi imageCreateInfo.extent.depth = 1;
125*b7893ccfSSadaf Ebrahimi imageCreateInfo.arrayLayers = 1;
126*b7893ccfSSadaf Ebrahimi imageCreateInfo.mipLevels = 10;
127*b7893ccfSSadaf Ebrahimi imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
128*b7893ccfSSadaf Ebrahimi imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
129*b7893ccfSSadaf Ebrahimi imageCreateInfo.format = attachmentFormats[0];
130*b7893ccfSSadaf Ebrahimi
131*b7893ccfSSadaf Ebrahimi VkImageObj imageObject(m_device);
132*b7893ccfSSadaf Ebrahimi imageObject.init(&imageCreateInfo);
133*b7893ccfSSadaf Ebrahimi VkImage image = imageObject.image();
134*b7893ccfSSadaf Ebrahimi
135*b7893ccfSSadaf Ebrahimi VkImageViewCreateInfo imageViewCreateInfo = {};
136*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
137*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.image = image;
138*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
139*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.format = attachmentFormats[0];
140*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.subresourceRange.layerCount = 1;
141*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.subresourceRange.levelCount = 1;
142*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
143*b7893ccfSSadaf Ebrahimi VkImageView imageView;
144*b7893ccfSSadaf Ebrahimi vkCreateImageView(m_device->device(), &imageViewCreateInfo, NULL, &imageView);
145*b7893ccfSSadaf Ebrahimi
146*b7893ccfSSadaf Ebrahimi VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo = {};
147*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR;
148*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pNext = nullptr;
149*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.attachmentCount = 1;
150*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView;
151*b7893ccfSSadaf Ebrahimi VkRenderPassBeginInfo renderPassBeginInfo = {};
152*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
153*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.pNext = &renderPassAttachmentBeginInfo;
154*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.renderPass = renderPass;
155*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.renderArea.extent.width = attachmentWidth;
156*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.renderArea.extent.height = attachmentHeight;
157*b7893ccfSSadaf Ebrahimi
158*b7893ccfSSadaf Ebrahimi // Imageless framebuffer creation bit not present
159*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pAttachments = &imageView;
160*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = 0;
161*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
162*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
163*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
164*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03207", "VUID-VkRenderPassBeginInfo-framebuffer-03207");
165*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
166*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pAttachments = nullptr;
167*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
168*b7893ccfSSadaf Ebrahimi
169*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
170*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.attachmentCount = 2;
171*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
172*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
173*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03208", "VUID-VkRenderPassBeginInfo-framebuffer-03208");
174*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.attachmentCount = 1;
175*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
176*b7893ccfSSadaf Ebrahimi
177*b7893ccfSSadaf Ebrahimi // Mismatched number of attachments
178*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
179*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.attachmentCount = 2;
180*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
181*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
182*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03208", "VUID-VkRenderPassBeginInfo-framebuffer-03208");
183*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.attachmentCount = 1;
184*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
185*b7893ccfSSadaf Ebrahimi
186*b7893ccfSSadaf Ebrahimi // Mismatched flags
187*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.flags = 0;
188*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
189*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
190*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
191*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03209", "VUID-VkRenderPassBeginInfo-framebuffer-03209");
192*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
193*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
194*b7893ccfSSadaf Ebrahimi
195*b7893ccfSSadaf Ebrahimi // Mismatched usage
196*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
197*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
198*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
199*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
200*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03210", "VUID-VkRenderPassBeginInfo-framebuffer-03210");
201*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
202*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
203*b7893ccfSSadaf Ebrahimi
204*b7893ccfSSadaf Ebrahimi // Mismatched width
205*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.width += 1;
206*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
207*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
208*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
209*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03211", "VUID-VkRenderPassBeginInfo-framebuffer-03211");
210*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
211*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.width -= 1;
212*b7893ccfSSadaf Ebrahimi
213*b7893ccfSSadaf Ebrahimi // Mismatched height
214*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.height += 1;
215*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
216*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
217*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
218*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03212", "VUID-VkRenderPassBeginInfo-framebuffer-03212");
219*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
220*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.height -= 1;
221*b7893ccfSSadaf Ebrahimi
222*b7893ccfSSadaf Ebrahimi // Mismatched layer count
223*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.layerCount += 1;
224*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
225*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
226*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
227*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03213", "VUID-VkRenderPassBeginInfo-framebuffer-03213");
228*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
229*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.layerCount -= 1;
230*b7893ccfSSadaf Ebrahimi
231*b7893ccfSSadaf Ebrahimi // Mismatched view format count
232*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.viewFormatCount = 3;
233*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
234*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
235*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
236*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03214", "VUID-VkRenderPassBeginInfo-framebuffer-03214");
237*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
238*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.viewFormatCount = 2;
239*b7893ccfSSadaf Ebrahimi
240*b7893ccfSSadaf Ebrahimi // Mismatched format lists
241*b7893ccfSSadaf Ebrahimi framebufferAttachmentFormats[1] = VK_FORMAT_B8G8R8A8_SRGB;
242*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
243*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
244*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
245*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03215", "VUID-VkRenderPassBeginInfo-framebuffer-03215");
246*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
247*b7893ccfSSadaf Ebrahimi framebufferAttachmentFormats[1] = VK_FORMAT_B8G8R8A8_UNORM;
248*b7893ccfSSadaf Ebrahimi
249*b7893ccfSSadaf Ebrahimi // Mismatched formats
250*b7893ccfSSadaf Ebrahimi VkImageView imageView2;
251*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.format = attachmentFormats[1];
252*b7893ccfSSadaf Ebrahimi vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2);
253*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView2;
254*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
255*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
256*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
257*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03216", "VUID-VkRenderPassBeginInfo-framebuffer-03216");
258*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
259*b7893ccfSSadaf Ebrahimi vkDestroyImageView(m_device->device(), imageView2, nullptr);
260*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView;
261*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.format = attachmentFormats[0];
262*b7893ccfSSadaf Ebrahimi
263*b7893ccfSSadaf Ebrahimi // Mismatched sample counts
264*b7893ccfSSadaf Ebrahimi imageCreateInfo.samples = VK_SAMPLE_COUNT_4_BIT;
265*b7893ccfSSadaf Ebrahimi imageCreateInfo.mipLevels = 1;
266*b7893ccfSSadaf Ebrahimi VkImageObj imageObject2(m_device);
267*b7893ccfSSadaf Ebrahimi imageObject2.init(&imageCreateInfo);
268*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.image = imageObject2.image();
269*b7893ccfSSadaf Ebrahimi vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2);
270*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView2;
271*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
272*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
273*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
274*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassBeginInfo-framebuffer-03217", "VUID-VkRenderPassBeginInfo-framebuffer-03217");
275*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
276*b7893ccfSSadaf Ebrahimi vkDestroyImageView(m_device->device(), imageView2, nullptr);
277*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView;
278*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.image = imageObject.image();
279*b7893ccfSSadaf Ebrahimi imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
280*b7893ccfSSadaf Ebrahimi imageCreateInfo.mipLevels = 10;
281*b7893ccfSSadaf Ebrahimi
282*b7893ccfSSadaf Ebrahimi // Mismatched level counts
283*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.subresourceRange.levelCount = 2;
284*b7893ccfSSadaf Ebrahimi vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2);
285*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView2;
286*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
287*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
288*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
289*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03218",
290*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03218");
291*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
292*b7893ccfSSadaf Ebrahimi vkDestroyImageView(m_device->device(), imageView2, nullptr);
293*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView;
294*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.subresourceRange.levelCount = 1;
295*b7893ccfSSadaf Ebrahimi
296*b7893ccfSSadaf Ebrahimi // Non-identity component swizzle
297*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_A;
298*b7893ccfSSadaf Ebrahimi vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2);
299*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView2;
300*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
301*b7893ccfSSadaf Ebrahimi renderPassBeginInfo.framebuffer = framebuffer;
302*b7893ccfSSadaf Ebrahimi TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported,
303*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03219",
304*b7893ccfSSadaf Ebrahimi "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03219");
305*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
306*b7893ccfSSadaf Ebrahimi vkDestroyImageView(m_device->device(), imageView2, nullptr);
307*b7893ccfSSadaf Ebrahimi renderPassAttachmentBeginInfo.pAttachments = &imageView;
308*b7893ccfSSadaf Ebrahimi imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
309*b7893ccfSSadaf Ebrahimi
310*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
311*b7893ccfSSadaf Ebrahimi // vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
312*b7893ccfSSadaf Ebrahimi vkDestroyImageView(m_device->device(), imageView, nullptr);
313*b7893ccfSSadaf Ebrahimi }
314*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferFeatureEnableTest)315*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferFeatureEnableTest) {
316*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION("Use imageless framebuffer functionality without enabling the feature");
317*b7893ccfSSadaf Ebrahimi
318*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
319*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
320*b7893ccfSSadaf Ebrahimi } else {
321*b7893ccfSSadaf Ebrahimi printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
322*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
323*b7893ccfSSadaf Ebrahimi return;
324*b7893ccfSSadaf Ebrahimi }
325*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
326*b7893ccfSSadaf Ebrahimi
327*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
328*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
329*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
330*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
331*b7893ccfSSadaf Ebrahimi } else {
332*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
333*b7893ccfSSadaf Ebrahimi VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
334*b7893ccfSSadaf Ebrahimi return;
335*b7893ccfSSadaf Ebrahimi }
336*b7893ccfSSadaf Ebrahimi
337*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
338*b7893ccfSSadaf Ebrahimi
339*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
340*b7893ccfSSadaf Ebrahimi
341*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
342*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
343*b7893ccfSSadaf Ebrahimi VkFormat attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
344*b7893ccfSSadaf Ebrahimi
345*b7893ccfSSadaf Ebrahimi // Create a renderPass with a single attachment
346*b7893ccfSSadaf Ebrahimi VkAttachmentDescription attachmentDescription = {};
347*b7893ccfSSadaf Ebrahimi attachmentDescription.format = attachmentFormat;
348*b7893ccfSSadaf Ebrahimi attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
349*b7893ccfSSadaf Ebrahimi attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
350*b7893ccfSSadaf Ebrahimi VkAttachmentReference attachmentReference = {};
351*b7893ccfSSadaf Ebrahimi attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
352*b7893ccfSSadaf Ebrahimi VkSubpassDescription subpassDescription = {};
353*b7893ccfSSadaf Ebrahimi subpassDescription.colorAttachmentCount = 1;
354*b7893ccfSSadaf Ebrahimi subpassDescription.pColorAttachments = &attachmentReference;
355*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPassCreateInfo = {};
356*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
357*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
358*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 1;
359*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = &attachmentDescription;
360*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
361*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
362*b7893ccfSSadaf Ebrahimi vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass);
363*b7893ccfSSadaf Ebrahimi
364*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {};
365*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
366*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
367*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.width = attachmentWidth;
368*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.height = attachmentHeight;
369*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.layerCount = 1;
370*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.viewFormatCount = 1;
371*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.pViewFormats = &attachmentFormat;
372*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
373*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
374*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1;
375*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo;
376*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
377*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
378*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
379*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
380*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
381*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
382*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
383*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
384*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 1;
385*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer = VK_NULL_HANDLE;
386*b7893ccfSSadaf Ebrahimi
387*b7893ccfSSadaf Ebrahimi // Imageless framebuffer creation bit not present
388*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03189");
389*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
390*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
391*b7893ccfSSadaf Ebrahimi
392*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
393*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
394*b7893ccfSSadaf Ebrahimi }
395*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
396*b7893ccfSSadaf Ebrahimi }
397*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferCreationTests)398*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferCreationTests) {
399*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION("Create an imageless framebuffer in various invalid ways");
400*b7893ccfSSadaf Ebrahimi
401*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
402*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
403*b7893ccfSSadaf Ebrahimi } else {
404*b7893ccfSSadaf Ebrahimi printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
405*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
406*b7893ccfSSadaf Ebrahimi return;
407*b7893ccfSSadaf Ebrahimi }
408*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
409*b7893ccfSSadaf Ebrahimi bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
410*b7893ccfSSadaf Ebrahimi
411*b7893ccfSSadaf Ebrahimi bool multiviewSupported = rp2Supported;
412*b7893ccfSSadaf Ebrahimi if (!rp2Supported) {
413*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
414*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
415*b7893ccfSSadaf Ebrahimi multiviewSupported = true;
416*b7893ccfSSadaf Ebrahimi }
417*b7893ccfSSadaf Ebrahimi }
418*b7893ccfSSadaf Ebrahimi
419*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
420*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
421*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
422*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
423*b7893ccfSSadaf Ebrahimi } else {
424*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
425*b7893ccfSSadaf Ebrahimi VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
426*b7893ccfSSadaf Ebrahimi return;
427*b7893ccfSSadaf Ebrahimi }
428*b7893ccfSSadaf Ebrahimi
429*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {};
430*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
431*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE;
432*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {};
433*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
434*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures;
435*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
436*b7893ccfSSadaf Ebrahimi
437*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
438*b7893ccfSSadaf Ebrahimi
439*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
440*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
441*b7893ccfSSadaf Ebrahimi VkFormat attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
442*b7893ccfSSadaf Ebrahimi
443*b7893ccfSSadaf Ebrahimi // Create a renderPass with a single attachment
444*b7893ccfSSadaf Ebrahimi VkAttachmentDescription attachmentDescription = {};
445*b7893ccfSSadaf Ebrahimi attachmentDescription.format = attachmentFormat;
446*b7893ccfSSadaf Ebrahimi attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
447*b7893ccfSSadaf Ebrahimi attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
448*b7893ccfSSadaf Ebrahimi VkAttachmentReference attachmentReference = {};
449*b7893ccfSSadaf Ebrahimi attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
450*b7893ccfSSadaf Ebrahimi VkSubpassDescription subpassDescription = {};
451*b7893ccfSSadaf Ebrahimi subpassDescription.colorAttachmentCount = 1;
452*b7893ccfSSadaf Ebrahimi subpassDescription.pColorAttachments = &attachmentReference;
453*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPassCreateInfo = {};
454*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
455*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
456*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 1;
457*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = &attachmentDescription;
458*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
459*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
460*b7893ccfSSadaf Ebrahimi vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass);
461*b7893ccfSSadaf Ebrahimi
462*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {};
463*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
464*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
465*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.width = attachmentWidth;
466*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.height = attachmentHeight;
467*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.layerCount = 1;
468*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.viewFormatCount = 1;
469*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo.pViewFormats = &attachmentFormat;
470*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
471*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
472*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1;
473*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo;
474*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
475*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
476*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
477*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
478*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
479*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
480*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
481*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
482*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 1;
483*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer = VK_NULL_HANDLE;
484*b7893ccfSSadaf Ebrahimi
485*b7893ccfSSadaf Ebrahimi // Attachments info not present
486*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = nullptr;
487*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03190");
488*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
489*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
490*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
491*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
492*b7893ccfSSadaf Ebrahimi }
493*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
494*b7893ccfSSadaf Ebrahimi
495*b7893ccfSSadaf Ebrahimi // Mismatched attachment counts
496*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 2;
497*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[2] = {framebufferAttachmentImageInfo,
498*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfo};
499*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos;
500*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03191");
501*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
502*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
503*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
504*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
505*b7893ccfSSadaf Ebrahimi }
506*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo;
507*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1;
508*b7893ccfSSadaf Ebrahimi
509*b7893ccfSSadaf Ebrahimi // Mismatched format list
510*b7893ccfSSadaf Ebrahimi attachmentFormat = VK_FORMAT_B8G8R8A8_UNORM;
511*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03205");
512*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
513*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
514*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
515*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
516*b7893ccfSSadaf Ebrahimi }
517*b7893ccfSSadaf Ebrahimi attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
518*b7893ccfSSadaf Ebrahimi
519*b7893ccfSSadaf Ebrahimi // Mismatched format list
520*b7893ccfSSadaf Ebrahimi attachmentFormat = VK_FORMAT_B8G8R8A8_UNORM;
521*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03205");
522*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
523*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
524*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
525*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
526*b7893ccfSSadaf Ebrahimi }
527*b7893ccfSSadaf Ebrahimi attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
528*b7893ccfSSadaf Ebrahimi
529*b7893ccfSSadaf Ebrahimi // Mismatched layer count, multiview disabled
530*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 2;
531*b7893ccfSSadaf Ebrahimi const char* mismatchedLayersNoMultiviewVuid =
532*b7893ccfSSadaf Ebrahimi multiviewSupported ? "VUID-VkFramebufferCreateInfo-renderPass-03199" : "VUID-VkFramebufferCreateInfo-flags-03200";
533*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, mismatchedLayersNoMultiviewVuid);
534*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
535*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
536*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
537*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
538*b7893ccfSSadaf Ebrahimi }
539*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
540*b7893ccfSSadaf Ebrahimi
541*b7893ccfSSadaf Ebrahimi // Mismatched width
542*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width += 1;
543*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03192");
544*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
545*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
546*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
547*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
548*b7893ccfSSadaf Ebrahimi }
549*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width -= 1;
550*b7893ccfSSadaf Ebrahimi
551*b7893ccfSSadaf Ebrahimi // Mismatched height
552*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height += 1;
553*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03193");
554*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
555*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
556*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
557*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
558*b7893ccfSSadaf Ebrahimi }
559*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height -= 1;
560*b7893ccfSSadaf Ebrahimi
561*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
562*b7893ccfSSadaf Ebrahimi }
563*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferAttachmentImageUsageMismatchTests)564*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferAttachmentImageUsageMismatchTests) {
565*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION("Create an imageless framebuffer with mismatched attachment image usage");
566*b7893ccfSSadaf Ebrahimi
567*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
568*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
569*b7893ccfSSadaf Ebrahimi } else {
570*b7893ccfSSadaf Ebrahimi printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
571*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
572*b7893ccfSSadaf Ebrahimi return;
573*b7893ccfSSadaf Ebrahimi }
574*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
575*b7893ccfSSadaf Ebrahimi
576*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
577*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
578*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
579*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
580*b7893ccfSSadaf Ebrahimi } else {
581*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
582*b7893ccfSSadaf Ebrahimi VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
583*b7893ccfSSadaf Ebrahimi return;
584*b7893ccfSSadaf Ebrahimi }
585*b7893ccfSSadaf Ebrahimi
586*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {};
587*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
588*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE;
589*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {};
590*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
591*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures;
592*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
593*b7893ccfSSadaf Ebrahimi
594*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
595*b7893ccfSSadaf Ebrahimi
596*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
597*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
598*b7893ccfSSadaf Ebrahimi VkFormat colorAndInputAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
599*b7893ccfSSadaf Ebrahimi VkFormat depthStencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
600*b7893ccfSSadaf Ebrahimi
601*b7893ccfSSadaf Ebrahimi VkAttachmentDescription attachmentDescriptions[4] = {};
602*b7893ccfSSadaf Ebrahimi // Color attachment
603*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].format = colorAndInputAttachmentFormat;
604*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT;
605*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
606*b7893ccfSSadaf Ebrahimi // Color resolve attachment
607*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].format = colorAndInputAttachmentFormat;
608*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT;
609*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
610*b7893ccfSSadaf Ebrahimi // Depth stencil attachment
611*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].format = depthStencilAttachmentFormat;
612*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].samples = VK_SAMPLE_COUNT_4_BIT;
613*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
614*b7893ccfSSadaf Ebrahimi // Input attachment
615*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].format = colorAndInputAttachmentFormat;
616*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].samples = VK_SAMPLE_COUNT_1_BIT;
617*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
618*b7893ccfSSadaf Ebrahimi
619*b7893ccfSSadaf Ebrahimi VkAttachmentReference colorAttachmentReference = {};
620*b7893ccfSSadaf Ebrahimi colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
621*b7893ccfSSadaf Ebrahimi colorAttachmentReference.attachment = 0;
622*b7893ccfSSadaf Ebrahimi VkAttachmentReference colorResolveAttachmentReference = {};
623*b7893ccfSSadaf Ebrahimi colorResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
624*b7893ccfSSadaf Ebrahimi colorResolveAttachmentReference.attachment = 1;
625*b7893ccfSSadaf Ebrahimi VkAttachmentReference depthStencilAttachmentReference = {};
626*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
627*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.attachment = 2;
628*b7893ccfSSadaf Ebrahimi VkAttachmentReference inputAttachmentReference = {};
629*b7893ccfSSadaf Ebrahimi inputAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
630*b7893ccfSSadaf Ebrahimi inputAttachmentReference.attachment = 3;
631*b7893ccfSSadaf Ebrahimi VkSubpassDescription subpassDescription = {};
632*b7893ccfSSadaf Ebrahimi subpassDescription.colorAttachmentCount = 1;
633*b7893ccfSSadaf Ebrahimi subpassDescription.pColorAttachments = &colorAttachmentReference;
634*b7893ccfSSadaf Ebrahimi subpassDescription.pResolveAttachments = &colorResolveAttachmentReference;
635*b7893ccfSSadaf Ebrahimi subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference;
636*b7893ccfSSadaf Ebrahimi subpassDescription.inputAttachmentCount = 1;
637*b7893ccfSSadaf Ebrahimi subpassDescription.pInputAttachments = &inputAttachmentReference;
638*b7893ccfSSadaf Ebrahimi
639*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPassCreateInfo = {};
640*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 4;
641*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
642*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
643*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = attachmentDescriptions;
644*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
645*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
646*b7893ccfSSadaf Ebrahimi vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
647*b7893ccfSSadaf Ebrahimi
648*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[4] = {};
649*b7893ccfSSadaf Ebrahimi // Color attachment
650*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
651*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].width = attachmentWidth;
652*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].height = attachmentHeight;
653*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
654*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 1;
655*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].viewFormatCount = 1;
656*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].pViewFormats = &colorAndInputAttachmentFormat;
657*b7893ccfSSadaf Ebrahimi // Color resolve attachment
658*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
659*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].width = attachmentWidth;
660*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].height = attachmentHeight;
661*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
662*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 1;
663*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].viewFormatCount = 1;
664*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].pViewFormats = &colorAndInputAttachmentFormat;
665*b7893ccfSSadaf Ebrahimi // Depth stencil attachment
666*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
667*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].width = attachmentWidth;
668*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].height = attachmentHeight;
669*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
670*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].layerCount = 1;
671*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].viewFormatCount = 1;
672*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].pViewFormats = &depthStencilAttachmentFormat;
673*b7893ccfSSadaf Ebrahimi // Input attachment
674*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
675*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].width = attachmentWidth;
676*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].height = attachmentHeight;
677*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
678*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].layerCount = 1;
679*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].viewFormatCount = 1;
680*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].pViewFormats = &colorAndInputAttachmentFormat;
681*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
682*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
683*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 4;
684*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos;
685*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
686*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
687*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
688*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
689*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
690*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
691*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
692*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
693*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 4;
694*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer = VK_NULL_HANDLE;
695*b7893ccfSSadaf Ebrahimi
696*b7893ccfSSadaf Ebrahimi // Color attachment, mismatched usage
697*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_SAMPLED_BIT;
698*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03201");
699*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
700*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
701*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
702*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
703*b7893ccfSSadaf Ebrahimi }
704*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
705*b7893ccfSSadaf Ebrahimi
706*b7893ccfSSadaf Ebrahimi // Color resolve attachment, mismatched usage
707*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_SAMPLED_BIT;
708*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03201");
709*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
710*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
711*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
712*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
713*b7893ccfSSadaf Ebrahimi }
714*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
715*b7893ccfSSadaf Ebrahimi
716*b7893ccfSSadaf Ebrahimi // Depth stencil attachment, mismatched usage
717*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_SAMPLED_BIT;
718*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03202");
719*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
720*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
721*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
722*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
723*b7893ccfSSadaf Ebrahimi }
724*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
725*b7893ccfSSadaf Ebrahimi
726*b7893ccfSSadaf Ebrahimi // Color attachment, mismatched usage
727*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_SAMPLED_BIT;
728*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03204");
729*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
730*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
731*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
732*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
733*b7893ccfSSadaf Ebrahimi }
734*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
735*b7893ccfSSadaf Ebrahimi
736*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
737*b7893ccfSSadaf Ebrahimi }
738*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferAttachmentMultiviewImageLayerCountMismatchTests)739*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferAttachmentMultiviewImageLayerCountMismatchTests) {
740*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION("Create an imageless framebuffer against a multiview-enabled render pass with mismatched layer counts");
741*b7893ccfSSadaf Ebrahimi
742*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
743*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
744*b7893ccfSSadaf Ebrahimi } else {
745*b7893ccfSSadaf Ebrahimi printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
746*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
747*b7893ccfSSadaf Ebrahimi return;
748*b7893ccfSSadaf Ebrahimi }
749*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
750*b7893ccfSSadaf Ebrahimi
751*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
752*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
753*b7893ccfSSadaf Ebrahimi } else {
754*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
755*b7893ccfSSadaf Ebrahimi return;
756*b7893ccfSSadaf Ebrahimi }
757*b7893ccfSSadaf Ebrahimi
758*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
759*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
760*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
761*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
762*b7893ccfSSadaf Ebrahimi } else {
763*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
764*b7893ccfSSadaf Ebrahimi VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
765*b7893ccfSSadaf Ebrahimi return;
766*b7893ccfSSadaf Ebrahimi }
767*b7893ccfSSadaf Ebrahimi
768*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {};
769*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
770*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE;
771*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {};
772*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
773*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures;
774*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
775*b7893ccfSSadaf Ebrahimi
776*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
777*b7893ccfSSadaf Ebrahimi
778*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
779*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
780*b7893ccfSSadaf Ebrahimi VkFormat colorAndInputAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
781*b7893ccfSSadaf Ebrahimi VkFormat depthStencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
782*b7893ccfSSadaf Ebrahimi
783*b7893ccfSSadaf Ebrahimi VkAttachmentDescription attachmentDescriptions[4] = {};
784*b7893ccfSSadaf Ebrahimi // Color attachment
785*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].format = colorAndInputAttachmentFormat;
786*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT;
787*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
788*b7893ccfSSadaf Ebrahimi // Color resolve attachment
789*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].format = colorAndInputAttachmentFormat;
790*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT;
791*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
792*b7893ccfSSadaf Ebrahimi // Depth stencil attachment
793*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].format = depthStencilAttachmentFormat;
794*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].samples = VK_SAMPLE_COUNT_4_BIT;
795*b7893ccfSSadaf Ebrahimi attachmentDescriptions[2].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
796*b7893ccfSSadaf Ebrahimi // Input attachment
797*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].format = colorAndInputAttachmentFormat;
798*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].samples = VK_SAMPLE_COUNT_1_BIT;
799*b7893ccfSSadaf Ebrahimi attachmentDescriptions[3].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
800*b7893ccfSSadaf Ebrahimi
801*b7893ccfSSadaf Ebrahimi VkAttachmentReference colorAttachmentReference = {};
802*b7893ccfSSadaf Ebrahimi colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
803*b7893ccfSSadaf Ebrahimi colorAttachmentReference.attachment = 0;
804*b7893ccfSSadaf Ebrahimi VkAttachmentReference colorResolveAttachmentReference = {};
805*b7893ccfSSadaf Ebrahimi colorResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
806*b7893ccfSSadaf Ebrahimi colorResolveAttachmentReference.attachment = 1;
807*b7893ccfSSadaf Ebrahimi VkAttachmentReference depthStencilAttachmentReference = {};
808*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
809*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.attachment = 2;
810*b7893ccfSSadaf Ebrahimi VkAttachmentReference inputAttachmentReference = {};
811*b7893ccfSSadaf Ebrahimi inputAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
812*b7893ccfSSadaf Ebrahimi inputAttachmentReference.attachment = 3;
813*b7893ccfSSadaf Ebrahimi VkSubpassDescription subpassDescription = {};
814*b7893ccfSSadaf Ebrahimi subpassDescription.colorAttachmentCount = 1;
815*b7893ccfSSadaf Ebrahimi subpassDescription.pColorAttachments = &colorAttachmentReference;
816*b7893ccfSSadaf Ebrahimi subpassDescription.pResolveAttachments = &colorResolveAttachmentReference;
817*b7893ccfSSadaf Ebrahimi subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference;
818*b7893ccfSSadaf Ebrahimi subpassDescription.inputAttachmentCount = 1;
819*b7893ccfSSadaf Ebrahimi subpassDescription.pInputAttachments = &inputAttachmentReference;
820*b7893ccfSSadaf Ebrahimi
821*b7893ccfSSadaf Ebrahimi uint32_t viewMask = 0x3u;
822*b7893ccfSSadaf Ebrahimi VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = {};
823*b7893ccfSSadaf Ebrahimi renderPassMultiviewCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO;
824*b7893ccfSSadaf Ebrahimi renderPassMultiviewCreateInfo.subpassCount = 1;
825*b7893ccfSSadaf Ebrahimi renderPassMultiviewCreateInfo.pViewMasks = &viewMask;
826*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPassCreateInfo = {};
827*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pNext = &renderPassMultiviewCreateInfo;
828*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 4;
829*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
830*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
831*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = attachmentDescriptions;
832*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
833*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
834*b7893ccfSSadaf Ebrahimi vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
835*b7893ccfSSadaf Ebrahimi
836*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[4] = {};
837*b7893ccfSSadaf Ebrahimi // Color attachment
838*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
839*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].width = attachmentWidth;
840*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].height = attachmentHeight;
841*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
842*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 2;
843*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].viewFormatCount = 1;
844*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].pViewFormats = &colorAndInputAttachmentFormat;
845*b7893ccfSSadaf Ebrahimi // Color resolve attachment
846*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
847*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].width = attachmentWidth;
848*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].height = attachmentHeight;
849*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
850*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 2;
851*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].viewFormatCount = 1;
852*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].pViewFormats = &colorAndInputAttachmentFormat;
853*b7893ccfSSadaf Ebrahimi // Depth stencil attachment
854*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
855*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].width = attachmentWidth;
856*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].height = attachmentHeight;
857*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
858*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].layerCount = 2;
859*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].viewFormatCount = 1;
860*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].pViewFormats = &depthStencilAttachmentFormat;
861*b7893ccfSSadaf Ebrahimi // Input attachment
862*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
863*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].width = attachmentWidth;
864*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].height = attachmentHeight;
865*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
866*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].layerCount = 2;
867*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].viewFormatCount = 1;
868*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].pViewFormats = &colorAndInputAttachmentFormat;
869*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
870*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
871*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 4;
872*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos;
873*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
874*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
875*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
876*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
877*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
878*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
879*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
880*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
881*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 4;
882*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer = VK_NULL_HANDLE;
883*b7893ccfSSadaf Ebrahimi
884*b7893ccfSSadaf Ebrahimi // Color attachment, mismatched layer count
885*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 1;
886*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
887*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
888*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
889*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
890*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
891*b7893ccfSSadaf Ebrahimi }
892*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 2;
893*b7893ccfSSadaf Ebrahimi
894*b7893ccfSSadaf Ebrahimi // Color resolve attachment, mismatched layer count
895*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 1;
896*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
897*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
898*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
899*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
900*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
901*b7893ccfSSadaf Ebrahimi }
902*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 2;
903*b7893ccfSSadaf Ebrahimi
904*b7893ccfSSadaf Ebrahimi // Depth stencil attachment, mismatched layer count
905*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].layerCount = 1;
906*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
907*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
908*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
909*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
910*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
911*b7893ccfSSadaf Ebrahimi }
912*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[2].layerCount = 2;
913*b7893ccfSSadaf Ebrahimi
914*b7893ccfSSadaf Ebrahimi // Input attachment, mismatched layer count
915*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].layerCount = 1;
916*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
917*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
918*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
919*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
920*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
921*b7893ccfSSadaf Ebrahimi }
922*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[3].layerCount = 2;
923*b7893ccfSSadaf Ebrahimi
924*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
925*b7893ccfSSadaf Ebrahimi }
926*b7893ccfSSadaf Ebrahimi
TEST_F(VkLayerTest,ImagelessFramebufferDepthStencilResolveAttachmentTests)927*b7893ccfSSadaf Ebrahimi TEST_F(VkLayerTest, ImagelessFramebufferDepthStencilResolveAttachmentTests) {
928*b7893ccfSSadaf Ebrahimi TEST_DESCRIPTION(
929*b7893ccfSSadaf Ebrahimi "Create an imageless framebuffer against a render pass using depth stencil resolve, with mismatched information");
930*b7893ccfSSadaf Ebrahimi
931*b7893ccfSSadaf Ebrahimi if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
932*b7893ccfSSadaf Ebrahimi m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
933*b7893ccfSSadaf Ebrahimi } else {
934*b7893ccfSSadaf Ebrahimi printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
935*b7893ccfSSadaf Ebrahimi VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
936*b7893ccfSSadaf Ebrahimi return;
937*b7893ccfSSadaf Ebrahimi }
938*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
939*b7893ccfSSadaf Ebrahimi
940*b7893ccfSSadaf Ebrahimi bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
941*b7893ccfSSadaf Ebrahimi if (!rp2Supported) {
942*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
943*b7893ccfSSadaf Ebrahimi return;
944*b7893ccfSSadaf Ebrahimi }
945*b7893ccfSSadaf Ebrahimi
946*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)) {
947*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME);
948*b7893ccfSSadaf Ebrahimi } else {
949*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
950*b7893ccfSSadaf Ebrahimi VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME);
951*b7893ccfSSadaf Ebrahimi return;
952*b7893ccfSSadaf Ebrahimi }
953*b7893ccfSSadaf Ebrahimi
954*b7893ccfSSadaf Ebrahimi if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) {
955*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
956*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME);
957*b7893ccfSSadaf Ebrahimi m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
958*b7893ccfSSadaf Ebrahimi } else {
959*b7893ccfSSadaf Ebrahimi printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
960*b7893ccfSSadaf Ebrahimi VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME);
961*b7893ccfSSadaf Ebrahimi return;
962*b7893ccfSSadaf Ebrahimi }
963*b7893ccfSSadaf Ebrahimi
964*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {};
965*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR;
966*b7893ccfSSadaf Ebrahimi physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE;
967*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {};
968*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
969*b7893ccfSSadaf Ebrahimi physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures;
970*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
971*b7893ccfSSadaf Ebrahimi
972*b7893ccfSSadaf Ebrahimi ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
973*b7893ccfSSadaf Ebrahimi
974*b7893ccfSSadaf Ebrahimi uint32_t attachmentWidth = 512;
975*b7893ccfSSadaf Ebrahimi uint32_t attachmentHeight = 512;
976*b7893ccfSSadaf Ebrahimi VkFormat attachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
977*b7893ccfSSadaf Ebrahimi
978*b7893ccfSSadaf Ebrahimi VkAttachmentDescription2KHR attachmentDescriptions[2] = {};
979*b7893ccfSSadaf Ebrahimi // Depth/stencil attachment
980*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
981*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].format = attachmentFormat;
982*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT;
983*b7893ccfSSadaf Ebrahimi attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
984*b7893ccfSSadaf Ebrahimi // Depth/stencil resolve attachment
985*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
986*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].format = attachmentFormat;
987*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT;
988*b7893ccfSSadaf Ebrahimi attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
989*b7893ccfSSadaf Ebrahimi
990*b7893ccfSSadaf Ebrahimi VkAttachmentReference2KHR depthStencilAttachmentReference = {};
991*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
992*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
993*b7893ccfSSadaf Ebrahimi depthStencilAttachmentReference.attachment = 0;
994*b7893ccfSSadaf Ebrahimi VkAttachmentReference2KHR depthStencilResolveAttachmentReference = {};
995*b7893ccfSSadaf Ebrahimi depthStencilResolveAttachmentReference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
996*b7893ccfSSadaf Ebrahimi depthStencilResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL;
997*b7893ccfSSadaf Ebrahimi depthStencilResolveAttachmentReference.attachment = 1;
998*b7893ccfSSadaf Ebrahimi VkSubpassDescriptionDepthStencilResolveKHR subpassDescriptionDepthStencilResolve = {};
999*b7893ccfSSadaf Ebrahimi subpassDescriptionDepthStencilResolve.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR;
1000*b7893ccfSSadaf Ebrahimi subpassDescriptionDepthStencilResolve.pDepthStencilResolveAttachment = &depthStencilResolveAttachmentReference;
1001*b7893ccfSSadaf Ebrahimi subpassDescriptionDepthStencilResolve.depthResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
1002*b7893ccfSSadaf Ebrahimi subpassDescriptionDepthStencilResolve.stencilResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
1003*b7893ccfSSadaf Ebrahimi VkSubpassDescription2KHR subpassDescription = {};
1004*b7893ccfSSadaf Ebrahimi subpassDescription.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
1005*b7893ccfSSadaf Ebrahimi subpassDescription.pNext = &subpassDescriptionDepthStencilResolve;
1006*b7893ccfSSadaf Ebrahimi subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference;
1007*b7893ccfSSadaf Ebrahimi subpassDescription.viewMask = 0x3u;
1008*b7893ccfSSadaf Ebrahimi
1009*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo2KHR renderPassCreateInfo = {};
1010*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
1011*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pNext = nullptr;
1012*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.attachmentCount = 2;
1013*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.subpassCount = 1;
1014*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pSubpasses = &subpassDescription;
1015*b7893ccfSSadaf Ebrahimi renderPassCreateInfo.pAttachments = attachmentDescriptions;
1016*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass;
1017*b7893ccfSSadaf Ebrahimi PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR =
1018*b7893ccfSSadaf Ebrahimi (PFN_vkCreateRenderPass2KHR)vkGetDeviceProcAddr(m_device->device(), "vkCreateRenderPass2KHR");
1019*b7893ccfSSadaf Ebrahimi vkCreateRenderPass2KHR(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass);
1020*b7893ccfSSadaf Ebrahimi
1021*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[2] = {};
1022*b7893ccfSSadaf Ebrahimi // Depth/stencil attachment
1023*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
1024*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].width = attachmentWidth;
1025*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].height = attachmentHeight;
1026*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1027*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 2;
1028*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].viewFormatCount = 1;
1029*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].pViewFormats = &attachmentFormat;
1030*b7893ccfSSadaf Ebrahimi // Depth/stencil resolve attachment
1031*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR;
1032*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].width = attachmentWidth;
1033*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].height = attachmentHeight;
1034*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1035*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 2;
1036*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].viewFormatCount = 1;
1037*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].pViewFormats = &attachmentFormat;
1038*b7893ccfSSadaf Ebrahimi VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {};
1039*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR;
1040*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 2;
1041*b7893ccfSSadaf Ebrahimi framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos;
1042*b7893ccfSSadaf Ebrahimi VkFramebufferCreateInfo framebufferCreateInfo = {};
1043*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
1044*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
1045*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
1046*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.width = attachmentWidth;
1047*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.height = attachmentHeight;
1048*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.layers = 1;
1049*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.renderPass = renderPass;
1050*b7893ccfSSadaf Ebrahimi framebufferCreateInfo.attachmentCount = 2;
1051*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer = VK_NULL_HANDLE;
1052*b7893ccfSSadaf Ebrahimi
1053*b7893ccfSSadaf Ebrahimi // Color attachment, mismatched layer count
1054*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 1;
1055*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
1056*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
1057*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
1058*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
1059*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
1060*b7893ccfSSadaf Ebrahimi }
1061*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[0].layerCount = 2;
1062*b7893ccfSSadaf Ebrahimi
1063*b7893ccfSSadaf Ebrahimi // Depth resolve attachment, mismatched image usage
1064*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1065*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03203");
1066*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
1067*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
1068*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
1069*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
1070*b7893ccfSSadaf Ebrahimi }
1071*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1072*b7893ccfSSadaf Ebrahimi
1073*b7893ccfSSadaf Ebrahimi // Depth resolve attachment, mismatched layer count
1074*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 1;
1075*b7893ccfSSadaf Ebrahimi m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198");
1076*b7893ccfSSadaf Ebrahimi vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
1077*b7893ccfSSadaf Ebrahimi m_errorMonitor->VerifyFound();
1078*b7893ccfSSadaf Ebrahimi if (framebuffer != VK_NULL_HANDLE) {
1079*b7893ccfSSadaf Ebrahimi vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr);
1080*b7893ccfSSadaf Ebrahimi }
1081*b7893ccfSSadaf Ebrahimi framebufferAttachmentImageInfos[1].layerCount = 2;
1082*b7893ccfSSadaf Ebrahimi
1083*b7893ccfSSadaf Ebrahimi vkDestroyRenderPass(m_device->device(), renderPass, nullptr);
1084*b7893ccfSSadaf Ebrahimi }
1085