Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct RenderPass
- {
- VkRenderPass pass;
- std::vector<VkFramebuffer> framebuffers;
- };
- RenderPass buildGBufferRenderPass(VkDevice device, const std::vector<std::pair<VkFormat, VkImageLayout>>& attachments)
- {
- RenderPass result;
- std::array<VkSubpassDependency, 2> dependencies;
- dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
- dependencies[0].dstSubpass = 0;
- dependencies[0].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- dependencies[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- dependencies[0].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
- dependencies[0].dstAccessMask = 0;
- dependencies[1].srcSubpass = 0;
- dependencies[1].dstSubpass = 1;
- dependencies[1].srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
- dependencies[1].srcAccessMask = 0;
- dependencies[1].dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
- std::vector<VkAttachmentDescription> colorAttachments;
- std::vector<VkAttachmentReference> colorReferences;
- for (uint i = 0; i < attachments.size(); ++i)
- {
- VkAttachmentDescription attachment{};
- attachment.format = attachments.at(i).first;
- attachment.samples = VK_SAMPLE_COUNT_1_BIT;
- attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- attachment.finalLayout = attachments.at(i).second;
- VkAttachmentReference reference{};
- reference.attachment = i;
- reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- colorAttachments.push_back(attachment);
- colorReferences.push_back(reference);
- }
- VkAttachmentDescription depthAttachment{};
- depthAttachment.flags = 0;
- depthAttachment.format = VK_FORMAT_D32_SFLOAT;
- depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
- depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- VkAttachmentReference depthAttachmentRef = {};
- depthAttachmentRef.attachment = colorAttachments.size();
- depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- colorAttachments.push_back(depthAttachment);
- VkSubpassDescription subpass = {};
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.colorAttachmentCount = colorReferences.size();
- subpass.pColorAttachments = colorReferences.data();
- subpass.pDepthStencilAttachment = &depthAttachmentRef;
- VkRenderPassCreateInfo passInfo = {};
- passInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
- passInfo.attachmentCount = colorAttachments.size();
- passInfo.pAttachments = colorAttachments.data();
- passInfo.subpassCount = 1;
- passInfo.pSubpasses = &subpass;
- passInfo.dependencyCount = dependencies.size();
- passInfo.pDependencies = dependencies.data();
- vkCreateRenderPass(device, &passInfo, nullptr, &result.pass);
- return result;
- }
- RenderPass buildDeferredPBRRenderPass(VkDevice device, VkFormat swapchainFormat)
- {
- RenderPass result;
- VkSubpassDependency dependency;
- dependency.srcSubpass = 1;
- dependency.dstSubpass = VK_SUBPASS_EXTERNAL;
- dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
- dependency.srcAccessMask = 0;
- dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
- VkAttachmentDescription attachment{};
- attachment.format = swapchainFormat;
- attachment.samples = VK_SAMPLE_COUNT_1_BIT;
- attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
- VkAttachmentReference reference{};
- reference.attachment = 0;
- reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- VkSubpassDescription subpass = {};
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.colorAttachmentCount = 1;
- subpass.pColorAttachments = &reference;
- VkRenderPassCreateInfo passInfo = {};
- passInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
- passInfo.attachmentCount = 1;
- passInfo.pAttachments = &attachment;
- passInfo.subpassCount = 1;
- passInfo.pSubpasses = &subpass;
- passInfo.dependencyCount = 1;
- passInfo.pDependencies = &dependency;
- vkCreateRenderPass(device, &passInfo, nullptr, &result.pass);
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement