Mercurial > games > semicongine
comparison semiconginev2/old/vulkan/renderpass.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/old/vulkan/renderpass.nim@a3eb305bcac2 |
| children |
comparison
equal
deleted
inserted
replaced
| 1217:f819a874058f | 1218:56781cc0fc7c |
|---|---|
| 1 import ../core | |
| 2 import ../material | |
| 3 import ./device | |
| 4 import ./physicaldevice | |
| 5 import ./pipeline | |
| 6 import ./shader | |
| 7 import ./framebuffer | |
| 8 | |
| 9 type | |
| 10 RenderPass* = object | |
| 11 vk*: VkRenderPass | |
| 12 device*: Device | |
| 13 shaderPipelines*: seq[(MaterialType, ShaderPipeline)] | |
| 14 clearColor*: Vec4f | |
| 15 | |
| 16 proc CreateRenderPass*( | |
| 17 device: Device, | |
| 18 shaders: openArray[(MaterialType, ShaderConfiguration)], | |
| 19 clearColor = Vec4f([0.8'f32, 0.8'f32, 0.8'f32, 1'f32]), | |
| 20 backFaceCulling = true, | |
| 21 inFlightFrames = 2, | |
| 22 samples = VK_SAMPLE_COUNT_1_BIT | |
| 23 ): RenderPass = | |
| 24 assert device.vk.Valid | |
| 25 | |
| 26 # some asserts | |
| 27 for (materialtype, shaderconfig) in shaders: | |
| 28 shaderconfig.AssertCanRender(materialtype) | |
| 29 | |
| 30 var attachments = @[ | |
| 31 VkAttachmentDescription( | |
| 32 format: device.physicalDevice.GetSurfaceFormats().FilterSurfaceFormat().format, | |
| 33 samples: samples, | |
| 34 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | |
| 35 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 36 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 37 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 38 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 39 finalLayout: if samples == VK_SAMPLE_COUNT_1_BIT: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR else: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 40 ), | |
| 41 ] | |
| 42 | |
| 43 if samples != VK_SAMPLE_COUNT_1_BIT: | |
| 44 attachments.add VkAttachmentDescription( | |
| 45 format: device.physicalDevice.GetSurfaceFormats().FilterSurfaceFormat().format, | |
| 46 samples: VK_SAMPLE_COUNT_1_BIT, | |
| 47 loadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 48 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
| 49 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
| 50 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
| 51 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
| 52 finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, | |
| 53 ) | |
| 54 | |
| 55 var | |
| 56 # dependencies seems to be optional, TODO: benchmark difference | |
| 57 dependencies = @[VkSubpassDependency( | |
| 58 srcSubpass: VK_SUBPASS_EXTERNAL, | |
| 59 dstSubpass: 0, | |
| 60 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT], | |
| 61 srcAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT], | |
| 62 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT], | |
| 63 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT], | |
| 64 )] | |
| 65 colorAttachment = VkAttachmentReference( | |
| 66 attachment: 0, | |
| 67 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 68 ) | |
| 69 resolveAttachment = VkAttachmentReference( | |
| 70 attachment: 1, | |
| 71 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
| 72 ) | |
| 73 | |
| 74 var subpass = VkSubpassDescription( | |
| 75 flags: VkSubpassDescriptionFlags(0), | |
| 76 pipelineBindPoint: VK_PIPELINE_BIND_POINT_GRAPHICS, | |
| 77 inputAttachmentCount: 0, | |
| 78 pInputAttachments: nil, | |
| 79 colorAttachmentCount: 1, | |
| 80 pColorAttachments: addr(colorAttachment), | |
| 81 pResolveAttachments: if samples == VK_SAMPLE_COUNT_1_BIT: nil else: addr(resolveAttachment), | |
| 82 pDepthStencilAttachment: nil, | |
| 83 preserveAttachmentCount: 0, | |
| 84 pPreserveAttachments: nil, | |
| 85 ) | |
| 86 | |
| 87 var createInfo = VkRenderPassCreateInfo( | |
| 88 sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, | |
| 89 attachmentCount: uint32(attachments.len), | |
| 90 pAttachments: attachments.ToCPointer, | |
| 91 subpassCount: 1, | |
| 92 pSubpasses: addr(subpass), | |
| 93 dependencyCount: uint32(dependencies.len), | |
| 94 pDependencies: dependencies.ToCPointer, | |
| 95 ) | |
| 96 result.device = device | |
| 97 result.clearColor = clearColor | |
| 98 checkVkResult device.vk.vkCreateRenderPass(addr(createInfo), nil, addr(result.vk)) | |
| 99 | |
| 100 for (_, shaderconfig) in shaders: | |
| 101 assert shaderconfig.outputs.len == 1 | |
| 102 for (materialtype, shaderconfig) in shaders: | |
| 103 result.shaderPipelines.add (materialtype, device.CreatePipeline(result.vk, shaderconfig, inFlightFrames, 0, backFaceCulling = backFaceCulling, samples = samples)) | |
| 104 | |
| 105 proc BeginRenderCommands*(commandBuffer: VkCommandBuffer, renderpass: RenderPass, framebuffer: Framebuffer, oneTimeSubmit: bool) = | |
| 106 assert commandBuffer.Valid | |
| 107 assert renderpass.vk.Valid | |
| 108 assert framebuffer.vk.Valid | |
| 109 let | |
| 110 w = framebuffer.dimension.x | |
| 111 h = framebuffer.dimension.y | |
| 112 | |
| 113 var clearColors = [VkClearValue(color: VkClearColorValue(float32: renderpass.clearColor))] | |
| 114 var | |
| 115 beginInfo = VkCommandBufferBeginInfo( | |
| 116 sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, | |
| 117 pInheritanceInfo: nil, | |
| 118 flags: if oneTimeSubmit: VkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) else: VkCommandBufferUsageFlags(0), | |
| 119 ) | |
| 120 renderPassInfo = VkRenderPassBeginInfo( | |
| 121 sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, | |
| 122 renderPass: renderPass.vk, | |
| 123 framebuffer: framebuffer.vk, | |
| 124 renderArea: VkRect2D( | |
| 125 offset: VkOffset2D(x: 0, y: 0), | |
| 126 extent: VkExtent2D(width: w, height: h), | |
| 127 ), | |
| 128 clearValueCount: uint32(clearColors.len), | |
| 129 pClearValues: clearColors.ToCPointer(), | |
| 130 ) | |
| 131 viewport = VkViewport( | |
| 132 x: 0.0, | |
| 133 y: 0.0, | |
| 134 width: (float)w, | |
| 135 height: (float)h, | |
| 136 minDepth: 0.0, | |
| 137 maxDepth: 1.0, | |
| 138 ) | |
| 139 scissor = VkRect2D( | |
| 140 offset: VkOffset2D(x: 0, y: 0), | |
| 141 extent: VkExtent2D(width: w, height: h) | |
| 142 ) | |
| 143 checkVkResult commandBuffer.vkResetCommandBuffer(VkCommandBufferResetFlags(0)) | |
| 144 checkVkResult commandBuffer.vkBeginCommandBuffer(addr(beginInfo)) | |
| 145 commandBuffer.vkCmdBeginRenderPass(addr(renderPassInfo), VK_SUBPASS_CONTENTS_INLINE) | |
| 146 commandBuffer.vkCmdSetViewport(firstViewport = 0, viewportCount = 1, addr(viewport)) | |
| 147 commandBuffer.vkCmdSetScissor(firstScissor = 0, scissorCount = 1, addr(scissor)) | |
| 148 | |
| 149 proc EndRenderCommands*(commandBuffer: VkCommandBuffer) = | |
| 150 commandBuffer.vkCmdEndRenderPass() | |
| 151 checkVkResult commandBuffer.vkEndCommandBuffer() | |
| 152 | |
| 153 | |
| 154 proc Destroy*(renderPass: var RenderPass) = | |
| 155 assert renderPass.device.vk.Valid | |
| 156 assert renderPass.vk.Valid | |
| 157 renderPass.device.vk.vkDestroyRenderPass(renderPass.vk, nil) | |
| 158 renderPass.vk.Reset | |
| 159 for _, pipeline in renderPass.shaderPipelines.mitems: | |
| 160 pipeline.Destroy() |
