Browse Source

'nother big chunk of code

Signed-off-by: Squareys <Squareys@googlemail.com>
pull/202/head
Squareys 10 years ago
parent
commit
f3e1bdbaa8
  1. 9
      src/Magnum/Vk/Buffer.h
  2. 12
      src/Magnum/Vk/DescriptorSet.h
  3. 12
      src/Magnum/Vk/Image.cpp
  4. 1
      src/Magnum/Vk/Instance.h
  5. 2
      src/Magnum/Vk/Pipeline.h
  6. 8
      src/Magnum/Vk/Texture.h

9
src/Magnum/Vk/Buffer.h

@ -82,7 +82,12 @@ class MAGNUM_VK_EXPORT Buffer {
Buffer(const Buffer&) = delete; Buffer(const Buffer&) = delete;
/** @brief Move constructor */ /** @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 * @brief Destructor
@ -152,7 +157,7 @@ class MAGNUM_VK_EXPORT Buffer {
const VkBuffer source = _buffer; const VkBuffer source = _buffer;
const UnsignedInt size = _size; const UnsignedInt size = _size;
return [source, &dest, size](VkCommandBuffer cmdBuffer){ return [source, &dest, size](VkCommandBuffer cmdBuffer){
VkBufferImageCopy copy; VkBufferImageCopy copy{};
copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
copy.imageSubresource.mipLevel = 0; copy.imageSubresource.mipLevel = 0;
copy.imageSubresource.baseArrayLayer = 0; copy.imageSubresource.baseArrayLayer = 0;

12
src/Magnum/Vk/DescriptorSet.h

@ -166,6 +166,12 @@ class MAGNUM_VK_EXPORT DescriptorSet {
class MAGNUM_VK_EXPORT DescriptorSetUpdate { class MAGNUM_VK_EXPORT DescriptorSetUpdate {
public: public:
DescriptorSetUpdate() {
_buffers.reserve(4);
_images.reserve(4);
_writes.reserve(8);
}
void run(Device& device) { void run(Device& device) {
if(_writes.empty()) { if(_writes.empty()) {
return; return;
@ -180,14 +186,16 @@ class MAGNUM_VK_EXPORT DescriptorSetUpdate {
} }
DescriptorSetUpdate& bindUniformBuffer(Buffer& buffer, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { 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, _writes.push_back(VkWriteDescriptorSet{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, *_descriptorSet,
dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, nullptr, &_buffers.back(), nullptr}); dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, nullptr, &_buffers.back(), nullptr});
return *this; return *this;
} }
DescriptorSetUpdate& bindTexture(Vk::Texture& texture, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { 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, _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}); dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &_images.back(), nullptr, nullptr});
return *this; return *this;

12
src/Magnum/Vk/Image.cpp

@ -30,6 +30,7 @@
#include "Magnum/Vk/CommandBuffer.h" #include "Magnum/Vk/CommandBuffer.h"
#include "Magnum/Vk/CommandPool.h" #include "Magnum/Vk/CommandPool.h"
#include "Magnum/Vk/DeviceMemory.h" #include "Magnum/Vk/DeviceMemory.h"
#include "Magnum/Vk/Pipeline.h"
#include "Magnum/Vk/Queue.h" #include "Magnum/Vk/Queue.h"
namespace Magnum { namespace Vk { 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()); std::memcpy(data, sourceData, stagingBuffer.size());
stagingMemory->unmap(); 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() *copyToDeviceCmds << Vk::Cmd::begin()
<< Vk::Cmd::imageMemoryk << Vk::Cmd::pipelineBarrier(PipelineStage::TopOfPipe, PipelineStage::TopOfPipe, {}, {}, {transferBarrier})
<< stagingBuffer.cmdFullCopyTo(*this) << stagingBuffer.cmdFullCopyTo(*this)
<< Vk::Cmd::pipelineBarrier(PipelineStage::TopOfPipe, PipelineStage::TopOfPipe, {}, {}, {endBarrier})
<< Vk::Cmd::end(); << Vk::Cmd::end();
queue.submit(*copyToDeviceCmds).waitIdle(); queue.submit(*copyToDeviceCmds).waitIdle();

1
src/Magnum/Vk/Instance.h

@ -59,6 +59,7 @@ enum class Version: UnsignedInt {
Error() << "(File:" << __FILE__ \ Error() << "(File:" << __FILE__ \
<< ", Line:" << __LINE__ \ << ", Line:" << __LINE__ \
<< ") Vulkan error:" << Vk::Result(r); \ << ") Vulkan error:" << Vk::Result(r); \
abort(); \
} \ } \
} while(false) } while(false)

2
src/Magnum/Vk/Pipeline.h

@ -90,7 +90,7 @@ enum class PrimitiveTopology: UnsignedInt {
Describes pipeline stages. Describes pipeline stages.
*/ */
enum class PipelineStage: UnsignedInt { 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, DrawIndirect = VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
VertexInput = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VertexInput = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
VertexShader = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VertexShader = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,

8
src/Magnum/Vk/Texture.h

@ -51,7 +51,7 @@ class MAGNUM_VK_EXPORT Texture {
Texture(Device& device, std::unique_ptr<ImageView>&& imageView, ImageLayout layout, Int numMipLevels): Texture(Device& device, std::unique_ptr<ImageView>&& imageView, ImageLayout layout, Int numMipLevels):
_device{device}, _device{device},
_imageView{std::move(imageView)}, _imageView{std::move(imageView)},
_imageLayout{VkImageLayout(layout)}, _imageLayout{layout},
_mipLevels{numMipLevels} _mipLevels{numMipLevels}
{ {
int mipLevels = 0; int mipLevels = 0;
@ -107,12 +107,12 @@ class MAGNUM_VK_EXPORT Texture {
return _mipLevels; return _mipLevels;
} }
VkImageLayout imageLayout() const { ImageLayout imageLayout() const {
return _imageLayout; return _imageLayout;
} }
VkDescriptorImageInfo getDescriptor() const { VkDescriptorImageInfo getDescriptor() const {
return VkDescriptorImageInfo{_sampler, *_imageView, _imageLayout}; return VkDescriptorImageInfo{_sampler, *_imageView, VkImageLayout(_imageLayout)};
} }
private: private:
@ -120,7 +120,7 @@ class MAGNUM_VK_EXPORT Texture {
VkSampler _sampler; VkSampler _sampler;
std::unique_ptr<Vk::ImageView> _imageView; std::unique_ptr<Vk::ImageView> _imageView;
VkImageLayout _imageLayout; ImageLayout _imageLayout;
Int _mipLevels; Int _mipLevels;
}; };

Loading…
Cancel
Save