diff --git a/src/Magnum/Vk/Buffer.h b/src/Magnum/Vk/Buffer.h index 5e3e77da2..d43074e02 100644 --- a/src/Magnum/Vk/Buffer.h +++ b/src/Magnum/Vk/Buffer.h @@ -82,7 +82,12 @@ class MAGNUM_VK_EXPORT Buffer { Buffer(const Buffer&) = delete; /** @brief Move constructor */ - Buffer(Buffer&& other); + Buffer(Buffer&& other) { + _device = other._device; + other._device = nullptr; + std::swap(_buffer, other._buffer); + std::swap(_size, other._size); + } /** * @brief Destructor @@ -152,7 +157,7 @@ class MAGNUM_VK_EXPORT Buffer { const VkBuffer source = _buffer; const UnsignedInt size = _size; return [source, &dest, size](VkCommandBuffer cmdBuffer){ - VkBufferImageCopy copy; + VkBufferImageCopy copy{}; copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy.imageSubresource.mipLevel = 0; copy.imageSubresource.baseArrayLayer = 0; diff --git a/src/Magnum/Vk/DescriptorSet.h b/src/Magnum/Vk/DescriptorSet.h index 182e23ad6..d75dd9209 100644 --- a/src/Magnum/Vk/DescriptorSet.h +++ b/src/Magnum/Vk/DescriptorSet.h @@ -166,6 +166,12 @@ class MAGNUM_VK_EXPORT DescriptorSet { class MAGNUM_VK_EXPORT DescriptorSetUpdate { public: + DescriptorSetUpdate() { + _buffers.reserve(4); + _images.reserve(4); + _writes.reserve(8); + } + void run(Device& device) { if(_writes.empty()) { return; @@ -180,14 +186,16 @@ class MAGNUM_VK_EXPORT DescriptorSetUpdate { } DescriptorSetUpdate& bindUniformBuffer(Buffer& buffer, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { - _buffers.push_back(buffer.getDescriptor()); + const VkDescriptorBufferInfo descriptor = buffer.getDescriptor(); + _buffers.push_back(descriptor); _writes.push_back(VkWriteDescriptorSet{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, *_descriptorSet, dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, nullptr, &_buffers.back(), nullptr}); return *this; } DescriptorSetUpdate& bindTexture(Vk::Texture& texture, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { - _images.push_back(texture.getDescriptor()); + const VkDescriptorImageInfo descriptor = texture.getDescriptor(); + _images.push_back(descriptor); _writes.push_back(VkWriteDescriptorSet{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, *_descriptorSet, dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &_images.back(), nullptr, nullptr}); return *this; diff --git a/src/Magnum/Vk/Image.cpp b/src/Magnum/Vk/Image.cpp index 343214d1f..b1a15b21a 100644 --- a/src/Magnum/Vk/Image.cpp +++ b/src/Magnum/Vk/Image.cpp @@ -30,6 +30,7 @@ #include "Magnum/Vk/CommandBuffer.h" #include "Magnum/Vk/CommandPool.h" #include "Magnum/Vk/DeviceMemory.h" +#include "Magnum/Vk/Pipeline.h" #include "Magnum/Vk/Queue.h" namespace Magnum { namespace Vk { @@ -64,9 +65,18 @@ Image& Image::update(Queue& queue, CommandPool& pool, const void* sourceData, Un std::memcpy(data, sourceData, stagingBuffer.size()); stagingMemory->unmap(); + VkImageSubresourceRange range{}; + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.levelCount = 1; + range.baseArrayLayer = 0; + range.layerCount = 1; + ImageMemoryBarrier transferBarrier{*this, ImageLayout::Undefined, ImageLayout::TransferDstOptimal, range, {}, {Access::TransferWrite}}; + ImageMemoryBarrier endBarrier{*this, ImageLayout::TransferDstOptimal, ImageLayout::ShaderReadOnlyOptimal, range, {Access::TransferWrite}, {Access::ShaderRead}}; + *copyToDeviceCmds << Vk::Cmd::begin() - << Vk::Cmd::imageMemoryk + << Vk::Cmd::pipelineBarrier(PipelineStage::TopOfPipe, PipelineStage::TopOfPipe, {}, {}, {transferBarrier}) << stagingBuffer.cmdFullCopyTo(*this) + << Vk::Cmd::pipelineBarrier(PipelineStage::TopOfPipe, PipelineStage::TopOfPipe, {}, {}, {endBarrier}) << Vk::Cmd::end(); queue.submit(*copyToDeviceCmds).waitIdle(); diff --git a/src/Magnum/Vk/Instance.h b/src/Magnum/Vk/Instance.h index f62c07a72..f3b2e5ee1 100644 --- a/src/Magnum/Vk/Instance.h +++ b/src/Magnum/Vk/Instance.h @@ -59,6 +59,7 @@ enum class Version: UnsignedInt { Error() << "(File:" << __FILE__ \ << ", Line:" << __LINE__ \ << ") Vulkan error:" << Vk::Result(r); \ + abort(); \ } \ } while(false) diff --git a/src/Magnum/Vk/Pipeline.h b/src/Magnum/Vk/Pipeline.h index 0245fbafa..1b43b0582 100644 --- a/src/Magnum/Vk/Pipeline.h +++ b/src/Magnum/Vk/Pipeline.h @@ -90,7 +90,7 @@ enum class PrimitiveTopology: UnsignedInt { Describes pipeline stages. */ enum class PipelineStage: UnsignedInt { - TopOfThePipe = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + TopOfPipe = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, DrawIndirect = VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VertexInput = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VertexShader = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, diff --git a/src/Magnum/Vk/Texture.h b/src/Magnum/Vk/Texture.h index 04f67251e..186a69201 100644 --- a/src/Magnum/Vk/Texture.h +++ b/src/Magnum/Vk/Texture.h @@ -51,7 +51,7 @@ class MAGNUM_VK_EXPORT Texture { Texture(Device& device, std::unique_ptr&& imageView, ImageLayout layout, Int numMipLevels): _device{device}, _imageView{std::move(imageView)}, - _imageLayout{VkImageLayout(layout)}, + _imageLayout{layout}, _mipLevels{numMipLevels} { int mipLevels = 0; @@ -107,12 +107,12 @@ class MAGNUM_VK_EXPORT Texture { return _mipLevels; } - VkImageLayout imageLayout() const { + ImageLayout imageLayout() const { return _imageLayout; } VkDescriptorImageInfo getDescriptor() const { - return VkDescriptorImageInfo{_sampler, *_imageView, _imageLayout}; + return VkDescriptorImageInfo{_sampler, *_imageView, VkImageLayout(_imageLayout)}; } private: @@ -120,7 +120,7 @@ class MAGNUM_VK_EXPORT Texture { VkSampler _sampler; std::unique_ptr _imageView; - VkImageLayout _imageLayout; + ImageLayout _imageLayout; Int _mipLevels; };