|
|
|
@ -15,17 +15,13 @@ namespace Vulkan { |
|
|
|
class VKDevice; |
|
|
|
class VKScheduler; |
|
|
|
|
|
|
|
class DescriptorUpdateEntry { |
|
|
|
public: |
|
|
|
explicit DescriptorUpdateEntry() {} |
|
|
|
|
|
|
|
DescriptorUpdateEntry(VkDescriptorImageInfo image) : image{image} {} |
|
|
|
struct DescriptorUpdateEntry { |
|
|
|
DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {} |
|
|
|
|
|
|
|
DescriptorUpdateEntry(VkDescriptorBufferInfo buffer) : buffer{buffer} {} |
|
|
|
DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {} |
|
|
|
|
|
|
|
DescriptorUpdateEntry(VkBufferView texel_buffer) : texel_buffer{texel_buffer} {} |
|
|
|
DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {} |
|
|
|
|
|
|
|
private: |
|
|
|
union { |
|
|
|
VkDescriptorImageInfo image; |
|
|
|
VkDescriptorBufferInfo buffer; |
|
|
|
@ -45,32 +41,34 @@ public: |
|
|
|
void Send(VkDescriptorUpdateTemplateKHR update_template, VkDescriptorSet set); |
|
|
|
|
|
|
|
void AddSampledImage(VkSampler sampler, VkImageView image_view) { |
|
|
|
entries.emplace_back(VkDescriptorImageInfo{sampler, image_view, {}}); |
|
|
|
payload.emplace_back(VkDescriptorImageInfo{sampler, image_view, {}}); |
|
|
|
} |
|
|
|
|
|
|
|
void AddImage(VkImageView image_view) { |
|
|
|
entries.emplace_back(VkDescriptorImageInfo{{}, image_view, {}}); |
|
|
|
payload.emplace_back(VkDescriptorImageInfo{{}, image_view, {}}); |
|
|
|
} |
|
|
|
|
|
|
|
void AddBuffer(VkBuffer buffer, u64 offset, std::size_t size) { |
|
|
|
entries.emplace_back(VkDescriptorBufferInfo{buffer, offset, size}); |
|
|
|
payload.emplace_back(VkDescriptorBufferInfo{buffer, offset, size}); |
|
|
|
} |
|
|
|
|
|
|
|
void AddTexelBuffer(VkBufferView texel_buffer) { |
|
|
|
entries.emplace_back(texel_buffer); |
|
|
|
payload.emplace_back(texel_buffer); |
|
|
|
} |
|
|
|
|
|
|
|
VkImageLayout* GetLastImageLayout() { |
|
|
|
return &std::get<VkDescriptorImageInfo>(entries.back()).imageLayout; |
|
|
|
VkImageLayout* LastImageLayout() { |
|
|
|
return &payload.back().image.imageLayout; |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
using Variant = std::variant<VkDescriptorImageInfo, VkDescriptorBufferInfo, VkBufferView>; |
|
|
|
const VkImageLayout* LastImageLayout() const { |
|
|
|
return &payload.back().image.imageLayout; |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
const VKDevice& device; |
|
|
|
VKScheduler& scheduler; |
|
|
|
|
|
|
|
boost::container::static_vector<Variant, 0x400> entries; |
|
|
|
const DescriptorUpdateEntry* upload_start = nullptr; |
|
|
|
boost::container::static_vector<DescriptorUpdateEntry, 0x10000> payload; |
|
|
|
}; |
|
|
|
|
|
|
|
|