diff --git a/src/Magnum/Vk/Buffer.h b/src/Magnum/Vk/Buffer.h index d43074e02..1483b5242 100644 --- a/src/Magnum/Vk/Buffer.h +++ b/src/Magnum/Vk/Buffer.h @@ -155,8 +155,7 @@ class MAGNUM_VK_EXPORT Buffer { auto cmdFullCopyTo(Image& dest) { const VkBuffer source = _buffer; - const UnsignedInt size = _size; - return [source, &dest, size](VkCommandBuffer cmdBuffer){ + return [source, &dest](VkCommandBuffer cmdBuffer){ VkBufferImageCopy copy{}; copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy.imageSubresource.mipLevel = 0; diff --git a/src/Magnum/Vk/DescriptorSet.h b/src/Magnum/Vk/DescriptorSet.h index d75dd9209..918b5307f 100644 --- a/src/Magnum/Vk/DescriptorSet.h +++ b/src/Magnum/Vk/DescriptorSet.h @@ -166,49 +166,42 @@ class MAGNUM_VK_EXPORT DescriptorSet { class MAGNUM_VK_EXPORT DescriptorSetUpdate { public: - DescriptorSetUpdate() { - _buffers.reserve(4); - _images.reserve(4); - _writes.reserve(8); - } + DescriptorSetUpdate(Device& device, DescriptorSet& descriptorSet, + std::initializer_list>> buffers, + std::initializer_list>> images): + _images{Containers::NoInit, images.size()}, + _buffers{Containers::NoInit, buffers.size()}, + _writes{Containers::NoInit, images.size() + buffers.size()} + { - void run(Device& device) { - if(_writes.empty()) { - return; + UnsignedInt dstArrayElement = 0; + Int i = 0; /* Image index */ + Int b = 0; /* Buffer index */ + Int w = 0; /* Write index */ + for(auto& buf : buffers) { + _buffers[b] = buf.second.get().getDescriptor(); + _writes[w] = VkWriteDescriptorSet{ + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, descriptorSet, buf.first, dstArrayElement, 1, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, nullptr, &_buffers[b], nullptr}; + ++b, ++w; } - // TODO: Error check? - vkUpdateDescriptorSets(device, UnsignedInt(_writes.size()), _writes.data(), 0, NULL); - } - DescriptorSetUpdate& useDescriptorSet(DescriptorSet& ds) { - _descriptorSet = &ds; - return *this; - } - - DescriptorSetUpdate& bindUniformBuffer(Buffer& buffer, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { - 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; - } + for(auto& tex : images) { + _images[i] = tex.second.get().getDescriptor(); + _writes[w] = VkWriteDescriptorSet{ + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, descriptorSet, tex.first, dstArrayElement, 1, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &_images[i], nullptr, nullptr}; + ++i, ++w; + } - DescriptorSetUpdate& bindTexture(Vk::Texture& texture, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { - 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; + vkUpdateDescriptorSets(device, UnsignedInt(_writes.size()), _writes.data(), 0, nullptr); } private: - std::vector _images; - std::vector _buffers; - std::vector _bufferViews; + Containers::Array _images; + Containers::Array _buffers; - std::vector _writes; - // TODO copies - DescriptorSet* _descriptorSet; + Containers::Array _writes; }; }} diff --git a/src/Magnum/Vk/Image.h b/src/Magnum/Vk/Image.h index 54f4bec8c..efcb33e8e 100644 --- a/src/Magnum/Vk/Image.h +++ b/src/Magnum/Vk/Image.h @@ -127,6 +127,7 @@ class MAGNUM_VK_EXPORT Image { image.samples = VK_SAMPLE_COUNT_1_BIT; image.mipLevels = 1; image.arrayLayers = 1; + image.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; image.tiling = VK_IMAGE_TILING_OPTIMAL; image.usage = UnsignedInt(usage); image.sharingMode = VK_SHARING_MODE_EXCLUSIVE; diff --git a/src/Magnum/Vk/Pipeline.h b/src/Magnum/Vk/Pipeline.h index 1b43b0582..b9373198b 100644 --- a/src/Magnum/Vk/Pipeline.h +++ b/src/Magnum/Vk/Pipeline.h @@ -206,7 +206,7 @@ class MAGNUM_VK_EXPORT Pipeline { /** @brief Graphics pipeline builder -Contains properties to create a @ref Pipeline. While the pipeline cannot be changed after it is created, +Contains properties to create a @ref Pipeline. While the pipeline cannot be changed after it is created, the pipeline builder can be used to create another one. */ class MAGNUM_VK_EXPORT GraphicsPipelineBuilder { @@ -246,7 +246,7 @@ class MAGNUM_VK_EXPORT GraphicsPipelineBuilder { VK_CULL_MODE_NONE, /* cull mode */ VK_FRONT_FACE_COUNTER_CLOCKWISE, /* front face */ VK_FALSE, /* depth bias enable */ - 0.0f, 0.0f, 0.0f, 0.0f + 0.0f, 0.0f, 0.0f, 1.0f }; VkPipelineColorBlendAttachmentState blendAttachmentState = { @@ -328,6 +328,16 @@ class MAGNUM_VK_EXPORT GraphicsPipelineBuilder { return *this; } + GraphicsPipelineBuilder& enableRasterizerDiscard(bool b) { + _rasterizationState.rasterizerDiscardEnable = b; + return *this; + } + + GraphicsPipelineBuilder& setCullMode(VkCullModeFlags mode) { + _rasterizationState.cullMode = mode; + return *this; + } + GraphicsPipelineBuilder& setDynamicStates(std::initializer_list states) { _dynamicStates = std::vector(states); return *this; diff --git a/src/Magnum/Vk/RenderPass.h b/src/Magnum/Vk/RenderPass.h index 8b0b1d454..df1592c58 100644 --- a/src/Magnum/Vk/RenderPass.h +++ b/src/Magnum/Vk/RenderPass.h @@ -49,6 +49,7 @@ class MAGNUM_VK_EXPORT RenderPass { VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; VkAttachmentDescription attachments[2]; + attachments[0].flags = 0; attachments[0].format = VK_FORMAT_B8G8R8A8_UNORM; attachments[0].samples = sampleCount; attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; @@ -58,6 +59,7 @@ class MAGNUM_VK_EXPORT RenderPass { attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[1].flags = 0; attachments[1].format = VkFormat(depthFormat); attachments[1].samples = sampleCount; attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;