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()