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;
/** @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;

12
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;

12
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();

1
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)

2
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,

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):
_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<Vk::ImageView> _imageView;
VkImageLayout _imageLayout;
ImageLayout _imageLayout;
Int _mipLevels;
};

Loading…
Cancel
Save