-#include <msp/core/hash.h>
-#include "blend.h"
-#include "depthtest.h"
#include "device.h"
-#include "framebuffer.h"
#include "pipelinecache.h"
#include "pipelinestate.h"
-#include "stenciltest.h"
+#include "renderpass.h"
#include "vulkan.h"
using namespace std;
vk.DestroyPipeline(kvp.second);
}
-VkRenderPass PipelineCache::get_render_pass(const FrameFormat &format, bool clear, bool discard, bool to_present)
+VkRenderPass PipelineCache::get_render_pass(const RenderPass &rp)
{
+ uint64_t key = rp.compute_hash();
+ auto i = render_passes.find(key);
+ if(i!=render_passes.end())
+ return i->second;
+
const VulkanFunctions &vk = device.get_functions();
- uint64_t key = hash<64>(static_cast<uint8_t>(clear | (discard*2) | (to_present*4)));
- for(FrameAttachment a: format)
- key = hash_update<64>(key, a);
-
- auto j = render_passes.find(key);
- if(j!=render_passes.end())
- return j->second;
-
- VkAttachmentDescription attachments[FrameFormat::MAX_ATTACHMENTS] = { };
- VkAttachmentReference color_refs[FrameFormat::MAX_ATTACHMENTS] = { };
- VkAttachmentReference depth_stencil_ref = { };
- depth_stencil_ref.attachment = VK_ATTACHMENT_UNUSED;
-
- VkSampleCountFlagBits vk_samples = static_cast<VkSampleCountFlagBits>(get_vulkan_samples(format.get_samples()));
-
- 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 && discard) ? VK_IMAGE_LAYOUT_UNDEFINED : external_layout);
- attachments[i].finalLayout = external_layout;
-
- if(subpass_layout==VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
- {
- color_refs[color_count].attachment = i;
- color_refs[color_count].layout = subpass_layout;
- ++color_count;
- }
- else
- {
- depth_stencil_ref.attachment = i;
- depth_stencil_ref.layout = subpass_layout;
- }
-
- ++i;
- }
-
- VkSubpassDescription subpass = { };
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.colorAttachmentCount = color_count;
- 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.pAttachments = attachments;
- 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;
- }
+ vector<char> buffer;
+ rp.fill_creation_info(buffer);
+ const VkRenderPassCreateInfo *creation_info = reinterpret_cast<const VkRenderPassCreateInfo *>(buffer.data());
VkRenderPass render_pass;
- vk.CreateRenderPass(render_pass_info, render_pass);
+ vk.CreateRenderPass(*creation_info, render_pass);
render_passes.insert(make_pair(key, render_pass));