From 9abdce52b42d05b80c3400f5b0fe5ff2fec67e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 23 Jan 2021 15:59:05 +0100 Subject: [PATCH] Vk: ImageMemoryBarrier constructor with implicit aspects. Realizing some annoyances as I write docs. --- src/Magnum/Vk/Pipeline.cpp | 3 +++ src/Magnum/Vk/Pipeline.h | 9 +++++++++ src/Magnum/Vk/Test/PipelineTest.cpp | 24 ++++++++++++++++++++++++ src/Magnum/Vk/Test/PipelineVkTest.cpp | 4 ++-- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Vk/Pipeline.cpp b/src/Magnum/Vk/Pipeline.cpp index 54e0e837a..d3b749fac 100644 --- a/src/Magnum/Vk/Pipeline.cpp +++ b/src/Magnum/Vk/Pipeline.cpp @@ -29,6 +29,7 @@ #include #include "Magnum/Vk/Device.h" +#include "Magnum/Vk/Image.h" namespace Magnum { namespace Vk { @@ -75,6 +76,8 @@ ImageMemoryBarrier::ImageMemoryBarrier(const Accesses sourceAccesses, const Acce _barrier.subresourceRange.layerCount = layerCount; } +ImageMemoryBarrier::ImageMemoryBarrier(const Accesses sourceAccesses, const Accesses destinationAccesses, const ImageLayout oldLayout, const ImageLayout newLayout, Image& image, const UnsignedInt layerOffset, const UnsignedInt layerCount, const UnsignedInt levelOffset, const UnsignedInt levelCount): ImageMemoryBarrier{sourceAccesses, destinationAccesses, oldLayout, newLayout, image, imageAspectsFor(image.format()), layerOffset, layerCount, levelOffset, levelCount} {} + ImageMemoryBarrier::ImageMemoryBarrier(NoInitT) noexcept {} ImageMemoryBarrier::ImageMemoryBarrier(const VkImageMemoryBarrier& barrier): diff --git a/src/Magnum/Vk/Pipeline.h b/src/Magnum/Vk/Pipeline.h index 065001509..f59646597 100644 --- a/src/Magnum/Vk/Pipeline.h +++ b/src/Magnum/Vk/Pipeline.h @@ -565,6 +565,15 @@ class MAGNUM_VK_EXPORT ImageMemoryBarrier { */ /*implicit*/ ImageMemoryBarrier(Accesses sourceAccesses, Accesses destinationAccesses, ImageLayout oldLayout, ImageLayout newLayout, VkImage image, ImageAspects aspects, UnsignedInt layerOffset = 0, UnsignedInt layerCount = VK_REMAINING_ARRAY_LAYERS, UnsignedInt levelOffset = 0, UnsignedInt levelCount = VK_REMAINING_MIP_LEVELS); + /** + * @brief Construct with an implicit image aspect + * + * Compared to @ref ImageMemoryBarrier(Accesses, Accesses, ImageLayout, ImageLayout, VkImage, ImageAspects, UnsignedInt, UnsignedInt, UnsignedInt, UnsignedInt) + * the @ref ImageAspects are chosen implicitly using + * @ref imageAspectsFor() from @ref Image::format(). + */ + /*implicit*/ ImageMemoryBarrier(Accesses sourceAccesses, Accesses destinationAccesses, ImageLayout oldLayout, ImageLayout newLayout, Image& image, UnsignedInt layerOffset = 0, UnsignedInt layerCount = VK_REMAINING_ARRAY_LAYERS, UnsignedInt levelOffset = 0, UnsignedInt levelCount = VK_REMAINING_MIP_LEVELS); + /** * @brief Construct without initializing the contents * diff --git a/src/Magnum/Vk/Test/PipelineTest.cpp b/src/Magnum/Vk/Test/PipelineTest.cpp index c5edf0e9d..7527a4e22 100644 --- a/src/Magnum/Vk/Test/PipelineTest.cpp +++ b/src/Magnum/Vk/Test/PipelineTest.cpp @@ -26,8 +26,10 @@ #include #include +#include "Magnum/Vk/Device.h" #include "Magnum/Vk/Image.h" #include "Magnum/Vk/Pipeline.h" +#include "Magnum/Vk/PixelFormat.h" namespace Magnum { namespace Vk { namespace Test { namespace { @@ -43,6 +45,7 @@ struct PipelineTest: TestSuite::Tester { void bufferMemoryBarrierConstructFromVk(); void imageMemoryBarrierConstruct(); + void imageMemoryBarrierConstructImplicitAspect(); void imageMemoryBarrierConstructNoInit(); void imageMemoryBarrierConstructFromVk(); }; @@ -57,6 +60,7 @@ PipelineTest::PipelineTest() { &PipelineTest::bufferMemoryBarrierConstructFromVk, &PipelineTest::imageMemoryBarrierConstruct, + &PipelineTest::imageMemoryBarrierConstructImplicitAspect, &PipelineTest::imageMemoryBarrierConstructNoInit, &PipelineTest::imageMemoryBarrierConstructFromVk}); } @@ -130,6 +134,26 @@ void PipelineTest::imageMemoryBarrierConstruct() { CORRADE_COMPARE(barrier->subresourceRange.layerCount, 5); } +void PipelineTest::imageMemoryBarrierConstructImplicitAspect() { + Device device{NoCreate}; + Image image = Image::wrap(device, reinterpret_cast(0xdead), PixelFormat::Depth24UnormStencil8UI); + + ImageMemoryBarrier barrier{ + Access::ColorAttachmentRead, Access::TransferWrite, + ImageLayout::ColorAttachment, ImageLayout::TransferDestination, + image, 3, 5, 7, 9}; + CORRADE_COMPARE(barrier->srcAccessMask, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT); + CORRADE_COMPARE(barrier->dstAccessMask, VK_ACCESS_TRANSFER_WRITE_BIT); + CORRADE_COMPARE(barrier->oldLayout, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + CORRADE_COMPARE(barrier->newLayout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + CORRADE_COMPARE(barrier->image, reinterpret_cast(0xdead)); + CORRADE_COMPARE(barrier->subresourceRange.aspectMask, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT); + CORRADE_COMPARE(barrier->subresourceRange.baseMipLevel, 7); + CORRADE_COMPARE(barrier->subresourceRange.levelCount, 9); + CORRADE_COMPARE(barrier->subresourceRange.baseArrayLayer, 3); + CORRADE_COMPARE(barrier->subresourceRange.layerCount, 5); +} + void PipelineTest::imageMemoryBarrierConstructNoInit() { ImageMemoryBarrier barrier{NoInit}; barrier->sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2; diff --git a/src/Magnum/Vk/Test/PipelineVkTest.cpp b/src/Magnum/Vk/Test/PipelineVkTest.cpp index 8753f89a0..e27e91d8f 100644 --- a/src/Magnum/Vk/Test/PipelineVkTest.cpp +++ b/src/Magnum/Vk/Test/PipelineVkTest.cpp @@ -71,7 +71,7 @@ void PipelineVkTest::pipelineBarrier() { }, { {Access::TransferWrite, Access::ShaderRead, ImageLayout::Preinitialized, ImageLayout::ShaderReadOnly, - image, ImageAspect::Color} + image} }) .end(); @@ -129,7 +129,7 @@ void PipelineVkTest::pipelineBarrierImage() { .pipelineBarrier(PipelineStage::Transfer, PipelineStage::FragmentShader, { {Access::TransferWrite, Access::ShaderRead, ImageLayout::Preinitialized, ImageLayout::ShaderReadOnly, - image, ImageAspect::Color} + image} }) .end();