| /* |
| * Copyright (c) 2015-2025 The Khronos Group Inc. |
| * Copyright (c) 2015-2025 Valve Corporation |
| * Copyright (c) 2015-2025 LunarG, Inc. |
| * Copyright (c) 2015-2025 Google, Inc. |
| * Modifications Copyright (C) 2020-2022 Advanced Micro Devices, Inc. All rights reserved. |
| * Modifications Copyright (C) 2021-2022 ARM, Inc. All rights reserved. |
| * |
| * 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 |
| * |
| */ |
| |
| #include "../framework/layer_validation_tests.h" |
| #include "../framework/pipeline_helper.h" |
| #include "utils/convert_utils.h" |
| |
| class NegativeDynamicRenderingLocalRead : public DynamicRenderingTest {}; |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, AttachmentLayout) { |
| TEST_DESCRIPTION("Feature is disabled, but attachment descriptor and/or reference uses VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ"); |
| |
| // Add extention, but keep feature disabled |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| RETURN_IF_SKIP(Init()); |
| |
| VkAttachmentDescription attach[] = { |
| {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, |
| VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, |
| VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, |
| }; |
| VkAttachmentReference refs[] = { |
| {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, |
| }; |
| VkSubpassDescription subpasses[] = { |
| {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, nullptr, 0, nullptr}, |
| }; |
| |
| auto rpci = vku::InitStruct<VkRenderPassCreateInfo>(nullptr, 0u, 1u, attach, 1u, subpasses, 0u, nullptr); |
| |
| refs[0].layout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| |
| CreateRenderPassTest(rpci, true, "VUID-VkAttachmentReference-dynamicRenderingLocalRead-09546", |
| "VUID-VkAttachmentReference2-dynamicRenderingLocalRead-09546"); |
| |
| refs[0].layout = VK_IMAGE_LAYOUT_GENERAL; |
| attach->initialLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| CreateRenderPassTest(rpci, true, "VUID-VkAttachmentDescription-dynamicRenderingLocalRead-09544", |
| "VUID-VkAttachmentDescription2-dynamicRenderingLocalRead-09544"); |
| |
| attach->initialLayout = VK_IMAGE_LAYOUT_GENERAL; |
| attach->finalLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| CreateRenderPassTest(rpci, true, "VUID-VkAttachmentDescription-dynamicRenderingLocalRead-09545", |
| "VUID-VkAttachmentDescription2-dynamicRenderingLocalRead-09545"); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdDrawColorLocation) { |
| TEST_DESCRIPTION("Validate that mapping is not applied in CmdDraw call if rendering is not started by vkCmdBeginRendering"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_formats[] = {VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED}; |
| uint32_t locations[] = {1, 0, 2}; |
| |
| VkRenderingAttachmentLocationInfo pipeline_location_info = vku::InitStructHelper(); |
| pipeline_location_info.colorAttachmentCount = 2; |
| pipeline_location_info.pColorAttachmentLocations = locations; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(&pipeline_location_info); |
| pipeline_rendering_info.colorAttachmentCount = 2; |
| pipeline_rendering_info.pColorAttachmentFormats = color_formats; |
| |
| std::vector<VkPipelineColorBlendAttachmentState> color_blend_attachments(2); |
| |
| VkPipelineColorBlendStateCreateInfo cbi = vku::InitStructHelper(); |
| cbi.attachmentCount = 2; |
| cbi.pAttachments = color_blend_attachments.data(); |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.gp_ci_.pColorBlendState = &cbi; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachment[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachment[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachment[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 2; |
| location_info.pColorAttachmentLocations = &locations[1]; |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdDraw-None-09548"); |
| vk::CmdDraw(m_command_buffer, 3, 1, 0, 0); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdDrawColorIndex) { |
| TEST_DESCRIPTION("Validate that mapping is not applied in CmdDraw call if rendering is not started by vkCmdBeginRendering"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_formats[] = {VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED}; |
| uint32_t locations[] = {0, 1}; |
| uint32_t inputs[] = {0, 1, 0}; |
| |
| VkRenderingInputAttachmentIndexInfo inputs_info = vku::InitStructHelper(); |
| inputs_info.colorAttachmentCount = 2; |
| inputs_info.pColorAttachmentInputIndices = inputs; |
| |
| VkRenderingAttachmentLocationInfo locations_info = vku::InitStructHelper(&inputs_info); |
| locations_info.colorAttachmentCount = 2; |
| locations_info.pColorAttachmentLocations = locations; |
| |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(&locations_info); |
| pipeline_rendering_info.colorAttachmentCount = 2; |
| pipeline_rendering_info.pColorAttachmentFormats = color_formats; |
| |
| std::vector<VkPipelineColorBlendAttachmentState> color_blend_attachments(2); |
| VkPipelineColorBlendStateCreateInfo cbi = vku::InitStructHelper(); |
| cbi.attachmentCount = 2u; |
| cbi.pAttachments = color_blend_attachments.data(); |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.gp_ci_.pColorBlendState = &cbi; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachment[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachment[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachment[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 2; |
| location_info.pColorAttachmentLocations = locations; |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = 2; |
| input_info.pColorAttachmentInputIndices = &inputs[1]; |
| |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdDraw-None-09549"); |
| vk::CmdDraw(m_command_buffer, 3, 1, 0, 0); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdClearAttachments) { |
| TEST_DESCRIPTION("Clear unmapped color attachment"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {m_width, m_height}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t location = VK_ATTACHMENT_UNUSED; |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 1; |
| location_info.pColorAttachmentLocations = &location; |
| |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| |
| VkClearAttachment clear_attachment; |
| clear_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; |
| clear_attachment.clearValue.color.float32[0] = 1.0; |
| clear_attachment.clearValue.color.float32[1] = 1.0; |
| clear_attachment.clearValue.color.float32[2] = 1.0; |
| clear_attachment.clearValue.color.float32[3] = 1.0; |
| clear_attachment.colorAttachment = 0; |
| VkClearRect clear_rect = {{{0, 0}, {m_width, m_height}}, 0, 1}; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdClearAttachments-colorAttachment-09503"); |
| vk::CmdClearAttachments(m_command_buffer, 1, &clear_attachment, 1, &clear_rect); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrier) { |
| TEST_DESCRIPTION("Test setting image memory barrier without dynamic rendering local read features enabled."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredExtensions(VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| AddRequiredFeature(vkt::Feature::dynamicRendering); |
| AddRequiredFeature(vkt::Feature::shaderTileImageColorReadAccess); |
| RETURN_IF_SKIP(Init()); |
| InitDynamicRenderTarget(); |
| m_command_buffer.Begin(); |
| vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_STORAGE_BIT); |
| |
| VkImageMemoryBarrier img_barrier = vku::InitStructHelper(); |
| img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| img_barrier.srcAccessMask = VK_ACCESS_NONE; |
| img_barrier.newLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| img_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| img_barrier.image = image; |
| img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| auto img_barrier2 = ConvertVkImageMemoryBarrierToV2(img_barrier, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT); |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-dynamicRenderingLocalRead-09552"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-oldLayout-01181"); |
| m_command_buffer.Barrier(*img_barrier2.ptr(), VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-dynamicRenderingLocalRead-09552"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-01181"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &img_barrier); |
| m_errorMonitor->VerifyFound(); |
| |
| img_barrier2.newLayout = VK_IMAGE_LAYOUT_GENERAL; |
| img_barrier2.dstAccessMask = VK_ACCESS_NONE; |
| img_barrier2.oldLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| img_barrier2.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-dynamicRenderingLocalRead-09551"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-oldLayout-01181"); |
| m_command_buffer.Barrier(*img_barrier2.ptr(), VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; |
| img_barrier.dstAccessMask = VK_ACCESS_NONE; |
| img_barrier.oldLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| img_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-dynamicRenderingLocalRead-09551"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-01181"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &img_barrier); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierOwnership) { |
| TEST_DESCRIPTION("Test setting image memory barrier transferring ownership without dynamic rendering local read features enabled."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredExtensions(VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| AddRequiredFeature(vkt::Feature::dynamicRendering); |
| AddRequiredFeature(vkt::Feature::shaderTileImageColorReadAccess); |
| RETURN_IF_SKIP(Init()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| |
| vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT); |
| |
| VkImageMemoryBarrier img_barrier = vku::InitStructHelper(); |
| img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| img_barrier.srcAccessMask = VK_ACCESS_NONE; |
| img_barrier.newLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| img_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| img_barrier.image = image; |
| img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| auto img_barrier2 = ConvertVkImageMemoryBarrierToV2(img_barrier, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT); |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-09550"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-dynamicRenderingLocalRead-09552"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-oldLayout-01181"); |
| m_command_buffer.Barrier(*img_barrier2.ptr(), VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-09550"); |
| m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-dynamicRenderingLocalRead-09552"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-01181"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &img_barrier); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierNoBufferOrImage) { |
| TEST_DESCRIPTION("Test setting image memory barrier within BeginRenderning without dynamic rendering local read features enabled."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredExtensions(VK_EXT_SHADER_TILE_IMAGE_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| AddRequiredFeature(vkt::Feature::shaderTileImageColorReadAccess); |
| RETURN_IF_SKIP(InitBasicDynamicRendering()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| |
| vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_STORAGE_BIT); |
| |
| VkImageMemoryBarrier img_barrier = vku::InitStructHelper(); |
| img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| img_barrier.srcAccessMask = VK_ACCESS_NONE; |
| img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; |
| img_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| img_barrier.image = image; |
| img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| img_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| auto img_barrier2 = ConvertVkImageMemoryBarrierToV2(img_barrier, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-oldLayout-01181"); |
| m_command_buffer.Barrier(*img_barrier2.ptr(), VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-09554"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-01181"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &img_barrier); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierFramebufferStagesOnly) { |
| TEST_DESCRIPTION("Test barriers within render pass started by vkCmdBeginRendering specify only framebuffer stages."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| VkMemoryBarrier2 barrier2 = vku::InitStructHelper(); |
| barrier2.srcStageMask = VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT; |
| barrier2.srcAccessMask = VK_ACCESS_2_NONE; |
| barrier2.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| barrier2.dstAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT; |
| |
| // testing vkCmdPipelineBarrier2 srcStageMask |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-srcStageMask-09556"); |
| m_command_buffer.Barrier(barrier2, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| // testing vkCmdPipelineBarrier2 dstStageMask |
| std::swap(barrier2.srcStageMask, barrier2.dstStageMask); |
| std::swap(barrier2.srcAccessMask, barrier2.dstAccessMask); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-srcStageMask-09556"); |
| m_command_buffer.Barrier(barrier2, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| // testing vkCmdPipelineBarrier srcStageMask |
| VkMemoryBarrier barrier = vku::InitStructHelper(); |
| barrier.srcAccessMask = VK_ACCESS_2_NONE; |
| barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-srcStageMask-09556"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_DEPENDENCY_BY_REGION_BIT, 1, &barrier, 0, nullptr, 0, nullptr); |
| m_errorMonitor->VerifyFound(); |
| |
| // testing vkCmdPipelineBarrier dstStageMask |
| std::swap(barrier.srcAccessMask, barrier.dstAccessMask); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-srcStageMask-09556"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, |
| VK_DEPENDENCY_BY_REGION_BIT, 1, &barrier, 0, nullptr, 0, nullptr); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierRequireFeature) { |
| TEST_DESCRIPTION( |
| "Test setting image memory barrier within BeginRendering without dynamic rendering local read feature enabled."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRendering()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| VkMemoryBarrier2 barrier2 = vku::InitStructHelper(); |
| barrier2.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| barrier2.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT; |
| barrier2.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| barrier2.dstAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-None-09553"); |
| m_command_buffer.Barrier(barrier2, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| |
| VkMemoryBarrier barrier = vku::InitStructHelper(); |
| barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; |
| barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-09553"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 1, &barrier, 0, nullptr, 0, |
| nullptr); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, LayoutTransition) { |
| TEST_DESCRIPTION("Image barrier must not perform layout transition inside render pass instance"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, m_width, m_height, VK_FORMAT_R8G8B8A8_UNORM, |
| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT); |
| vkt::ImageView imageView = image.CreateView(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = imageView; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_GENERAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {m_width, m_height}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| // Attempt to perform image layout transition. It is forbidden if the barrier is inside |
| // render pass instance (either started with vkCmdBeginRenderPass or vkCmdBeginRendering). |
| local_read_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; |
| local_read_barrier.newLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-01181"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &local_read_barrier); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, LayoutTransition2) { |
| TEST_DESCRIPTION("Image barrier must not perform layout transition inside render pass instance"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, m_width, m_height, VK_FORMAT_R8G8B8A8_UNORM, |
| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT); |
| vkt::ImageView imageView = image.CreateView(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = imageView; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_GENERAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {m_width, m_height}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier2 local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| // Attempt to perform image layout transition. It is forbidden if the barrier is inside |
| // render pass instance (either started with vkCmdBeginRenderPass or vkCmdBeginRendering). |
| local_read_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; |
| local_read_barrier.newLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-oldLayout-01181"); |
| m_command_buffer.Barrier(local_read_barrier, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierLayoutMismatch) { |
| TEST_DESCRIPTION("Image barrier's layout does not match expected attachment layout"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| vkt::ImageView image_view = image.CreateView(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = image_view; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_GENERAL; |
| color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; |
| color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; |
| // Different layout then in VkRenderingAttachmentInfo (GENERAL) |
| local_read_barrier.oldLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| local_read_barrier.newLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-oldLayout-10759"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, |
| VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &local_read_barrier); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierInProperLayout) { |
| TEST_DESCRIPTION("Barrier within a render pass instance started with vkCmdBeginRendering"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, 256, 256, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| vkt::ImageView image_view = image.CreateView(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = image_view; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {256, 256}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcAccessMask = VK_ACCESS_NONE; |
| local_read_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| local_read_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-image-09555"); |
| vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, |
| &local_read_barrier); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierInProperLayout2) { |
| TEST_DESCRIPTION("Barrier within a render pass instance started with vkCmdBeginRendering"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, 256, 256, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| vkt::ImageView image_view = image.CreateView(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = image_view; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {256, 256}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier2 local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-image-09555"); |
| m_command_buffer.Barrier(local_read_barrier, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierInProperLayoutDepthImage) { |
| TEST_DESCRIPTION("Barrier within a render pass instance started with vkCmdBeginRendering"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| const VkFormat ds_format = FindSupportedDepthStencilFormat(Gpu()); |
| |
| vkt::Image image(*m_device, 256, 256, ds_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); |
| vkt::ImageView image_view = image.CreateView(VK_IMAGE_ASPECT_DEPTH_BIT); |
| |
| VkRenderingAttachmentInfo depth_attachment = vku::InitStructHelper(); |
| depth_attachment.imageView = image_view; |
| depth_attachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {256, 256}}; |
| rendering_info.layerCount = 1; |
| rendering_info.pDepthAttachment = &depth_attachment; |
| |
| VkImageMemoryBarrier2 local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcStageMask = VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR; |
| local_read_barrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstStageMask = VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR; |
| local_read_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(rendering_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-image-09555"); |
| m_command_buffer.Barrier(local_read_barrier, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ImageBarrierInProperLayoutMultipleSubresources) { |
| TEST_DESCRIPTION("Barrier within a render pass instance started with vkCmdBeginRendering"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| const auto image_ci = |
| vkt::Image::ImageCreateInfo2D(256, 256, 2, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| vkt::Image image(*m_device, image_ci); |
| // Create view for mip 0 |
| vkt::ImageView image_view = image.CreateView(VK_IMAGE_VIEW_TYPE_2D, 0, 1); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = image_view; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {256, 256}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier2 layout_transition = vku::InitStructHelper(); |
| layout_transition.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| layout_transition.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| layout_transition.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| layout_transition.newLayout = VK_IMAGE_LAYOUT_GENERAL; |
| layout_transition.image = image; |
| // Select mip 1 for layout transition |
| layout_transition.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 0, 1}; |
| |
| VkImageMemoryBarrier2 local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| // Set VK_IMAGE_LAYOUT_GENERAL for mip 1 |
| m_command_buffer.Barrier(layout_transition); |
| m_command_buffer.BeginRendering(rendering_info); |
| // mip 0 still has undefined layout |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-image-09555"); |
| m_command_buffer.Barrier(local_read_barrier, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, PipelineBarrierWrongAttachmentLayout) { |
| TEST_DESCRIPTION("Using image barrier inside dynamic render pass instance with invalid attachment layout"); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| vkt::ImageView image_view = image.CreateView(); |
| |
| VkImageMemoryBarrier2 layout_transition = vku::InitStructHelper(); |
| layout_transition.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| layout_transition.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| layout_transition.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| layout_transition.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| layout_transition.image = image; |
| layout_transition.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageView = image_view; |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; |
| color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| VkImageMemoryBarrier2 local_read_barrier = vku::InitStructHelper(); |
| local_read_barrier.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
| local_read_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| local_read_barrier.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; |
| local_read_barrier.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; |
| local_read_barrier.image = image; |
| local_read_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| |
| m_command_buffer.Begin(); |
| |
| // Transition attachment to COLOR_ATTACHMENT_OPTIMAL layout |
| m_command_buffer.Barrier(layout_transition); |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| // Wrong layout: should be GENERAL or LOCAL_READ |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-image-09555"); |
| m_command_buffer.Barrier(local_read_barrier); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, BeginWithinRenderPass) { |
| TEST_DESCRIPTION("Test setting initialLayout and finalLayout in attachment descriptor and reference against image usage."); |
| SetTargetApiVersion(VK_API_VERSION_1_3); |
| AddOptionalExtensions(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| const bool rp2Supported = IsExtensionsEnabled(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME); |
| |
| for (uint32_t i = 0; i < 3; i++) { |
| std::vector<VkAttachmentReference> color_references; |
| std::vector<VkAttachmentDescription> attachment_descriptions; |
| std::shared_ptr<vkt::Framebuffer> framebuffer; |
| std::vector<std::unique_ptr<vkt::Image>> renderTargets; |
| std::vector<vkt::ImageView> render_target_views; // color attachments but not depth |
| std::vector<VkImageView> framebuffer_attachments; // all attachments, can be consumed directly by the API |
| |
| VkAttachmentDescription att = {}; |
| att.format = m_render_target_fmt; |
| att.samples = VK_SAMPLE_COUNT_1_BIT; |
| att.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; |
| att.storeOp = VK_ATTACHMENT_STORE_OP_STORE; |
| att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; |
| att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; |
| |
| att.initialLayout = i == 0 ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| att.finalLayout = i == 1 ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| |
| VkAttachmentReference ref = {}; |
| ref.layout = i == 2 ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| ref.attachment = 0; |
| |
| m_renderPassClearValues.clear(); |
| VkClearValue clear = {}; |
| clear.color = m_clear_color; |
| |
| attachment_descriptions.push_back(att); |
| |
| color_references.push_back(ref); |
| |
| m_renderPassClearValues.push_back(clear); |
| |
| std::unique_ptr<vkt::Image> img(new vkt::Image()); |
| |
| VkFormatProperties props; |
| |
| vk::GetPhysicalDeviceFormatProperties(m_device->Physical(), m_render_target_fmt, &props); |
| |
| if (props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) { |
| img->Init(*m_device, m_width, m_height, 1, m_render_target_fmt, |
| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); |
| } else { |
| FAIL() << "Neither Linear nor Optimal allowed for render target"; |
| } |
| |
| render_target_views.push_back(img->CreateView()); |
| framebuffer_attachments.push_back(render_target_views.back()); |
| renderTargets.push_back(std::move(img)); |
| |
| VkSubpassDescription subpass = {}; |
| subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| subpass.flags = 0; |
| subpass.inputAttachmentCount = 0; |
| subpass.pInputAttachments = NULL; |
| subpass.colorAttachmentCount = 1; |
| subpass.pColorAttachments = color_references.data(); |
| subpass.pResolveAttachments = NULL; |
| |
| VkRenderPassCreateInfo rp_info = vku::InitStructHelper(); |
| rp_info.attachmentCount = attachment_descriptions.size(); |
| rp_info.pAttachments = attachment_descriptions.data(); |
| rp_info.subpassCount = 1; |
| rp_info.pSubpasses = &subpass; |
| rp_info.dependencyCount = 0; |
| rp_info.pDependencies = nullptr; |
| |
| vk::CreateRenderPass(device(), &rp_info, NULL, &m_renderPass); |
| |
| framebuffer = std::shared_ptr<vkt::Framebuffer>(new vkt::Framebuffer( |
| *m_device, m_renderPass, framebuffer_attachments.size(), framebuffer_attachments.data(), m_width, m_height)); |
| |
| m_renderPassBeginInfo.renderPass = m_renderPass; |
| m_renderPassBeginInfo.framebuffer = framebuffer->handle(); |
| m_renderPassBeginInfo.renderArea.extent = {m_width, m_height}; |
| m_renderPassBeginInfo.clearValueCount = m_renderPassClearValues.size(); |
| m_renderPassBeginInfo.pClearValues = m_renderPassClearValues.data(); |
| |
| m_command_buffer.Begin(); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdBeginRenderPass-initialLayout-09537"); |
| vk::CmdBeginRenderPass(m_command_buffer, &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); |
| m_errorMonitor->VerifyFound(); |
| |
| if (rp2Supported) { |
| auto subpassBeginInfo = vku::InitStruct<VkSubpassBeginInfo>(nullptr, VK_SUBPASS_CONTENTS_INLINE); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdBeginRenderPass2-initialLayout-09538"); |
| vk::CmdBeginRenderPass2KHR(m_command_buffer, &m_renderPassBeginInfo, &subpassBeginInfo); |
| m_errorMonitor->VerifyFound(); |
| } |
| m_command_buffer.End(); |
| vk::DestroyRenderPass(*DeviceObj(), m_renderPass, nullptr); |
| |
| m_renderPass = VK_NULL_HANDLE; |
| } |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, RemappingAtCreatePipeline) { |
| TEST_DESCRIPTION("Color attachment count in Inputs Info must match to Rendering Create Info"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 0; |
| location_info.pColorAttachmentLocations = nullptr; |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(&location_info); |
| input_info.colorAttachmentCount = 0; |
| input_info.pColorAttachmentInputIndices = nullptr; |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(&input_info); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkGraphicsPipelineCreateInfo-renderPass-09531"); |
| m_errorMonitor->SetDesiredError("VUID-VkGraphicsPipelineCreateInfo-renderPass-09532"); |
| pipe.CreateGraphicsPipeline(); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, InputAttachmentIndexColorAttachmentCount) { |
| TEST_DESCRIPTION("colorAttachmentCount in Inputs Info must be less than maxColorAttachments"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| std::vector<uint32_t> input_attachment_indices(m_device->Physical().limits_.maxColorAttachments + 1); |
| for (size_t i = 0; i < input_attachment_indices.size(); i++) { |
| input_attachment_indices[i] = static_cast<uint32_t>(i); |
| } |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = static_cast<uint32_t>(input_attachment_indices.size()); |
| input_info.pColorAttachmentInputIndices = input_attachment_indices.data(); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(&input_info); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkGraphicsPipelineCreateInfo-renderPass-09531"); |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingInputAttachmentIndexInfo-colorAttachmentCount-09525"); |
| // On Arm Windows, you will hit input limit as well |
| m_errorMonitor->SetAllowedFailureMsg("VUID-VkRenderingInputAttachmentIndexInfo-pDepthInputAttachmentIndex-12274"); |
| pipe.CreateGraphicsPipeline(); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, ColorAttachmentCountInPipelineRenderingCreateInfo) { |
| TEST_DESCRIPTION("colorAttachmentCount must be less than or equal to maxColorAttachments in VkPipelineRenderingCreateInfo"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| std::vector<VkFormat> color_attachments(m_device->Physical().limits_.maxColorAttachments + 1, VK_FORMAT_R8G8B8A8_UNORM); |
| |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = color_attachments.size(); |
| pipeline_rendering_info.pColorAttachmentFormats = color_attachments.data(); |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkPipelineRenderingCreateInfo-colorAttachmentCount-09533"); |
| pipe.CreateGraphicsPipeline(); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdSetAttachmentIndicesColorAttachmentCount) { |
| TEST_DESCRIPTION("colorAttachmentCount must be equal to the value used to begin the current render pass instance"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachment[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachment[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachment[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t locations[] = {0}; |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = 1; |
| input_info.pColorAttachmentInputIndices = locations; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingInputAttachmentIndices-pInputAttachmentIndexInfo-09517"); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdSetAttachmentIndices) { |
| TEST_DESCRIPTION("Test CmdSetRenderingInputAttachmentIndicesKHR is called for render pass initiated by vkCmdBeginRendering"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitRenderTarget(); |
| |
| CreatePipelineHelper pipe(*this); |
| pipe.CreateGraphicsPipeline(); |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| m_command_buffer.BeginRenderPass(m_renderPassBeginInfo); |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = 0; |
| input_info.pColorAttachmentInputIndices = nullptr; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingInputAttachmentIndices-commandBuffer-09518"); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, InputAttachmentIndexSetToUnused) { |
| TEST_DESCRIPTION("If the feature is not enabled all pColorAttachmentInputIndices must be set to VK_ATTACHMENT_UNUSED"); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::dynamicRendering); |
| SetTargetApiVersion(VK_API_VERSION_1_2); |
| RETURN_IF_SKIP(Init()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper(); |
| color_attachment.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 1; |
| rendering_info.pColorAttachments = &color_attachment; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t locations[] = {0}; |
| uint32_t unused = VK_ATTACHMENT_UNUSED; |
| VkRenderingInputAttachmentIndexInfo input_info[3] = { |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 1, &locations[0], nullptr, nullptr}, |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 1, &unused, &locations[0], nullptr}, |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 1, &unused, nullptr, &locations[0]}}; |
| const char *vuids[] = {"VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09519", |
| "VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09520", |
| "VUID-VkRenderingInputAttachmentIndexInfo-dynamicRenderingLocalRead-09521"}; |
| |
| for (uint32_t i = 0; i < 3; i++) { |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingInputAttachmentIndices-dynamicRenderingLocalRead-09516"); |
| m_errorMonitor->SetDesiredError(vuids[i]); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info[i]); |
| m_errorMonitor->VerifyFound(); |
| } |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, InputAttachmentIndexUnique) { |
| TEST_DESCRIPTION("Color, depth and stencil attachment indices are set to unique values"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachments[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachments[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t locations_bad[] = {0, 0}; |
| uint32_t locations_good[] = {0, 1}; |
| VkRenderingInputAttachmentIndexInfo input_info[3] = { |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 2, &locations_bad[0], nullptr, nullptr}, |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 2, &locations_good[0], &locations_bad[0], nullptr}, |
| {VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR, nullptr, 2, &locations_good[0], nullptr, &locations_bad[0]}}; |
| const char *vuids[] = {"VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09522", |
| "VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09523", |
| "VUID-VkRenderingInputAttachmentIndexInfo-pColorAttachmentInputIndices-09524"}; |
| |
| for (uint32_t i = 0; i < 3; i++) { |
| m_errorMonitor->SetDesiredError(vuids[i]); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info[i]); |
| m_errorMonitor->VerifyFound(); |
| } |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, MaxPerStageDescriptorInputAttachments) { |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| const uint32_t max_attachments = m_device->Physical().limits_.maxPerStageDescriptorInputAttachments; |
| if (max_attachments == vvl::kU32Max) { |
| GTEST_SKIP() << "maxPerStageDescriptorInputAttachments is uint32_t max"; |
| } |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachments[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachments[0]; |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t indices[2] = {0, max_attachments}; |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.pColorAttachmentInputIndices = indices; |
| input_info.colorAttachmentCount = 2; |
| |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingInputAttachmentIndexInfo-pDepthInputAttachmentIndex-12274"); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdSetAttachmentLocationsColorAttachmentCount) { |
| TEST_DESCRIPTION("colorAttachmentCount must be equal to the value used to begin the current render pass instance"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachment[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachment[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachment[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t locations[] = {0}; |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 1; |
| location_info.pColorAttachmentLocations = locations; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-pLocationInfo-09510"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, NewFunctionsReportErrorExtensionDisabled) { |
| TEST_DESCRIPTION("Check that new functions cannot be called if extension is disabled"); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::dynamicRendering); |
| SetTargetApiVersion(VK_API_VERSION_1_2); |
| RETURN_IF_SKIP(Init()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 0; |
| location_info.pColorAttachmentLocations = nullptr; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-dynamicRenderingLocalRead-09509"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| m_errorMonitor->VerifyFound(); |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = 0; |
| input_info.pColorAttachmentInputIndices = nullptr; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingInputAttachmentIndices-dynamicRenderingLocalRead-09516"); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdSetRenderingAttachmentLocations) { |
| TEST_DESCRIPTION("Test CmdSetRenderingAttachmentLocationsKHR is called for render pass initiated by vkCmdBeginRendering"); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitRenderTarget(); |
| |
| CreatePipelineHelper pipe(*this); |
| pipe.CreateGraphicsPipeline(); |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| m_command_buffer.BeginRenderPass(m_renderPassBeginInfo); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 0; |
| location_info.pColorAttachmentLocations = nullptr; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-commandBuffer-09511"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdSetRenderingAttachmentLocationsSecondary) { |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkCommandBufferInheritanceRenderingInfo cbiri = vku::InitStructHelper(); |
| cbiri.colorAttachmentCount = 1; |
| cbiri.pColorAttachmentFormats = &color_format; |
| cbiri.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; |
| |
| VkCommandBufferInheritanceInfo cbii = vku::InitStructHelper(&cbiri); |
| VkCommandBufferBeginInfo cbbi = vku::InitStructHelper(); |
| cbbi.flags = VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; |
| cbbi.pInheritanceInfo = &cbii; |
| |
| uint32_t locations = 0; |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 1; |
| location_info.pColorAttachmentLocations = &locations; |
| |
| vkt::CommandBuffer secondary(*m_device, m_command_pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY); |
| secondary.Begin(&cbbi); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-commandBuffer-09511"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(secondary, &location_info); |
| m_errorMonitor->VerifyFound(); |
| secondary.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, AttachmentLocationsValidity) { |
| TEST_DESCRIPTION( |
| "If the feature is not enabled all pColorAttachmentLocations must be set to its index within the array and unique"); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); |
| AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::dynamicRendering); |
| SetTargetApiVersion(VK_API_VERSION_1_2); |
| RETURN_IF_SKIP(Init()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachments[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachments[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachments[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachments[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| uint32_t color_attachment_locations[2] = {1, 1}; |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 2; |
| location_info.pColorAttachmentLocations = color_attachment_locations; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-dynamicRenderingLocalRead-09509"); |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingAttachmentLocationInfo-pColorAttachmentLocations-09513"); |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingAttachmentLocationInfo-dynamicRenderingLocalRead-09512"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, AttachmentLocationsMax) { |
| TEST_DESCRIPTION( |
| "colorAttachmentCount must be less than or equal to maxColorAttachments. pColorAttachmentLocations[i] must be less than."); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM; |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(); |
| pipeline_rendering_info.colorAttachmentCount = 1; |
| pipeline_rendering_info.pColorAttachmentFormats = &color_format; |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.CreateGraphicsPipeline(); |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| std::vector<uint32_t> color_attachment_locations(m_device->Physical().limits_.maxColorAttachments + 1); |
| for (size_t i = 0; i < color_attachment_locations.size(); i++) { |
| color_attachment_locations[i] = static_cast<uint32_t>(i); |
| } |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = static_cast<uint32_t>(color_attachment_locations.size()); |
| location_info.pColorAttachmentLocations = color_attachment_locations.data(); |
| |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingAttachmentLocationInfo-colorAttachmentCount-09514"); |
| m_errorMonitor->SetDesiredError("VUID-VkRenderingAttachmentLocationInfo-pColorAttachmentLocations-09515"); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdSetRenderingAttachmentLocations-pLocationInfo-09510"); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, DependencyViewLocalInsideRendering) { |
| AddRequiredExtensions(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| VkMemoryBarrier2 memory_barrier_2 = vku::InitStructHelper(); |
| memory_barrier_2.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| memory_barrier_2.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT; |
| memory_barrier_2.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| memory_barrier_2.dstAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-dependencyFlags-07891"); |
| m_command_buffer.BarrierKHR(memory_barrier_2, VK_DEPENDENCY_VIEW_LOCAL_BIT); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, DependencyViewLocalOutsideRendering) { |
| AddRequiredExtensions(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| m_command_buffer.Begin(); |
| |
| VkMemoryBarrier2 memory_barrier_2 = vku::InitStructHelper(); |
| memory_barrier_2.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| memory_barrier_2.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT; |
| memory_barrier_2.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| memory_barrier_2.dstAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-dependencyFlags-01186"); |
| m_command_buffer.BarrierKHR(memory_barrier_2, VK_DEPENDENCY_VIEW_LOCAL_BIT); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, FramebufferSpaceStagesDst) { |
| AddRequiredExtensions(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::synchronization2); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitDynamicRenderTarget(); |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea()); |
| |
| VkMemoryBarrier2 memory_barrier_2 = vku::InitStructHelper(); |
| memory_barrier_2.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; |
| memory_barrier_2.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT; |
| memory_barrier_2.dstStageMask = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT; |
| memory_barrier_2.dstAccessMask = VK_ACCESS_2_NONE; |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier2-srcStageMask-09556"); |
| m_command_buffer.BarrierKHR(memory_barrier_2, VK_DEPENDENCY_BY_REGION_BIT); |
| m_errorMonitor->VerifyFound(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, RenderingAttachmentLocationInfoMismatch) { |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitDynamicRenderTarget(); |
| |
| const auto render_target_ci = vkt::Image::ImageCreateInfo2D(m_renderTargets[0]->Width(), m_renderTargets[0]->Height(), |
| m_renderTargets[0]->CreateInfo().mipLevels, 1, |
| m_renderTargets[0]->Format(), m_renderTargets[0]->Usage()); |
| |
| vkt::Image render_target(*m_device, render_target_ci, vkt::set_layout); |
| vkt::ImageView render_target_view = render_target.CreateView(VK_IMAGE_VIEW_TYPE_2D, 0, 1, 0, render_target_ci.arrayLayers); |
| |
| VkCommandBufferAllocateInfo secondary_cmd_buffer_alloc_info = vku::InitStructHelper(); |
| secondary_cmd_buffer_alloc_info.commandPool = m_command_pool; |
| secondary_cmd_buffer_alloc_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY; |
| secondary_cmd_buffer_alloc_info.commandBufferCount = 1; |
| |
| vkt::CommandBuffer secondary_cmd_buffer(*m_device, secondary_cmd_buffer_alloc_info); |
| |
| uint32_t color_attachment_locations[1] = {0}; |
| uint32_t invalid_attachment_locations[1] = {1}; |
| |
| VkRenderingAttachmentLocationInfo rendering_attachment_location_info = vku::InitStructHelper{}; |
| rendering_attachment_location_info.colorAttachmentCount = 1; |
| rendering_attachment_location_info.pColorAttachmentLocations = color_attachment_locations; |
| |
| VkRenderingAttachmentLocationInfo invalid_rendering_attachment_location_info = vku::InitStructHelper{}; |
| invalid_rendering_attachment_location_info.colorAttachmentCount = 0; |
| invalid_rendering_attachment_location_info.pColorAttachmentLocations = nullptr; |
| |
| VkCommandBufferInheritanceRenderingInfo inheritance_rendering_info = |
| vku::InitStructHelper(&invalid_rendering_attachment_location_info); |
| inheritance_rendering_info.colorAttachmentCount = 1; |
| inheritance_rendering_info.pColorAttachmentFormats = &render_target_ci.format; |
| inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; |
| VkCommandBufferInheritanceInfo cmd_buffer_inheritance_info = vku::InitStructHelper(&inheritance_rendering_info); |
| |
| VkCommandBufferBeginInfo secondary_cmd_buffer_begin_info = vku::InitStructHelper{}; |
| secondary_cmd_buffer_begin_info.flags = |
| VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; |
| secondary_cmd_buffer_begin_info.pInheritanceInfo = &cmd_buffer_inheritance_info; |
| |
| secondary_cmd_buffer.Begin(&secondary_cmd_buffer_begin_info); |
| secondary_cmd_buffer.End(); |
| |
| m_command_buffer.Begin(); |
| |
| VkRenderingAttachmentInfo color_attachment_info = vku::InitStructHelper{}; |
| color_attachment_info.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| color_attachment_info.imageView = render_target_view; |
| |
| VkClearRect clear_rect = {{{0, 0}, {m_width, m_height}}, 0, 1}; |
| |
| VkRenderingInfo begin_rendering_info = vku::InitStructHelper{}; |
| begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT; |
| begin_rendering_info.renderArea = clear_rect.rect; |
| begin_rendering_info.layerCount = 1; |
| begin_rendering_info.colorAttachmentCount = 1; |
| begin_rendering_info.pColorAttachments = &color_attachment_info; |
| |
| // Force invalid colorAttachmentCount |
| m_command_buffer.BeginRendering(begin_rendering_info); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &rendering_attachment_location_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdExecuteCommands-pCommandBuffers-09504"); |
| vk::CmdExecuteCommands(m_command_buffer, 1, &secondary_cmd_buffer.handle()); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| |
| // Force colorAttachmentLocation mismatch. |
| invalid_rendering_attachment_location_info.colorAttachmentCount = 1; |
| invalid_rendering_attachment_location_info.pColorAttachmentLocations = invalid_attachment_locations; |
| |
| secondary_cmd_buffer.Reset(); |
| secondary_cmd_buffer.Begin(&secondary_cmd_buffer_begin_info); |
| secondary_cmd_buffer.End(); |
| |
| m_command_buffer.Reset(); |
| m_command_buffer.Begin(); |
| |
| m_command_buffer.BeginRendering(begin_rendering_info); |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &rendering_attachment_location_info); |
| m_errorMonitor->SetDesiredError("VUID-vkCmdExecuteCommands-pCommandBuffers-09504"); |
| vk::CmdExecuteCommands(m_command_buffer, 1, &secondary_cmd_buffer.handle()); |
| m_errorMonitor->VerifyFound(); |
| m_command_buffer.EndRendering(); |
| |
| m_command_buffer.End(); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, RenderingInputAttachmentIndexInfoMismatch) { |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| InitDynamicRenderTarget(); |
| |
| const auto render_target_ci = vkt::Image::ImageCreateInfo2D(m_renderTargets[0]->Width(), m_renderTargets[0]->Height(), |
| m_renderTargets[0]->CreateInfo().mipLevels, 1, |
| m_renderTargets[0]->Format(), m_renderTargets[0]->Usage()); |
| |
| vkt::Image render_target(*m_device, render_target_ci, vkt::set_layout); |
| vkt::ImageView render_target_view = render_target.CreateView(VK_IMAGE_VIEW_TYPE_2D, 0, 1, 0, render_target_ci.arrayLayers); |
| |
| VkCommandBufferAllocateInfo secondary_cmd_buffer_alloc_info = vku::InitStructHelper(); |
| secondary_cmd_buffer_alloc_info.commandPool = m_command_pool; |
| secondary_cmd_buffer_alloc_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY; |
| secondary_cmd_buffer_alloc_info.commandBufferCount = 1; |
| |
| vkt::CommandBuffer secondary_cmd_buffer(*m_device, secondary_cmd_buffer_alloc_info); |
| |
| uint32_t color_attachment_indices[1] = {1}; |
| uint32_t invalid_color_attachment_indices[1] = {0}; |
| |
| const uint32_t depth_attachment_index = VK_ATTACHMENT_UNUSED; |
| const uint32_t stencil_attachment_index = VK_ATTACHMENT_UNUSED; |
| const uint32_t invalid_depth_attachment_index = 0; |
| const uint32_t invalid_stencil_attachment_index = 0; |
| |
| VkRenderingInputAttachmentIndexInfo rendering_input_attachment_index_info = vku::InitStructHelper{}; |
| rendering_input_attachment_index_info.colorAttachmentCount = 1; |
| rendering_input_attachment_index_info.pColorAttachmentInputIndices = color_attachment_indices; |
| rendering_input_attachment_index_info.pDepthInputAttachmentIndex = &depth_attachment_index; |
| rendering_input_attachment_index_info.pStencilInputAttachmentIndex = &stencil_attachment_index; |
| |
| VkRenderingInputAttachmentIndexInfo invalid_rendering_input_attachment_index_info = vku::InitStructHelper{}; |
| invalid_rendering_input_attachment_index_info.colorAttachmentCount = 1; |
| invalid_rendering_input_attachment_index_info.pColorAttachmentInputIndices = color_attachment_indices; |
| invalid_rendering_input_attachment_index_info.pDepthInputAttachmentIndex = &depth_attachment_index; |
| invalid_rendering_input_attachment_index_info.pStencilInputAttachmentIndex = &stencil_attachment_index; |
| |
| VkCommandBufferInheritanceRenderingInfo inheritance_rendering_info = |
| vku::InitStructHelper(&invalid_rendering_input_attachment_index_info); |
| inheritance_rendering_info.colorAttachmentCount = 1; |
| inheritance_rendering_info.pColorAttachmentFormats = &render_target_ci.format; |
| inheritance_rendering_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; |
| VkCommandBufferInheritanceInfo cmd_buffer_inheritance_info = vku::InitStructHelper(&inheritance_rendering_info); |
| |
| VkCommandBufferBeginInfo secondary_cmd_buffer_begin_info = vku::InitStructHelper{}; |
| secondary_cmd_buffer_begin_info.flags = |
| VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; |
| secondary_cmd_buffer_begin_info.pInheritanceInfo = &cmd_buffer_inheritance_info; |
| |
| VkRenderingAttachmentInfo color_attachment_info = vku::InitStructHelper{}; |
| color_attachment_info.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| color_attachment_info.imageView = render_target_view; |
| |
| VkClearRect clear_rect = {{{0, 0}, {m_width, m_height}}, 0, 1}; |
| |
| VkRenderingInfo begin_rendering_info = vku::InitStructHelper{}; |
| begin_rendering_info.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT; |
| begin_rendering_info.renderArea = clear_rect.rect; |
| begin_rendering_info.layerCount = 1; |
| begin_rendering_info.colorAttachmentCount = 1; |
| begin_rendering_info.pColorAttachments = &color_attachment_info; |
| |
| const auto begin_record_and_verify_cmd_buffers = [&](const VkCommandBufferBeginInfo &commandBufferBeginInfo) { |
| secondary_cmd_buffer.Begin(&commandBufferBeginInfo); |
| secondary_cmd_buffer.End(); |
| |
| m_command_buffer.Begin(); |
| m_command_buffer.BeginRendering(begin_rendering_info); |
| |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &rendering_input_attachment_index_info); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdExecuteCommands-pCommandBuffers-09505"); |
| vk::CmdExecuteCommands(m_command_buffer, 1, &secondary_cmd_buffer.handle()); |
| m_errorMonitor->VerifyFound(); |
| |
| m_command_buffer.EndRendering(); |
| m_command_buffer.End(); |
| }; |
| |
| // Force invalid colorAttachmentCount |
| invalid_rendering_input_attachment_index_info.colorAttachmentCount = 0; |
| |
| begin_record_and_verify_cmd_buffers(secondary_cmd_buffer_begin_info); |
| |
| // Force colorAttachmentIndices mismatch. |
| invalid_rendering_input_attachment_index_info.colorAttachmentCount = 1; |
| invalid_rendering_input_attachment_index_info.pColorAttachmentInputIndices = invalid_color_attachment_indices; |
| |
| begin_record_and_verify_cmd_buffers(secondary_cmd_buffer_begin_info); |
| |
| // Force pDepthInputAttachmentIndex mismatch |
| invalid_rendering_input_attachment_index_info.pColorAttachmentInputIndices = color_attachment_indices; |
| invalid_rendering_input_attachment_index_info.pDepthInputAttachmentIndex = &invalid_depth_attachment_index; |
| |
| begin_record_and_verify_cmd_buffers(secondary_cmd_buffer_begin_info); |
| |
| // Force pStencilInputAttachmentIndex mismatch |
| invalid_rendering_input_attachment_index_info.pDepthInputAttachmentIndex = &depth_attachment_index; |
| invalid_rendering_input_attachment_index_info.pStencilInputAttachmentIndex = &invalid_stencil_attachment_index; |
| |
| begin_record_and_verify_cmd_buffers(secondary_cmd_buffer_begin_info); |
| } |
| |
| TEST_F(NegativeDynamicRenderingLocalRead, CmdDrawColorIndexESOEnabled) { |
| TEST_DESCRIPTION( |
| "Validate that mapping is not applied in CmdDraw call if rendering is not started by vkCmdBeginRendering (when " |
| "VK_EXT_shader_object is enabled on the device"); |
| AddRequiredExtensions(VK_EXT_SHADER_OBJECT_EXTENSION_NAME); |
| AddRequiredFeature(vkt::Feature::shaderObject); |
| RETURN_IF_SKIP(InitBasicDynamicRenderingLocalRead()); |
| |
| VkFormat color_formats[] = {VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED}; |
| uint32_t locations[] = {0, 1}; |
| uint32_t inputs[] = {0, 1, 0}; |
| |
| VkRenderingInputAttachmentIndexInfo inputs_info = vku::InitStructHelper(); |
| inputs_info.colorAttachmentCount = 2; |
| inputs_info.pColorAttachmentInputIndices = inputs; |
| |
| VkRenderingAttachmentLocationInfo locations_info = vku::InitStructHelper(&inputs_info); |
| locations_info.colorAttachmentCount = 2; |
| locations_info.pColorAttachmentLocations = locations; |
| |
| VkPipelineRenderingCreateInfo pipeline_rendering_info = vku::InitStructHelper(&locations_info); |
| pipeline_rendering_info.colorAttachmentCount = 2; |
| pipeline_rendering_info.pColorAttachmentFormats = color_formats; |
| |
| std::vector<VkPipelineColorBlendAttachmentState> color_blend_attachments(2); |
| VkPipelineColorBlendStateCreateInfo cbi = vku::InitStructHelper(); |
| cbi.attachmentCount = 2u; |
| cbi.pAttachments = color_blend_attachments.data(); |
| |
| CreatePipelineHelper pipe(*this, &pipeline_rendering_info); |
| pipe.gp_ci_.renderPass = VK_NULL_HANDLE; |
| pipe.gp_ci_.pColorBlendState = &cbi; |
| pipe.CreateGraphicsPipeline(); |
| |
| VkRenderingAttachmentInfo color_attachment[2] = {vku::InitStructHelper(), vku::InitStructHelper()}; |
| color_attachment[0].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| color_attachment[1].imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
| |
| m_command_buffer.Begin(); |
| vk::CmdBindPipeline(m_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); |
| |
| VkRenderingInfo rendering_info = vku::InitStructHelper(); |
| rendering_info.renderArea = {{0, 0}, {32, 32}}; |
| rendering_info.layerCount = 1; |
| rendering_info.colorAttachmentCount = 2; |
| rendering_info.pColorAttachments = &color_attachment[0]; |
| |
| m_command_buffer.BeginRendering(rendering_info); |
| |
| VkRenderingAttachmentLocationInfo location_info = vku::InitStructHelper(); |
| location_info.colorAttachmentCount = 2; |
| location_info.pColorAttachmentLocations = locations; |
| |
| VkRenderingInputAttachmentIndexInfo input_info = vku::InitStructHelper(); |
| input_info.colorAttachmentCount = 2; |
| input_info.pColorAttachmentInputIndices = &inputs[1]; |
| |
| vk::CmdSetRenderingAttachmentLocationsKHR(m_command_buffer, &location_info); |
| vk::CmdSetRenderingInputAttachmentIndicesKHR(m_command_buffer, &input_info); |
| |
| m_errorMonitor->SetDesiredError("VUID-vkCmdDraw-None-09549"); |
| vk::CmdDraw(m_command_buffer, 3, 1, 0, 0); |
| m_errorMonitor->VerifyFound(); |
| } |