You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1085 lines
61 KiB
1085 lines
61 KiB
/*
|
|
* 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 <olvaffe@gmail.com>
|
|
* Author: Chris Forbes <chrisf@ijw.co.nz>
|
|
* Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
|
|
* Author: Mark Lobodzinski <mark@lunarg.com>
|
|
* Author: Mike Stroyan <mike@LunarG.com>
|
|
* Author: Tobin Ehlis <tobine@google.com>
|
|
* Author: Tony Barbour <tony@LunarG.com>
|
|
* Author: Cody Northrop <cnorthrop@google.com>
|
|
* Author: Dave Houlton <daveh@lunarg.com>
|
|
* Author: Jeremy Kniager <jeremyk@lunarg.com>
|
|
* Author: Shannon McPherson <shannon@lunarg.com>
|
|
* Author: John Zulauf <jzulauf@lunarg.com>
|
|
* Author: Tobias Hector <tobias.hector@amd.com>
|
|
*/
|
|
|
|
#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);
|
|
}
|