|
|
|
@ -166,49 +166,42 @@ class MAGNUM_VK_EXPORT DescriptorSet { |
|
|
|
|
|
|
|
|
|
|
|
class MAGNUM_VK_EXPORT DescriptorSetUpdate { |
|
|
|
class MAGNUM_VK_EXPORT DescriptorSetUpdate { |
|
|
|
public: |
|
|
|
public: |
|
|
|
DescriptorSetUpdate() { |
|
|
|
DescriptorSetUpdate(Device& device, DescriptorSet& descriptorSet, |
|
|
|
_buffers.reserve(4); |
|
|
|
std::initializer_list<std::pair<UnsignedInt, std::reference_wrapper<Buffer>>> buffers, |
|
|
|
_images.reserve(4); |
|
|
|
std::initializer_list<std::pair<UnsignedInt, std::reference_wrapper<Texture>>> images): |
|
|
|
_writes.reserve(8); |
|
|
|
_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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Error check?
|
|
|
|
|
|
|
|
vkUpdateDescriptorSets(device, UnsignedInt(_writes.size()), _writes.data(), 0, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DescriptorSetUpdate& useDescriptorSet(DescriptorSet& ds) { |
|
|
|
UnsignedInt dstArrayElement = 0; |
|
|
|
_descriptorSet = &ds; |
|
|
|
Int i = 0; /* Image index */ |
|
|
|
return *this; |
|
|
|
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; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DescriptorSetUpdate& bindUniformBuffer(Buffer& buffer, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { |
|
|
|
for(auto& tex : images) { |
|
|
|
const VkDescriptorBufferInfo descriptor = buffer.getDescriptor(); |
|
|
|
_images[i] = tex.second.get().getDescriptor(); |
|
|
|
_buffers.push_back(descriptor); |
|
|
|
_writes[w] = VkWriteDescriptorSet{ |
|
|
|
_writes.push_back(VkWriteDescriptorSet{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, *_descriptorSet, |
|
|
|
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, descriptorSet, tex.first, dstArrayElement, 1, |
|
|
|
dstBinding, dstArrayElement, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, nullptr, &_buffers.back(), nullptr}); |
|
|
|
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &_images[i], nullptr, nullptr}; |
|
|
|
return *this; |
|
|
|
++i, ++w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DescriptorSetUpdate& bindTexture(Vk::Texture& texture, UnsignedInt dstBinding, UnsignedInt dstArrayElement=0) { |
|
|
|
vkUpdateDescriptorSets(device, UnsignedInt(_writes.size()), _writes.data(), 0, nullptr); |
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
std::vector<VkDescriptorImageInfo> _images; |
|
|
|
Containers::Array<VkDescriptorImageInfo> _images; |
|
|
|
std::vector<VkDescriptorBufferInfo> _buffers; |
|
|
|
Containers::Array<VkDescriptorBufferInfo> _buffers; |
|
|
|
std::vector<VkBufferView> _bufferViews; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<VkWriteDescriptorSet> _writes; |
|
|
|
Containers::Array<VkWriteDescriptorSet> _writes; |
|
|
|
// TODO copies
|
|
|
|
|
|
|
|
DescriptorSet* _descriptorSet; |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
}} |
|
|
|
}} |
|
|
|
|