/* * Copyright (c) 2015-2019 The Khronos Group Inc. * Copyright (c) 2015-2019 Valve Corporation * Copyright (c) 2015-2019 LunarG, Inc. * Copyright (c) 2015-2019 Google, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Author: Chia-I Wu * Author: Chris Forbes * Author: Courtney Goeltzenleuchter * Author: Mark Lobodzinski * Author: Mike Stroyan * Author: Tobin Ehlis * Author: Tony Barbour * Author: Cody Northrop * Author: Dave Houlton * Author: Jeremy Kniager * Author: Shannon McPherson * Author: John Zulauf * Author: Tobias Hector */ #include "cast_utils.h" #include "layer_validation_tests.h" TEST_F(VkLayerTest, ImagelessFramebufferRenderPassBeginImageViewMismatchTests) { TEST_DESCRIPTION( "Begin a renderPass where the image views specified do not match the parameters used to create the framebuffer and render " "pass."); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names); if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s test requires VK_KHR_imageless_framebuffer, not available. Skipping.\n", kSkipPrefix); return; } VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {}; physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR; physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE; VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {}; physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures; ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat attachmentFormats[2] = {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM}; VkFormat framebufferAttachmentFormats[3] = {VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM}; // Create a renderPass with a single attachment VkAttachmentDescription attachmentDescription = {}; attachmentDescription.format = attachmentFormats[0]; attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference attachmentReference = {}; attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; VkSubpassDescription subpassDescription = {}; subpassDescription.colorAttachmentCount = 1; subpassDescription.pColorAttachments = &attachmentReference; VkRenderPassCreateInfo renderPassCreateInfo = {}; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.attachmentCount = 1; renderPassCreateInfo.pAttachments = &attachmentDescription; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; VkRenderPass renderPass; vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {}; framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfo.width = attachmentWidth; framebufferAttachmentImageInfo.height = attachmentHeight; framebufferAttachmentImageInfo.layerCount = 1; framebufferAttachmentImageInfo.viewFormatCount = 2; framebufferAttachmentImageInfo.pViewFormats = framebufferAttachmentFormats; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.attachmentCount = 1; framebufferCreateInfo.pAttachments = nullptr; framebufferCreateInfo.renderPass = renderPass; VkFramebuffer framebuffer; VkImageFormatListCreateInfoKHR imageFormatListCreateInfo = {}; imageFormatListCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR; imageFormatListCreateInfo.viewFormatCount = 2; imageFormatListCreateInfo.pViewFormats = attachmentFormats; VkImageCreateInfo imageCreateInfo = {}; imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCreateInfo.pNext = &imageFormatListCreateInfo; imageCreateInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; imageCreateInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; imageCreateInfo.extent.width = attachmentWidth; imageCreateInfo.extent.height = attachmentHeight; imageCreateInfo.extent.depth = 1; imageCreateInfo.arrayLayers = 1; imageCreateInfo.mipLevels = 10; imageCreateInfo.imageType = VK_IMAGE_TYPE_2D; imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; imageCreateInfo.format = attachmentFormats[0]; VkImageObj imageObject(m_device); imageObject.init(&imageCreateInfo); VkImage image = imageObject.image(); VkImageViewCreateInfo imageViewCreateInfo = {}; imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; imageViewCreateInfo.image = image; imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; imageViewCreateInfo.format = attachmentFormats[0]; imageViewCreateInfo.subresourceRange.layerCount = 1; imageViewCreateInfo.subresourceRange.levelCount = 1; imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; VkImageView imageView; vkCreateImageView(m_device->device(), &imageViewCreateInfo, NULL, &imageView); VkRenderPassAttachmentBeginInfoKHR renderPassAttachmentBeginInfo = {}; renderPassAttachmentBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR; renderPassAttachmentBeginInfo.pNext = nullptr; renderPassAttachmentBeginInfo.attachmentCount = 1; renderPassAttachmentBeginInfo.pAttachments = &imageView; VkRenderPassBeginInfo renderPassBeginInfo = {}; renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassBeginInfo.pNext = &renderPassAttachmentBeginInfo; renderPassBeginInfo.renderPass = renderPass; renderPassBeginInfo.renderArea.extent.width = attachmentWidth; renderPassBeginInfo.renderArea.extent.height = attachmentHeight; // Imageless framebuffer creation bit not present framebufferCreateInfo.pAttachments = &imageView; framebufferCreateInfo.flags = 0; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03207", "VUID-VkRenderPassBeginInfo-framebuffer-03207"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferCreateInfo.pAttachments = nullptr; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassAttachmentBeginInfo.attachmentCount = 2; renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03208", "VUID-VkRenderPassBeginInfo-framebuffer-03208"); renderPassAttachmentBeginInfo.attachmentCount = 1; vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); // Mismatched number of attachments vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassAttachmentBeginInfo.attachmentCount = 2; renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03208", "VUID-VkRenderPassBeginInfo-framebuffer-03208"); renderPassAttachmentBeginInfo.attachmentCount = 1; vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); // Mismatched flags framebufferAttachmentImageInfo.flags = 0; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03209", "VUID-VkRenderPassBeginInfo-framebuffer-03209"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; // Mismatched usage framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03210", "VUID-VkRenderPassBeginInfo-framebuffer-03210"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; // Mismatched width framebufferAttachmentImageInfo.width += 1; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03211", "VUID-VkRenderPassBeginInfo-framebuffer-03211"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.width -= 1; // Mismatched height framebufferAttachmentImageInfo.height += 1; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03212", "VUID-VkRenderPassBeginInfo-framebuffer-03212"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.height -= 1; // Mismatched layer count framebufferAttachmentImageInfo.layerCount += 1; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03213", "VUID-VkRenderPassBeginInfo-framebuffer-03213"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.layerCount -= 1; // Mismatched view format count framebufferAttachmentImageInfo.viewFormatCount = 3; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03214", "VUID-VkRenderPassBeginInfo-framebuffer-03214"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentImageInfo.viewFormatCount = 2; // Mismatched format lists framebufferAttachmentFormats[1] = VK_FORMAT_B8G8R8A8_SRGB; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03215", "VUID-VkRenderPassBeginInfo-framebuffer-03215"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); framebufferAttachmentFormats[1] = VK_FORMAT_B8G8R8A8_UNORM; // Mismatched formats VkImageView imageView2; imageViewCreateInfo.format = attachmentFormats[1]; vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2); renderPassAttachmentBeginInfo.pAttachments = &imageView2; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03216", "VUID-VkRenderPassBeginInfo-framebuffer-03216"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); vkDestroyImageView(m_device->device(), imageView2, nullptr); renderPassAttachmentBeginInfo.pAttachments = &imageView; imageViewCreateInfo.format = attachmentFormats[0]; // Mismatched sample counts imageCreateInfo.samples = VK_SAMPLE_COUNT_4_BIT; imageCreateInfo.mipLevels = 1; VkImageObj imageObject2(m_device); imageObject2.init(&imageCreateInfo); imageViewCreateInfo.image = imageObject2.image(); vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2); renderPassAttachmentBeginInfo.pAttachments = &imageView2; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassBeginInfo-framebuffer-03217", "VUID-VkRenderPassBeginInfo-framebuffer-03217"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); vkDestroyImageView(m_device->device(), imageView2, nullptr); renderPassAttachmentBeginInfo.pAttachments = &imageView; imageViewCreateInfo.image = imageObject.image(); imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT; imageCreateInfo.mipLevels = 10; // Mismatched level counts imageViewCreateInfo.subresourceRange.levelCount = 2; vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2); renderPassAttachmentBeginInfo.pAttachments = &imageView2; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03218", "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03218"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); vkDestroyImageView(m_device->device(), imageView2, nullptr); renderPassAttachmentBeginInfo.pAttachments = &imageView; imageViewCreateInfo.subresourceRange.levelCount = 1; // Non-identity component swizzle imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_A; vkCreateImageView(m_device->device(), &imageViewCreateInfo, nullptr, &imageView2); renderPassAttachmentBeginInfo.pAttachments = &imageView2; vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); renderPassBeginInfo.framebuffer = framebuffer; TestRenderPassBegin(m_errorMonitor, m_device->device(), m_commandBuffer->handle(), &renderPassBeginInfo, rp2Supported, "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03219", "VUID-VkRenderPassAttachmentBeginInfoKHR-pAttachments-03219"); vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); vkDestroyImageView(m_device->device(), imageView2, nullptr); renderPassAttachmentBeginInfo.pAttachments = &imageView; imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; vkDestroyRenderPass(m_device->device(), renderPass, nullptr); // vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); vkDestroyImageView(m_device->device(), imageView, nullptr); } TEST_F(VkLayerTest, ImagelessFramebufferFeatureEnableTest) { TEST_DESCRIPTION("Use imageless framebuffer functionality without enabling the feature"); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; // Create a renderPass with a single attachment VkAttachmentDescription attachmentDescription = {}; attachmentDescription.format = attachmentFormat; attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference attachmentReference = {}; attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; VkSubpassDescription subpassDescription = {}; subpassDescription.colorAttachmentCount = 1; subpassDescription.pColorAttachments = &attachmentReference; VkRenderPassCreateInfo renderPassCreateInfo = {}; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.attachmentCount = 1; renderPassCreateInfo.pAttachments = &attachmentDescription; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; VkRenderPass renderPass; vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {}; framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfo.width = attachmentWidth; framebufferAttachmentImageInfo.height = attachmentHeight; framebufferAttachmentImageInfo.layerCount = 1; framebufferAttachmentImageInfo.viewFormatCount = 1; framebufferAttachmentImageInfo.pViewFormats = &attachmentFormat; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 1; VkFramebuffer framebuffer = VK_NULL_HANDLE; // Imageless framebuffer creation bit not present m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03189"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } vkDestroyRenderPass(m_device->device(), renderPass, nullptr); } TEST_F(VkLayerTest, ImagelessFramebufferCreationTests) { TEST_DESCRIPTION("Create an imageless framebuffer in various invalid ways"); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names); bool multiviewSupported = rp2Supported; if (!rp2Supported) { if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME); multiviewSupported = true; } } if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); return; } VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {}; physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR; physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE; VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {}; physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures; ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; // Create a renderPass with a single attachment VkAttachmentDescription attachmentDescription = {}; attachmentDescription.format = attachmentFormat; attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference attachmentReference = {}; attachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; VkSubpassDescription subpassDescription = {}; subpassDescription.colorAttachmentCount = 1; subpassDescription.pColorAttachments = &attachmentReference; VkRenderPassCreateInfo renderPassCreateInfo = {}; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.attachmentCount = 1; renderPassCreateInfo.pAttachments = &attachmentDescription; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; VkRenderPass renderPass; vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, NULL, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfo = {}; framebufferAttachmentImageInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfo.width = attachmentWidth; framebufferAttachmentImageInfo.height = attachmentHeight; framebufferAttachmentImageInfo.layerCount = 1; framebufferAttachmentImageInfo.viewFormatCount = 1; framebufferAttachmentImageInfo.pViewFormats = &attachmentFormat; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 1; VkFramebuffer framebuffer = VK_NULL_HANDLE; // Attachments info not present framebufferCreateInfo.pNext = nullptr; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03190"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; // Mismatched attachment counts framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 2; VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[2] = {framebufferAttachmentImageInfo, framebufferAttachmentImageInfo}; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03191"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentsCreateInfo.pAttachmentImageInfos = &framebufferAttachmentImageInfo; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 1; // Mismatched format list attachmentFormat = VK_FORMAT_B8G8R8A8_UNORM; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03205"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; // Mismatched format list attachmentFormat = VK_FORMAT_B8G8R8A8_UNORM; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03205"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } attachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; // Mismatched layer count, multiview disabled framebufferCreateInfo.layers = 2; const char* mismatchedLayersNoMultiviewVuid = multiviewSupported ? "VUID-VkFramebufferCreateInfo-renderPass-03199" : "VUID-VkFramebufferCreateInfo-flags-03200"; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, mismatchedLayersNoMultiviewVuid); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferCreateInfo.layers = 1; // Mismatched width framebufferCreateInfo.width += 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03192"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferCreateInfo.width -= 1; // Mismatched height framebufferCreateInfo.height += 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03193"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferCreateInfo.height -= 1; vkDestroyRenderPass(m_device->device(), renderPass, nullptr); } TEST_F(VkLayerTest, ImagelessFramebufferAttachmentImageUsageMismatchTests) { TEST_DESCRIPTION("Create an imageless framebuffer with mismatched attachment image usage"); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); return; } VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {}; physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR; physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE; VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {}; physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures; ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat colorAndInputAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; VkFormat depthStencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT; VkAttachmentDescription attachmentDescriptions[4] = {}; // Color attachment attachmentDescriptions[0].format = colorAndInputAttachmentFormat; attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT; attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Color resolve attachment attachmentDescriptions[1].format = colorAndInputAttachmentFormat; attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Depth stencil attachment attachmentDescriptions[2].format = depthStencilAttachmentFormat; attachmentDescriptions[2].samples = VK_SAMPLE_COUNT_4_BIT; attachmentDescriptions[2].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Input attachment attachmentDescriptions[3].format = colorAndInputAttachmentFormat; attachmentDescriptions[3].samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescriptions[3].finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference colorAttachmentReference = {}; colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; colorAttachmentReference.attachment = 0; VkAttachmentReference colorResolveAttachmentReference = {}; colorResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; colorResolveAttachmentReference.attachment = 1; VkAttachmentReference depthStencilAttachmentReference = {}; depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; depthStencilAttachmentReference.attachment = 2; VkAttachmentReference inputAttachmentReference = {}; inputAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; inputAttachmentReference.attachment = 3; VkSubpassDescription subpassDescription = {}; subpassDescription.colorAttachmentCount = 1; subpassDescription.pColorAttachments = &colorAttachmentReference; subpassDescription.pResolveAttachments = &colorResolveAttachmentReference; subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference; subpassDescription.inputAttachmentCount = 1; subpassDescription.pInputAttachments = &inputAttachmentReference; VkRenderPassCreateInfo renderPassCreateInfo = {}; renderPassCreateInfo.attachmentCount = 4; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.pAttachments = attachmentDescriptions; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; VkRenderPass renderPass; vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[4] = {}; // Color attachment framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[0].width = attachmentWidth; framebufferAttachmentImageInfos[0].height = attachmentHeight; framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfos[0].layerCount = 1; framebufferAttachmentImageInfos[0].viewFormatCount = 1; framebufferAttachmentImageInfos[0].pViewFormats = &colorAndInputAttachmentFormat; // Color resolve attachment framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[1].width = attachmentWidth; framebufferAttachmentImageInfos[1].height = attachmentHeight; framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfos[1].layerCount = 1; framebufferAttachmentImageInfos[1].viewFormatCount = 1; framebufferAttachmentImageInfos[1].pViewFormats = &colorAndInputAttachmentFormat; // Depth stencil attachment framebufferAttachmentImageInfos[2].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[2].width = attachmentWidth; framebufferAttachmentImageInfos[2].height = attachmentHeight; framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; framebufferAttachmentImageInfos[2].layerCount = 1; framebufferAttachmentImageInfos[2].viewFormatCount = 1; framebufferAttachmentImageInfos[2].pViewFormats = &depthStencilAttachmentFormat; // Input attachment framebufferAttachmentImageInfos[3].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[3].width = attachmentWidth; framebufferAttachmentImageInfos[3].height = attachmentHeight; framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; framebufferAttachmentImageInfos[3].layerCount = 1; framebufferAttachmentImageInfos[3].viewFormatCount = 1; framebufferAttachmentImageInfos[3].pViewFormats = &colorAndInputAttachmentFormat; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 4; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 4; VkFramebuffer framebuffer = VK_NULL_HANDLE; // Color attachment, mismatched usage framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_SAMPLED_BIT; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03201"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; // Color resolve attachment, mismatched usage framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_SAMPLED_BIT; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03201"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; // Depth stencil attachment, mismatched usage framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_SAMPLED_BIT; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03202"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; // Color attachment, mismatched usage framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_SAMPLED_BIT; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03204"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; vkDestroyRenderPass(m_device->device(), renderPass, nullptr); } TEST_F(VkLayerTest, ImagelessFramebufferAttachmentMultiviewImageLayerCountMismatchTests) { TEST_DESCRIPTION("Create an imageless framebuffer against a multiview-enabled render pass with mismatched layer counts"); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME); return; } if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); return; } VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {}; physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR; physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE; VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {}; physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures; ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat colorAndInputAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; VkFormat depthStencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT; VkAttachmentDescription attachmentDescriptions[4] = {}; // Color attachment attachmentDescriptions[0].format = colorAndInputAttachmentFormat; attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT; attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Color resolve attachment attachmentDescriptions[1].format = colorAndInputAttachmentFormat; attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Depth stencil attachment attachmentDescriptions[2].format = depthStencilAttachmentFormat; attachmentDescriptions[2].samples = VK_SAMPLE_COUNT_4_BIT; attachmentDescriptions[2].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Input attachment attachmentDescriptions[3].format = colorAndInputAttachmentFormat; attachmentDescriptions[3].samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescriptions[3].finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference colorAttachmentReference = {}; colorAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; colorAttachmentReference.attachment = 0; VkAttachmentReference colorResolveAttachmentReference = {}; colorResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; colorResolveAttachmentReference.attachment = 1; VkAttachmentReference depthStencilAttachmentReference = {}; depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; depthStencilAttachmentReference.attachment = 2; VkAttachmentReference inputAttachmentReference = {}; inputAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; inputAttachmentReference.attachment = 3; VkSubpassDescription subpassDescription = {}; subpassDescription.colorAttachmentCount = 1; subpassDescription.pColorAttachments = &colorAttachmentReference; subpassDescription.pResolveAttachments = &colorResolveAttachmentReference; subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference; subpassDescription.inputAttachmentCount = 1; subpassDescription.pInputAttachments = &inputAttachmentReference; uint32_t viewMask = 0x3u; VkRenderPassMultiviewCreateInfo renderPassMultiviewCreateInfo = {}; renderPassMultiviewCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO; renderPassMultiviewCreateInfo.subpassCount = 1; renderPassMultiviewCreateInfo.pViewMasks = &viewMask; VkRenderPassCreateInfo renderPassCreateInfo = {}; renderPassCreateInfo.pNext = &renderPassMultiviewCreateInfo; renderPassCreateInfo.attachmentCount = 4; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.pAttachments = attachmentDescriptions; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; VkRenderPass renderPass; vkCreateRenderPass(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[4] = {}; // Color attachment framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[0].width = attachmentWidth; framebufferAttachmentImageInfos[0].height = attachmentHeight; framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfos[0].layerCount = 2; framebufferAttachmentImageInfos[0].viewFormatCount = 1; framebufferAttachmentImageInfos[0].pViewFormats = &colorAndInputAttachmentFormat; // Color resolve attachment framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[1].width = attachmentWidth; framebufferAttachmentImageInfos[1].height = attachmentHeight; framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; framebufferAttachmentImageInfos[1].layerCount = 2; framebufferAttachmentImageInfos[1].viewFormatCount = 1; framebufferAttachmentImageInfos[1].pViewFormats = &colorAndInputAttachmentFormat; // Depth stencil attachment framebufferAttachmentImageInfos[2].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[2].width = attachmentWidth; framebufferAttachmentImageInfos[2].height = attachmentHeight; framebufferAttachmentImageInfos[2].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; framebufferAttachmentImageInfos[2].layerCount = 2; framebufferAttachmentImageInfos[2].viewFormatCount = 1; framebufferAttachmentImageInfos[2].pViewFormats = &depthStencilAttachmentFormat; // Input attachment framebufferAttachmentImageInfos[3].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[3].width = attachmentWidth; framebufferAttachmentImageInfos[3].height = attachmentHeight; framebufferAttachmentImageInfos[3].usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; framebufferAttachmentImageInfos[3].layerCount = 2; framebufferAttachmentImageInfos[3].viewFormatCount = 1; framebufferAttachmentImageInfos[3].pViewFormats = &colorAndInputAttachmentFormat; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 4; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 4; VkFramebuffer framebuffer = VK_NULL_HANDLE; // Color attachment, mismatched layer count framebufferAttachmentImageInfos[0].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[0].layerCount = 2; // Color resolve attachment, mismatched layer count framebufferAttachmentImageInfos[1].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[1].layerCount = 2; // Depth stencil attachment, mismatched layer count framebufferAttachmentImageInfos[2].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[2].layerCount = 2; // Input attachment, mismatched layer count framebufferAttachmentImageInfos[3].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[3].layerCount = 2; vkDestroyRenderPass(m_device->device(), renderPass, nullptr); } TEST_F(VkLayerTest, ImagelessFramebufferDepthStencilResolveAttachmentTests) { TEST_DESCRIPTION( "Create an imageless framebuffer against a render pass using depth stencil resolve, with mismatched information"); if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); } else { printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return; } ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names); if (!rp2Supported) { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME); return; } if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME); return; } if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME)) { m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME); m_device_extension_names.push_back(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); } else { printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME); return; } VkPhysicalDeviceImagelessFramebufferFeaturesKHR physicalDeviceImagelessFramebufferFeatures = {}; physicalDeviceImagelessFramebufferFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR; physicalDeviceImagelessFramebufferFeatures.imagelessFramebuffer = VK_TRUE; VkPhysicalDeviceFeatures2 physicalDeviceFeatures2 = {}; physicalDeviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; physicalDeviceFeatures2.pNext = &physicalDeviceImagelessFramebufferFeatures; ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &physicalDeviceFeatures2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)); ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); uint32_t attachmentWidth = 512; uint32_t attachmentHeight = 512; VkFormat attachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT; VkAttachmentDescription2KHR attachmentDescriptions[2] = {}; // Depth/stencil attachment attachmentDescriptions[0].sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR; attachmentDescriptions[0].format = attachmentFormat; attachmentDescriptions[0].samples = VK_SAMPLE_COUNT_4_BIT; attachmentDescriptions[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL; // Depth/stencil resolve attachment attachmentDescriptions[1].sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR; attachmentDescriptions[1].format = attachmentFormat; attachmentDescriptions[1].samples = VK_SAMPLE_COUNT_1_BIT; attachmentDescriptions[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL; VkAttachmentReference2KHR depthStencilAttachmentReference = {}; depthStencilAttachmentReference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; depthStencilAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; depthStencilAttachmentReference.attachment = 0; VkAttachmentReference2KHR depthStencilResolveAttachmentReference = {}; depthStencilResolveAttachmentReference.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR; depthStencilResolveAttachmentReference.layout = VK_IMAGE_LAYOUT_GENERAL; depthStencilResolveAttachmentReference.attachment = 1; VkSubpassDescriptionDepthStencilResolveKHR subpassDescriptionDepthStencilResolve = {}; subpassDescriptionDepthStencilResolve.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR; subpassDescriptionDepthStencilResolve.pDepthStencilResolveAttachment = &depthStencilResolveAttachmentReference; subpassDescriptionDepthStencilResolve.depthResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; subpassDescriptionDepthStencilResolve.stencilResolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR; VkSubpassDescription2KHR subpassDescription = {}; subpassDescription.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR; subpassDescription.pNext = &subpassDescriptionDepthStencilResolve; subpassDescription.pDepthStencilAttachment = &depthStencilAttachmentReference; subpassDescription.viewMask = 0x3u; VkRenderPassCreateInfo2KHR renderPassCreateInfo = {}; renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR; renderPassCreateInfo.pNext = nullptr; renderPassCreateInfo.attachmentCount = 2; renderPassCreateInfo.subpassCount = 1; renderPassCreateInfo.pSubpasses = &subpassDescription; renderPassCreateInfo.pAttachments = attachmentDescriptions; VkRenderPass renderPass; PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vkGetDeviceProcAddr(m_device->device(), "vkCreateRenderPass2KHR"); vkCreateRenderPass2KHR(m_device->device(), &renderPassCreateInfo, nullptr, &renderPass); VkFramebufferAttachmentImageInfoKHR framebufferAttachmentImageInfos[2] = {}; // Depth/stencil attachment framebufferAttachmentImageInfos[0].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[0].width = attachmentWidth; framebufferAttachmentImageInfos[0].height = attachmentHeight; framebufferAttachmentImageInfos[0].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; framebufferAttachmentImageInfos[0].layerCount = 2; framebufferAttachmentImageInfos[0].viewFormatCount = 1; framebufferAttachmentImageInfos[0].pViewFormats = &attachmentFormat; // Depth/stencil resolve attachment framebufferAttachmentImageInfos[1].sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR; framebufferAttachmentImageInfos[1].width = attachmentWidth; framebufferAttachmentImageInfos[1].height = attachmentHeight; framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; framebufferAttachmentImageInfos[1].layerCount = 2; framebufferAttachmentImageInfos[1].viewFormatCount = 1; framebufferAttachmentImageInfos[1].pViewFormats = &attachmentFormat; VkFramebufferAttachmentsCreateInfoKHR framebufferAttachmentsCreateInfo = {}; framebufferAttachmentsCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR; framebufferAttachmentsCreateInfo.attachmentImageInfoCount = 2; framebufferAttachmentsCreateInfo.pAttachmentImageInfos = framebufferAttachmentImageInfos; VkFramebufferCreateInfo framebufferCreateInfo = {}; framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo; framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR; framebufferCreateInfo.width = attachmentWidth; framebufferCreateInfo.height = attachmentHeight; framebufferCreateInfo.layers = 1; framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 2; VkFramebuffer framebuffer = VK_NULL_HANDLE; // Color attachment, mismatched layer count framebufferAttachmentImageInfos[0].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[0].layerCount = 2; // Depth resolve attachment, mismatched image usage framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_SAMPLED_BIT; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-flags-03203"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[1].usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; // Depth resolve attachment, mismatched layer count framebufferAttachmentImageInfos[1].layerCount = 1; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkFramebufferCreateInfo-renderPass-03198"); vkCreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer); m_errorMonitor->VerifyFound(); if (framebuffer != VK_NULL_HANDLE) { vkDestroyFramebuffer(m_device->device(), framebuffer, nullptr); } framebufferAttachmentImageInfos[1].layerCount = 2; vkDestroyRenderPass(m_device->device(), renderPass, nullptr); }