summaryrefslogtreecommitdiff
path: root/src/vk/texture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vk/texture.cpp')
-rw-r--r--src/vk/texture.cpp103
1 files changed, 101 insertions, 2 deletions
diff --git a/src/vk/texture.cpp b/src/vk/texture.cpp
index 92ce5b5..063eb86 100644
--- a/src/vk/texture.cpp
+++ b/src/vk/texture.cpp
@@ -111,8 +111,7 @@ load_image(void *obj)
// Copy image from vulkan buffer into vulkan image.
{
- auto queue_family{
- cg_core.vk_device_with_swapchain->get_queue_family_with_presentation()};
+ auto queue_family = self->texture->queue_family;
auto queue{queue_family->get_queue()};
VK::CommandPool command_pool{queue_family, 1};
VkCommandBuffer vk_command_buffer{command_pool.command_buffers[0]};
@@ -419,6 +418,97 @@ const CommandChain text_loader{
{&load_view, &unload_view}
};
+void
+load_descriptor_set_pool(void *obj)
+{
+ auto self = static_cast<VK::Texture*>(obj);
+
+ std::array<VkDescriptorPoolSize, 1> descriptor_pool_sizes{};
+ descriptor_pool_sizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_pool_sizes[0].descriptorCount =
+ cg_core.vk_swapchain->images_count;
+
+ VkDescriptorPoolCreateInfo pool_info{};
+ pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ pool_info.pNext = nullptr;
+ pool_info.flags = 0;
+ pool_info.maxSets = cg_core.vk_swapchain->images_count;
+ pool_info.poolSizeCount = descriptor_pool_sizes.size();
+ pool_info.pPoolSizes = descriptor_pool_sizes.data();
+
+ if(vkCreateDescriptorPool(
+ self->queue_family->device->device, &pool_info, nullptr,
+ &self->descriptor_pool) != VK_SUCCESS)
+ throw CommandError{"Failed to create a Vulkan descriptor pool."};
+}
+
+void
+unload_descriptor_set_pool(void *obj)
+{
+ auto self = static_cast<VK::Texture*>(obj);
+
+ vkDestroyDescriptorPool(
+ self->queue_family->device->device, self->descriptor_pool, nullptr);
+}
+
+void
+load_descriptor_sets(void *obj)
+{
+ auto self = static_cast<VK::Texture*>(obj);
+
+ std::vector<VkDescriptorSetLayout> layouts(
+ cg_core.vk_swapchain->images_count,
+ cg_core.vk_descriptor_set_layout->texture);
+
+ VkDescriptorSetAllocateInfo alloc_info{};
+ alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ alloc_info.descriptorPool = self->descriptor_pool;
+ alloc_info.descriptorSetCount = layouts.size();
+ alloc_info.pSetLayouts = layouts.data();
+
+ self->descriptor_sets.resize(layouts.size());
+ if(vkAllocateDescriptorSets(
+ self->queue_family->device->device, &alloc_info,
+ self->descriptor_sets.data()) != VK_SUCCESS)
+ CommandError{"Failed to create Vulkan descriptor set."};
+}
+
+void
+load_data_to_descriptor_sets(void *obj)
+{
+ auto self = static_cast<VK::Texture*>(obj);
+
+ for(auto i{0}; i < cg_core.vk_swapchain->images_count; i++)
+ {
+ VkDescriptorImageInfo image_info{};
+ image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ image_info.imageView = self->view;
+ image_info.sampler = self->sampler;
+
+ std::array<VkWriteDescriptorSet, 1> write_descriptors{};
+ write_descriptors[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ write_descriptors[0].dstSet = self->descriptor_sets[i];
+ write_descriptors[0].dstBinding = 0;
+ write_descriptors[0].dstArrayElement = 0;
+ write_descriptors[0].descriptorCount = 1;
+ write_descriptors[0].descriptorType =
+ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ write_descriptors[0].pBufferInfo = nullptr;
+ write_descriptors[0].pImageInfo = &image_info;
+ write_descriptors[0].pTexelBufferView = nullptr;
+
+ vkUpdateDescriptorSets(
+ cg_core.vk_device_with_swapchain->device, write_descriptors.size(),
+ write_descriptors.data(), 0, nullptr);
+ }
+}
+
+const CommandChain descriptor_loader{
+ {&load_descriptor_set_pool, &unload_descriptor_set_pool},
+ {&load_descriptor_sets, nullptr},
+ {&load_data_to_descriptor_sets, nullptr}
+};
+
}
namespace VK
@@ -426,14 +516,22 @@ namespace VK
Texture::Texture(Font *font, const char* str)
{
+ this->queue_family =
+ cg_core.vk_device_with_swapchain->get_queue_family_with_presentation();
+
TextTextureBuilder text_builder(this, font, str);
text_loader.execute(&text_builder);
+ descriptor_loader.execute(this);
}
Texture::Texture(std::string texture_path)
{
+ this->queue_family =
+ cg_core.vk_device_with_swapchain->get_queue_family_with_presentation();
+
ImageTextureBuilder texture_builder(this, texture_path);
image_loader.execute(&texture_builder);
+ descriptor_loader.execute(this);
}
Texture::Texture(const char* texture_path):
@@ -445,6 +543,7 @@ Texture::~Texture()
{
ImageTextureBuilder texture_builder(this, "");
image_loader.revert(&texture_builder);
+ descriptor_loader.revert(this);
}
}