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()
{
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)
depth_stencil_ref.attachment = VK_ATTACHMENT_UNUSED;
VkSampleCountFlagBits vk_samples = static_cast<VkSampleCountFlagBits>(get_vulkan_samples(format.get_samples()));
- VkImageLayout default_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
unsigned i = 0;
unsigned color_count = 0;
for(FrameAttachment a: format)
{
+ VkImageLayout subpass_layout = static_cast<VkImageLayout>(get_vulkan_attachment_layout(get_components(get_attachment_pixelformat(a))));
+ VkImageLayout external_layout = (to_present ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR : subpass_layout);
+
attachments[i].format = static_cast<VkFormat>(get_vulkan_pixelformat(get_attachment_pixelformat(a)));
attachments[i].samples = vk_samples;
attachments[i].loadOp = (clear ? discard ? VK_ATTACHMENT_LOAD_OP_DONT_CARE : VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD);
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 : default_layout);
- attachments[i].finalLayout = default_layout;
+ attachments[i].initialLayout = ((clear && discard) ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout);
+ attachments[i].finalLayout = external_layout;
- unsigned attach_pt = get_attach_point(a);
- if(attach_pt==get_attach_point(COLOR_ATTACHMENT))
+ if(subpass_layout==VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
{
color_refs[color_count].attachment = i;
- color_refs[color_count].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ color_refs[color_count].layout = subpass_layout;
++color_count;
}
- else if(attach_pt==get_attach_point(DEPTH_ATTACHMENT))
+ else
{
depth_stencil_ref.attachment = i;
- depth_stencil_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ depth_stencil_ref.layout = subpass_layout;
}
++i;
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();
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);
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