Mercurial > games > semicongine
comparison semiconginev2/rendering/renderpasses.nim @ 1218:56781cc0fc7c compiletime-tests
did: renamge main package
| author | sam <sam@basx.dev> | 
|---|---|
| date | Wed, 17 Jul 2024 21:01:37 +0700 | 
| parents | semicongine/rendering/renderpasses.nim@04e446a7eb2b | 
| children | 5dcb503ef0c0 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 1217:f819a874058f | 1218:56781cc0fc7c | 
|---|---|
| 1 proc CreateDirectPresentationRenderPass*(samples = VK_SAMPLE_COUNT_1_BIT): VkRenderPass = | |
| 2 assert vulkan.instance.Valid, "Vulkan not initialized" | |
| 3 | |
| 4 let format = DefaultSurfaceFormat() | |
| 5 var attachments = @[VkAttachmentDescription( | |
| 6 format: format, | |
| 7 samples: samples, | |
| 8 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | |
| 9 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 10 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 11 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 12 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 13 finalLayout: if samples == VK_SAMPLE_COUNT_1_BIT: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR else: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 14 )] | |
| 15 if samples != VK_SAMPLE_COUNT_1_BIT: | |
| 16 attachments.add VkAttachmentDescription( | |
| 17 format: format, | |
| 18 samples: VK_SAMPLE_COUNT_1_BIT, | |
| 19 loadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 20 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 21 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 22 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 23 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 24 finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, | |
| 25 ) | |
| 26 var | |
| 27 dependencies = @[ | |
| 28 VkSubpassDependency( | |
| 29 srcSubpass: VK_SUBPASS_EXTERNAL, | |
| 30 dstSubpass: 0, | |
| 31 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT], | |
| 32 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT], | |
| 33 srcAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 34 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 35 ) | |
| 36 ] | |
| 37 colorAttachment = VkAttachmentReference( | |
| 38 attachment: 0, | |
| 39 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 40 ) | |
| 41 resolveAttachment = VkAttachmentReference( | |
| 42 attachment: 1, | |
| 43 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 44 ) | |
| 45 | |
| 46 if samples == VK_SAMPLE_COUNT_1_BIT: | |
| 47 return svkCreateRenderPass(attachments, [colorAttachment], [], dependencies) | |
| 48 else: | |
| 49 return svkCreateRenderPass(attachments, [colorAttachment], [resolveAttachment], dependencies) | |
| 50 | |
| 51 proc CreateIndirectPresentationRenderPass*(): (VkRenderPass, VkRenderPass) = | |
| 52 assert vulkan.instance.Valid, "Vulkan not initialized" | |
| 53 | |
| 54 # first renderpass, drawing | |
| 55 let format = DefaultSurfaceFormat() | |
| 56 var | |
| 57 attachments = @[VkAttachmentDescription( | |
| 58 format: format, | |
| 59 samples: VK_SAMPLE_COUNT_1_BIT, | |
| 60 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | |
| 61 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 62 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 63 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 64 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 65 finalLayout: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, | |
| 66 )] | |
| 67 | |
| 68 dependencies = @[ | |
| 69 VkSubpassDependency( | |
| 70 srcSubpass: VK_SUBPASS_EXTERNAL, | |
| 71 dstSubpass: 0, | |
| 72 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 73 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 74 srcAccessMask: VkAccessFlags(0), | |
| 75 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 76 ), | |
| 77 VkSubpassDependency( | |
| 78 srcSubpass: VK_SUBPASS_EXTERNAL, | |
| 79 dstSubpass: 0, | |
| 80 srcStageMask: toBits [VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT], | |
| 81 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 82 srcAccessMask: toBits [VK_ACCESS_SHADER_READ_BIT], | |
| 83 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 84 ), | |
| 85 VkSubpassDependency( | |
| 86 srcSubpass: 0, | |
| 87 dstSubpass: VK_SUBPASS_EXTERNAL, | |
| 88 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 89 dstStageMask: toBits [VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT], | |
| 90 srcAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 91 dstAccessMask: toBits [VK_ACCESS_SHADER_READ_BIT], | |
| 92 ), | |
| 93 ] | |
| 94 colorAttachment = VkAttachmentReference( | |
| 95 attachment: 0, | |
| 96 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 97 ) | |
| 98 | |
| 99 # second renderpass, presentation | |
| 100 var | |
| 101 presentAttachments = @[VkAttachmentDescription( | |
| 102 format: format, | |
| 103 samples: VK_SAMPLE_COUNT_1_BIT, | |
| 104 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | |
| 105 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 106 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 107 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 108 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 109 finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, | |
| 110 )] | |
| 111 presentDependencies = @[VkSubpassDependency( | |
| 112 srcSubpass: VK_SUBPASS_EXTERNAL, | |
| 113 dstSubpass: 0, | |
| 114 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 115 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
| 116 srcAccessMask: VkAccessFlags(0), | |
| 117 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
| 118 )] | |
| 119 presentColorAttachment = VkAttachmentReference( | |
| 120 attachment: 0, | |
| 121 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 122 ) | |
| 123 | |
| 124 result = ( | |
| 125 svkCreateRenderPass(attachments, [colorAttachment], [], dependencies), | |
| 126 svkCreateRenderPass(presentAttachments, [presentColorAttachment], [], presentDependencies) | |
| 127 ) | |
| 128 | |
| 129 template WithRenderPass*( | |
| 130 theRenderpass: VkRenderPass, | |
| 131 theFramebuffer: VkFramebuffer, | |
| 132 commandbuffer: VkCommandBuffer, | |
| 133 renderWidth: uint32, | |
| 134 renderHeight: uint32, | |
| 135 clearColor: Vec4f, | |
| 136 body: untyped | |
| 137 ): untyped = | |
| 138 var | |
| 139 clearColors = [VkClearValue(color: VkClearColorValue(float32: clearColor))] | |
| 140 renderPassInfo = VkRenderPassBeginInfo( | |
| 141 sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, | |
| 142 renderPass: theRenderpass, | |
| 143 framebuffer: theFramebuffer, | |
| 144 renderArea: VkRect2D( | |
| 145 offset: VkOffset2D(x: 0, y: 0), | |
| 146 extent: VkExtent2D(width: renderWidth, height: renderHeight), | |
| 147 ), | |
| 148 clearValueCount: uint32(clearColors.len), | |
| 149 pClearValues: clearColors.ToCPointer(), | |
| 150 ) | |
| 151 viewport = VkViewport( | |
| 152 x: 0.0, | |
| 153 y: renderHeight.float32, | |
| 154 width: renderWidth.float32, | |
| 155 height: -renderHeight.float32, | |
| 156 minDepth: 0.0, | |
| 157 maxDepth: 1.0, | |
| 158 ) | |
| 159 scissor = VkRect2D( | |
| 160 offset: VkOffset2D(x: 0, y: 0), | |
| 161 extent: VkExtent2D(width: renderWidth, height: renderHeight) | |
| 162 ) | |
| 163 | |
| 164 vkCmdBeginRenderPass(commandbuffer, addr(renderPassInfo), VK_SUBPASS_CONTENTS_INLINE) | |
| 165 | |
| 166 # setup viewport | |
| 167 vkCmdSetViewport(commandbuffer, firstViewport = 0, viewportCount = 1, addr(viewport)) | |
| 168 vkCmdSetScissor(commandbuffer, firstScissor = 0, scissorCount = 1, addr(scissor)) | |
| 169 | |
| 170 block: | |
| 171 body | |
| 172 | |
| 173 vkCmdEndRenderPass(commandbuffer) | 
