Browse Source

Vk: convenience cmd.pipelineBarrier() overloads.

Another thing I realized while writing docs, having to always put the
{}, {} things there is silly, and in many cases we need just one, not
all of them.
pull/494/head
Vladimír Vondruš 5 years ago
parent
commit
dc3502d921
  1. 33
      src/Magnum/Vk/CommandBuffer.h
  2. 24
      src/Magnum/Vk/Pipeline.cpp
  3. 66
      src/Magnum/Vk/Test/PipelineVkTest.cpp

33
src/Magnum/Vk/CommandBuffer.h

@ -393,6 +393,39 @@ class MAGNUM_VK_EXPORT CommandBuffer {
/** @overload */ /** @overload */
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list<MemoryBarrier> memoryBarriers, std::initializer_list<BufferMemoryBarrier> bufferMemoryBarriers, std::initializer_list<ImageMemoryBarrier> imageMemoryBarriers, DependencyFlags dependencyFlags = {}); CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list<MemoryBarrier> memoryBarriers, std::initializer_list<BufferMemoryBarrier> bufferMemoryBarriers, std::initializer_list<ImageMemoryBarrier> imageMemoryBarriers, DependencyFlags dependencyFlags = {});
/**
* @brief Insert a global memory dependency
* @return Reference to self (for method chaining)
*
* Equivalent to calling @ref pipelineBarrier(PipelineStages, PipelineStages, Containers::ArrayView<const MemoryBarrier>, Containers::ArrayView<const BufferMemoryBarrier>, Containers::ArrayView<const ImageMemoryBarrier>, DependencyFlags)
* with empty @p bufferBarriers and @p imageBarriers.
*/
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, Containers::ArrayView<const MemoryBarrier> memoryBarriers, DependencyFlags dependencyFlags = {});
/** @overload */
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list<MemoryBarrier> memoryBarriers, DependencyFlags dependencyFlags = {});
/**
* @brief Insert a buffer memory dependency
* @return Reference to self (for method chaining)
*
* Equivalent to calling @ref pipelineBarrier(PipelineStages, PipelineStages, Containers::ArrayView<const MemoryBarrier>, Containers::ArrayView<const BufferMemoryBarrier>, Containers::ArrayView<const ImageMemoryBarrier>, DependencyFlags)
* with empty @p memoryBarriers and @p imageBarriers.
*/
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, Containers::ArrayView<const BufferMemoryBarrier> bufferMemoryBarriers, DependencyFlags dependencyFlags = {});
/** @overload */
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list<BufferMemoryBarrier> bufferMemoryBarriers, DependencyFlags dependencyFlags = {});
/**
* @brief Insert an image memory dependency
* @return Reference to self (for method chaining)
*
* Equivalent to calling @ref pipelineBarrier(PipelineStages, PipelineStages, Containers::ArrayView<const MemoryBarrier>, Containers::ArrayView<const BufferMemoryBarrier>, Containers::ArrayView<const ImageMemoryBarrier>, DependencyFlags)
* with empty @p memoryBarriers and @p bufferBarriers.
*/
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, Containers::ArrayView<const ImageMemoryBarrier> imageMemoryBarriers, DependencyFlags dependencyFlags = {});
/** @overload */
CommandBuffer& pipelineBarrier(PipelineStages sourceStages, PipelineStages destinationStages, std::initializer_list<ImageMemoryBarrier> imageMemoryBarriers, DependencyFlags dependencyFlags = {});
private: private:
friend CommandPool; friend CommandPool;
friend Implementation::DeviceState; friend Implementation::DeviceState;

24
src/Magnum/Vk/Pipeline.cpp

@ -98,4 +98,28 @@ CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages,
return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(memoryBarriers), Containers::arrayView(bufferMemoryBarriers), Containers::arrayView(imageMemoryBarriers), dependencyFlags); return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(memoryBarriers), Containers::arrayView(bufferMemoryBarriers), Containers::arrayView(imageMemoryBarriers), dependencyFlags);
} }
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const Containers::ArrayView<const MemoryBarrier> memoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, memoryBarriers, {}, {}, dependencyFlags);
}
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const std::initializer_list<MemoryBarrier> memoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(memoryBarriers), dependencyFlags);
}
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const Containers::ArrayView<const BufferMemoryBarrier> bufferMemoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, {}, bufferMemoryBarriers, {}, dependencyFlags);
}
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const std::initializer_list<BufferMemoryBarrier> bufferMemoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(bufferMemoryBarriers), dependencyFlags);
}
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const Containers::ArrayView<const ImageMemoryBarrier> imageMemoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, {}, {}, imageMemoryBarriers, dependencyFlags);
}
CommandBuffer& CommandBuffer::pipelineBarrier(const PipelineStages sourceStages, const PipelineStages destinationStages, const std::initializer_list<ImageMemoryBarrier> imageMemoryBarriers, const DependencyFlags dependencyFlags) {
return pipelineBarrier(sourceStages, destinationStages, Containers::arrayView(imageMemoryBarriers), dependencyFlags);
}
}} }}

66
src/Magnum/Vk/Test/PipelineVkTest.cpp

@ -38,10 +38,16 @@ struct PipelineVkTest: VulkanTester {
explicit PipelineVkTest(); explicit PipelineVkTest();
void pipelineBarrier(); void pipelineBarrier();
void pipelineBarrierGeneral();
void pipelineBarrierBuffer();
void pipelineBarrierImage();
}; };
PipelineVkTest::PipelineVkTest() { PipelineVkTest::PipelineVkTest() {
addTests({&PipelineVkTest::pipelineBarrier}); addTests({&PipelineVkTest::pipelineBarrier,
&PipelineVkTest::pipelineBarrierGeneral,
&PipelineVkTest::pipelineBarrierBuffer,
&PipelineVkTest::pipelineBarrierImage});
} }
void PipelineVkTest::pipelineBarrier() { void PipelineVkTest::pipelineBarrier() {
@ -73,6 +79,64 @@ void PipelineVkTest::pipelineBarrier() {
CORRADE_VERIFY(true); CORRADE_VERIFY(true);
} }
void PipelineVkTest::pipelineBarrierGeneral() {
CommandPool pool{device(), CommandPoolCreateInfo{
device().properties().pickQueueFamily(QueueFlag::Graphics)}};
/* A subset of the above, just to test the convenience overloads */
pool.allocate()
.begin()
.pipelineBarrier(PipelineStage::Transfer, PipelineStage::Host, {
{Access::TransferWrite, Access::HostRead}
})
.end();
/* Does not do anything visible, so just test that it didn't blow up */
CORRADE_VERIFY(true);
}
void PipelineVkTest::pipelineBarrierBuffer() {
CommandPool pool{device(), CommandPoolCreateInfo{
device().properties().pickQueueFamily(QueueFlag::Graphics)}};
Buffer buffer{device(), BufferCreateInfo{
BufferUsage::TransferDestination|BufferUsage::VertexBuffer, 16
}, MemoryFlag::DeviceLocal};
pool.allocate()
.begin()
.pipelineBarrier(PipelineStage::Transfer, PipelineStage::VertexInput, {
{Access::TransferWrite, Access::VertexAttributeRead, buffer}
})
.end();
/* Does not do anything visible, so just test that it didn't blow up */
CORRADE_VERIFY(true);
}
void PipelineVkTest::pipelineBarrierImage() {
CommandPool pool{device(), CommandPoolCreateInfo{
device().properties().pickQueueFamily(QueueFlag::Graphics)}};
Image image{device(), ImageCreateInfo2D{
ImageUsage::TransferDestination|ImageUsage::Sampled,
PixelFormat::RGBA8Unorm, {4, 4}, 1
}, MemoryFlag::DeviceLocal};
pool.allocate()
.begin()
.pipelineBarrier(PipelineStage::Transfer, PipelineStage::FragmentShader, {
{Access::TransferWrite, Access::ShaderRead,
ImageLayout::Preinitialized, ImageLayout::ShaderReadOnly,
image, ImageAspect::Color}
})
.end();
/* Does not do anything visible, so just test that it didn't blow up */
CORRADE_VERIFY(true);
}
}}}} }}}}
CORRADE_TEST_MAIN(Magnum::Vk::Test::PipelineVkTest) CORRADE_TEST_MAIN(Magnum::Vk::Test::PipelineVkTest)

Loading…
Cancel
Save