Mercurial > games > semicongine
comparison src/semicongine/vulkan/renderpass.nim @ 783:893ec0fbfd44
add: first, incomplete version of material use
| author | Sam <sam@basx.dev> |
|---|---|
| date | Sat, 19 Aug 2023 01:10:42 +0700 |
| parents | b6950ea89b37 |
| children | 451b7ccfe722 |
comparison
equal
deleted
inserted
replaced
| 782:b6950ea89b37 | 783:893ec0fbfd44 |
|---|---|
| 1 import std/options | 1 import std/options |
| 2 import std/tables | |
| 2 | 3 |
| 3 import ../core | 4 import ../core |
| 4 import ./device | 5 import ./device |
| 5 import ./physicaldevice | 6 import ./physicaldevice |
| 6 import ./pipeline | 7 import ./pipeline |
| 10 type | 11 type |
| 11 Subpass* = object | 12 Subpass* = object |
| 12 clearColor*: Vec4f | 13 clearColor*: Vec4f |
| 13 pipelineBindPoint*: VkPipelineBindPoint | 14 pipelineBindPoint*: VkPipelineBindPoint |
| 14 flags: VkSubpassDescriptionFlags | 15 flags: VkSubpassDescriptionFlags |
| 15 inputs: seq[VkAttachmentReference] | |
| 16 outputs: seq[VkAttachmentReference] | 16 outputs: seq[VkAttachmentReference] |
| 17 resolvers: seq[VkAttachmentReference] | |
| 18 depthStencil: Option[VkAttachmentReference] | 17 depthStencil: Option[VkAttachmentReference] |
| 19 preserves: seq[uint32] | 18 pipelines*: Table[string, Pipeline] |
| 20 pipelines*: seq[Pipeline] | |
| 21 RenderPass* = object | 19 RenderPass* = object |
| 22 vk*: VkRenderPass | 20 vk*: VkRenderPass |
| 23 device*: Device | 21 device*: Device |
| 24 subpasses*: seq[Subpass] | 22 subpasses*: seq[Subpass] |
| 25 | 23 |
| 37 var subpassesList: seq[VkSubpassDescription] | 35 var subpassesList: seq[VkSubpassDescription] |
| 38 for subpass in pSubpasses.mitems: | 36 for subpass in pSubpasses.mitems: |
| 39 subpassesList.add VkSubpassDescription( | 37 subpassesList.add VkSubpassDescription( |
| 40 flags: subpass.flags, | 38 flags: subpass.flags, |
| 41 pipelineBindPoint: subpass.pipelineBindPoint, | 39 pipelineBindPoint: subpass.pipelineBindPoint, |
| 42 inputAttachmentCount: uint32(subpass.inputs.len), | 40 inputAttachmentCount: 0, |
| 43 pInputAttachments: subpass.inputs.toCPointer, | 41 pInputAttachments: nil, |
| 44 colorAttachmentCount: uint32(subpass.outputs.len), | 42 colorAttachmentCount: uint32(subpass.outputs.len), |
| 45 pColorAttachments: subpass.outputs.toCPointer, | 43 pColorAttachments: subpass.outputs.toCPointer, |
| 46 pResolveAttachments: subpass.resolvers.toCPointer, | 44 pResolveAttachments: nil, |
| 47 pDepthStencilAttachment: if subpass.depthStencil.isSome: addr(subpass.depthStencil.get) else: nil, | 45 pDepthStencilAttachment: if subpass.depthStencil.isSome: addr(subpass.depthStencil.get) else: nil, |
| 48 preserveAttachmentCount: uint32(subpass.preserves.len), | 46 preserveAttachmentCount: 0, |
| 49 pPreserveAttachments: subpass.preserves.toCPointer, | 47 pPreserveAttachments: nil, |
| 50 ) | 48 ) |
| 51 | 49 |
| 52 var createInfo = VkRenderPassCreateInfo( | 50 var createInfo = VkRenderPassCreateInfo( |
| 53 sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, | 51 sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, |
| 54 attachmentCount: uint32(pAttachments.len), | 52 attachmentCount: uint32(pAttachments.len), |
| 62 result.subpasses = pSubpasses | 60 result.subpasses = pSubpasses |
| 63 checkVkResult device.vk.vkCreateRenderPass(addr(createInfo), nil, addr(result.vk)) | 61 checkVkResult device.vk.vkCreateRenderPass(addr(createInfo), nil, addr(result.vk)) |
| 64 | 62 |
| 65 proc simpleForwardRenderPass*( | 63 proc simpleForwardRenderPass*( |
| 66 device: Device, | 64 device: Device, |
| 67 shaderConfiguration: ShaderConfiguration, | 65 shaders: Table[string, ShaderConfiguration], |
| 68 inFlightFrames=2, | 66 inFlightFrames=2, |
| 69 format=VK_FORMAT_UNDEFINED , | |
| 70 clearColor=Vec4f([0.8'f32, 0.8'f32, 0.8'f32, 1'f32]) | 67 clearColor=Vec4f([0.8'f32, 0.8'f32, 0.8'f32, 1'f32]) |
| 71 ): RenderPass = | 68 ): RenderPass = |
| 69 # TODO: check wether materials are compatible with the assigned shaders | |
| 70 {.warning: "Need to implement material -> shader compatability" .} | |
| 71 | |
| 72 assert device.vk.valid | 72 assert device.vk.valid |
| 73 assert shaderConfiguration.outputs.len == 1 | 73 for shaderconfig in shaders.values: |
| 74 var theformat = format | 74 assert shaderconfig.outputs.len == 1 |
| 75 if theformat == VK_FORMAT_UNDEFINED: | |
| 76 theformat = device.physicalDevice.getSurfaceFormats().filterSurfaceFormat().format | |
| 77 var | 75 var |
| 78 attachments = @[VkAttachmentDescription( | 76 attachments = @[VkAttachmentDescription( |
| 79 format: theformat, | 77 format: device.physicalDevice.getSurfaceFormats().filterSurfaceFormat().format, |
| 80 samples: VK_SAMPLE_COUNT_1_BIT, | 78 samples: VK_SAMPLE_COUNT_1_BIT, |
| 81 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | 79 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, |
| 82 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | 80 storeOp: VK_ATTACHMENT_STORE_OP_STORE, |
| 83 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | 81 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, |
| 84 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | 82 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, |
| 100 srcAccessMask: VkAccessFlags(0), | 98 srcAccessMask: VkAccessFlags(0), |
| 101 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | 99 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], |
| 102 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | 100 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], |
| 103 )] | 101 )] |
| 104 result = device.createRenderPass(attachments=attachments, subpasses=subpasses, dependencies=dependencies) | 102 result = device.createRenderPass(attachments=attachments, subpasses=subpasses, dependencies=dependencies) |
| 105 result.subpasses[0].pipelines.add device.createPipeline(result.vk, shaderConfiguration, inFlightFrames, 0) | 103 for material, shaderconfig in shaders.pairs: |
| 104 result.subpasses[0].pipelines[material] = device.createPipeline(result.vk, shaderconfig, inFlightFrames, 0) | |
| 105 | |
| 106 | 106 |
| 107 proc beginRenderCommands*(commandBuffer: VkCommandBuffer, renderpass: RenderPass, framebuffer: Framebuffer) = | 107 proc beginRenderCommands*(commandBuffer: VkCommandBuffer, renderpass: RenderPass, framebuffer: Framebuffer) = |
| 108 assert commandBuffer.valid | 108 assert commandBuffer.valid |
| 109 assert renderpass.vk.valid | 109 assert renderpass.vk.valid |
| 110 assert framebuffer.vk.valid | 110 assert framebuffer.vk.valid |
| 157 proc destroy*(renderPass: var RenderPass) = | 157 proc destroy*(renderPass: var RenderPass) = |
| 158 assert renderPass.device.vk.valid | 158 assert renderPass.device.vk.valid |
| 159 assert renderPass.vk.valid | 159 assert renderPass.vk.valid |
| 160 renderPass.device.vk.vkDestroyRenderPass(renderPass.vk, nil) | 160 renderPass.device.vk.vkDestroyRenderPass(renderPass.vk, nil) |
| 161 renderPass.vk.reset | 161 renderPass.vk.reset |
| 162 for subpass in renderPass.subpasses.mitems: | 162 for i in 0 ..< renderPass.subpasses.len: |
| 163 for pipeline in subpass.pipelines.mitems: | 163 for pipeline in renderPass.subpasses[i].pipelines.mvalues: |
| 164 pipeline.destroy() | 164 pipeline.destroy() |
| 165 renderPass.subpasses = @[] | 165 renderPass.subpasses = @[] |
