]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinecache.cpp
Rewrite descriptor set management
[libs/gl.git] / source / backends / vulkan / pipelinecache.cpp
index 425be40ab776478ecab88df4ed636c9f09fef960..052ce37ffa5e2e738c65d9d706ce59516d2b5a33 100644 (file)
@@ -15,23 +15,7 @@ namespace GL {
 
 PipelineCache::PipelineCache(Device &d):
        device(d)
-{
-       const VulkanFunctions &vk = device.get_functions();
-
-       VkDescriptorPoolSize pool_sizes[2] = { };
-       pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-       pool_sizes[0].descriptorCount = 10000;
-       pool_sizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
-       pool_sizes[1].descriptorCount = 10000;
-
-       VkDescriptorPoolCreateInfo pool_info = { };
-       pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
-       pool_info.maxSets = 10000;
-       pool_info.poolSizeCount = 2;
-       pool_info.pPoolSizes = pool_sizes;
-
-       vk.CreateDescriptorPool(pool_info, descriptor_pool);
-}
+{ }
 
 PipelineCache::~PipelineCache()
 {
@@ -41,7 +25,6 @@ PipelineCache::~PipelineCache()
                vk.DestroyRenderPass(kvp.second);
        for(const auto &kvp: pipelines)
                vk.DestroyPipeline(kvp.second);
-       vk.DestroyDescriptorPool(descriptor_pool);
 }
 
 VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clear, bool discard, bool to_present)
@@ -76,7 +59,7 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clea
                attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
                attachments[i].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
                attachments[i].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
-               attachments[i].initialLayout = (clear ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout);
+               attachments[i].initialLayout = ((clear && discard) ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout);
                attachments[i].finalLayout = external_layout;
 
                if(subpass_layout==VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
@@ -100,6 +83,7 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clea
        subpass.pColorAttachments = color_refs;
        subpass.pDepthStencilAttachment = &depth_stencil_ref;
 
+       VkSubpassDependency dependency = { };
        VkRenderPassCreateInfo render_pass_info = { };
        render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
        render_pass_info.attachmentCount = format.size();
@@ -107,6 +91,19 @@ VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clea
        render_pass_info.subpassCount = 1;
        render_pass_info.pSubpasses = &subpass;
 
+       if(to_present)
+       {
+               dependency.srcSubpass = 0;
+               dependency.dstSubpass = VK_SUBPASS_EXTERNAL;
+               dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+               dependency.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
+               dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+               dependency.dstAccessMask = 0;
+
+               render_pass_info.dependencyCount = 1;
+               render_pass_info.pDependencies = &dependency;
+       }
+
        VkRenderPass render_pass;
        vk.CreateRenderPass(render_pass_info, render_pass);
 
@@ -136,38 +133,5 @@ VkPipeline PipelineCache::get_pipeline(const PipelineState &ps)
        return pipeline;
 }
 
-VkDescriptorSet PipelineCache::get_descriptor_set(const PipelineState &ps, unsigned index)
-{
-       const VulkanFunctions &vk = device.get_functions();
-
-       uint64_t key = ps.compute_descriptor_set_hash(index);
-       auto i = descriptor_sets.find(key);
-       if(i!=descriptor_sets.end())
-               return i->second;
-
-       VkDescriptorSetLayout layout = ps.get_descriptor_set_layout(index);
-
-       VkDescriptorSetAllocateInfo alloc_info = { };
-       alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
-       alloc_info.descriptorPool = handle_cast<::VkDescriptorPool>(descriptor_pool);
-       alloc_info.descriptorSetCount = 1;
-       alloc_info.pSetLayouts = handle_cast<::VkDescriptorSetLayout *>(&layout);
-
-       VkDescriptorSet desc_set;
-       vk.AllocateDescriptorSets(alloc_info, &desc_set);
-
-       vector<char> buffer;
-       unsigned n_writes = ps.fill_descriptor_writes(index, buffer);
-       VkWriteDescriptorSet *writes = reinterpret_cast<VkWriteDescriptorSet *>(buffer.data());
-       for(unsigned j=0; j<n_writes; ++j)
-               writes[j].dstSet = handle_cast<::VkDescriptorSet>(desc_set);
-
-       vk.UpdateDescriptorSets(n_writes, writes, 0, 0);
-
-       descriptor_sets.insert(make_pair(key, desc_set));
-
-       return desc_set;
-}
-
 } // namespace GL
 } // namespace Msp