Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2023
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.65 KB | None | 0 0
  1. struct RenderPass
  2. {
  3.     VkRenderPass pass;
  4.     std::vector<VkFramebuffer> framebuffers;
  5. };
  6.  
  7. RenderPass buildGBufferRenderPass(VkDevice device, const std::vector<std::pair<VkFormat, VkImageLayout>>& attachments)
  8.     {
  9.         RenderPass result;
  10.  
  11.         std::array<VkSubpassDependency, 2> dependencies;
  12.  
  13.         dependencies[0].srcSubpass    = VK_SUBPASS_EXTERNAL;
  14.         dependencies[0].dstSubpass    = 0;
  15.         dependencies[0].srcStageMask  = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
  16.         dependencies[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
  17.         dependencies[0].dstStageMask  = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
  18.         dependencies[0].dstAccessMask = 0;
  19.  
  20.         dependencies[1].srcSubpass    = 0;
  21.         dependencies[1].dstSubpass    = 1;
  22.         dependencies[1].srcStageMask  = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
  23.         dependencies[1].srcAccessMask = 0;
  24.         dependencies[1].dstStageMask  = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
  25.  
  26.         std::vector<VkAttachmentDescription> colorAttachments;
  27.         std::vector<VkAttachmentReference> colorReferences;
  28.  
  29.         for (uint i = 0; i < attachments.size(); ++i)
  30.         {
  31.             VkAttachmentDescription attachment{};
  32.             attachment.format = attachments.at(i).first;
  33.             attachment.samples = VK_SAMPLE_COUNT_1_BIT;
  34.             attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
  35.             attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  36.             attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  37.             attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  38.             attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  39.             attachment.finalLayout = attachments.at(i).second;
  40.  
  41.             VkAttachmentReference reference{};
  42.             reference.attachment = i;
  43.             reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  44.  
  45.             colorAttachments.push_back(attachment);
  46.             colorReferences.push_back(reference);
  47.         }
  48.  
  49.         VkAttachmentDescription depthAttachment{};
  50.         depthAttachment.flags = 0;
  51.         depthAttachment.format = VK_FORMAT_D32_SFLOAT;
  52.         depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
  53.         depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
  54.         depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  55.         depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
  56.         depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  57.         depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  58.         depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  59.  
  60.         VkAttachmentReference depthAttachmentRef = {};
  61.         depthAttachmentRef.attachment = colorAttachments.size();
  62.         depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  63.  
  64.         colorAttachments.push_back(depthAttachment);
  65.  
  66.         VkSubpassDescription subpass = {};
  67.         subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
  68.         subpass.colorAttachmentCount = colorReferences.size();
  69.         subpass.pColorAttachments = colorReferences.data();
  70.         subpass.pDepthStencilAttachment = &depthAttachmentRef;
  71.  
  72.         VkRenderPassCreateInfo passInfo = {};
  73.         passInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
  74.         passInfo.attachmentCount = colorAttachments.size();
  75.         passInfo.pAttachments = colorAttachments.data();
  76.         passInfo.subpassCount = 1;
  77.         passInfo.pSubpasses = &subpass;
  78.         passInfo.dependencyCount = dependencies.size();
  79.         passInfo.pDependencies = dependencies.data();
  80.  
  81.         vkCreateRenderPass(device, &passInfo, nullptr, &result.pass);
  82.  
  83.         return result;
  84.     }
  85.  
  86.     RenderPass buildDeferredPBRRenderPass(VkDevice device, VkFormat swapchainFormat)
  87.     {
  88.         RenderPass result;
  89.  
  90.         VkSubpassDependency dependency;
  91.         dependency.srcSubpass    = 1;
  92.         dependency.dstSubpass    = VK_SUBPASS_EXTERNAL;
  93.         dependency.srcStageMask  = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
  94.         dependency.srcAccessMask = 0;
  95.         dependency.dstStageMask  = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
  96.         dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
  97.  
  98.         VkAttachmentDescription attachment{};
  99.         attachment.format = swapchainFormat;
  100.         attachment.samples = VK_SAMPLE_COUNT_1_BIT;
  101.         attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
  102.         attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  103.         attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  104.         attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  105.         attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  106.         attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
  107.  
  108.         VkAttachmentReference reference{};
  109.         reference.attachment = 0;
  110.         reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  111.  
  112.         VkSubpassDescription subpass = {};
  113.         subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
  114.         subpass.colorAttachmentCount = 1;
  115.         subpass.pColorAttachments = &reference;
  116.  
  117.         VkRenderPassCreateInfo passInfo = {};
  118.         passInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
  119.         passInfo.attachmentCount = 1;
  120.         passInfo.pAttachments = &attachment;
  121.         passInfo.subpassCount = 1;
  122.         passInfo.pSubpasses = &subpass;
  123.         passInfo.dependencyCount = 1;
  124.         passInfo.pDependencies = &dependency;
  125.  
  126.         vkCreateRenderPass(device, &passInfo, nullptr, &result.pass);
  127.  
  128.         return result;
  129.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement