comparison tests/test_rendering.nim @ 1209:e177336cac3f compiletime-tests

sync to notebook in bedroom
author sam <sam@basx.dev>
date Tue, 16 Jul 2024 20:39:35 +0700
parents 8cf9a05b03eb
children 570ac1620fb6
comparison
equal deleted inserted replaced
1208:8cf9a05b03eb 1209:e177336cac3f
122 proc test_03_global_descriptorset(nFrames: int) = 122 proc test_03_global_descriptorset(nFrames: int) =
123 var renderdata = InitRenderData() 123 var renderdata = InitRenderData()
124 124
125 type 125 type
126 RenderSettings = object 126 RenderSettings = object
127 gamma: float32 127 brigthness: float32
128 FirstDS = object 128 ObjectSettings = object
129 settings: GPUValue[RenderSettings, UniformBufferMapped] 129 baseColor: Vec3f
130 MainSet = object
131 renderSettings: GPUValue[RenderSettings, UniformBufferMapped]
132 materialSettings: GPUValue[ObjectSettings, UniformBuffer]
133 OtherSet = object
134 # TODO
135
130 QuadShader = object 136 QuadShader = object
131 position {.VertexAttribute.}: Vec3f 137 position {.VertexAttribute.}: Vec3f
132 color {.VertexAttribute.}: Vec3f
133 fragmentColor {.Pass.}: Vec3f 138 fragmentColor {.Pass.}: Vec3f
134 outColor {.ShaderOutput.}: Vec4f 139 outColor {.ShaderOutput.}: Vec4f
135 descriptorSets {.DescriptorSets.}: (FirstDS, ) 140 descriptorSets {.DescriptorSets.}: (MainSet, OtherSet)
136 # code 141 # code
137 vertexCode: string = """void main() { 142 vertexCode: string = """void main() {
138 fragmentColor = vec3(pow(color.r, settings.gamma), pow(color.g, settings.gamma), pow(color.b, settings.gamma)); 143 fragmentColor = materialSettings.baseColor * renderSettings.brigthness;
139 gl_Position = vec4(position, 1);}""" 144 gl_Position = vec4(position, 1);}"""
140 fragmentCode: string = """void main() { 145 fragmentCode: string = """void main() {
141 outColor = vec4(fragmentColor, 1);}""" 146 outColor = vec4(fragmentColor, 1);}"""
142 QuadMesh = object 147 QuadMesh = object
143 position: GPUArray[Vec3f, VertexBuffer] 148 position: GPUArray[Vec3f, VertexBuffer]
144 color: GPUArray[Vec3f, VertexBuffer]
145 indices: GPUArray[uint16, IndexBuffer] 149 indices: GPUArray[uint16, IndexBuffer]
146 150
147 var quad = QuadMesh( 151 var quad = QuadMesh(
148 position: asGPUArray([NewVec3f(-0.9, -0.5), NewVec3f(-0.9, 0.5), NewVec3f(0.9, 0.5), NewVec3f(0.9, -0.5)], VertexBuffer), 152 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer),
149 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 153 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
150 color: asGPUArray([NewVec3f(0, 0, 0), NewVec3f(0, 0, 0), NewVec3f(1, 1, 1), NewVec3f(1, 1, 1)], VertexBuffer), 154 )
151 ) 155 var mainSet = asDescriptorSet(
152 var settings = DescriptorSet[FirstDS]( 156 MainSet(
153 data: FirstDS( 157 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped),
154 settings: asGPUValue(RenderSettings( 158 materialSettings: asGPUValue(ObjectSettings(baseColor: NewVec3f(1, 1, 0)), UniformBuffer),
155 gamma: 0.01'f32 159 )
156 ), UniformBufferMapped) 160 )
157 ) 161 var settings = asDescriptorSet(
158 ) 162 OtherSet(
163 # TODO
164 )
165 )
166
159 AssignBuffers(renderdata, quad) 167 AssignBuffers(renderdata, quad)
160 AssignBuffers(renderdata, settings) 168 AssignBuffers(renderdata, mainSet)
161 renderdata.FlushAllMemory() 169 renderdata.FlushAllMemory()
162 170
163 var pipeline = CreatePipeline[QuadShader](renderPass = mainRenderpass, samples = swapchain.samples) 171 var pipeline = CreatePipeline[QuadShader](renderPass = mainRenderpass, samples = swapchain.samples)
164 172
165 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], settings) 173 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], mainSet)
166 174
167 var c = 0 175 var c = 0
168 while UpdateInputs() and c < nFrames: 176 while UpdateInputs() and c < nFrames:
169 WithNextFrame(swapchain, framebuffer, commandbuffer): 177 WithNextFrame(swapchain, framebuffer, commandbuffer):
170 WithBind(commandbuffer, (settings, ), pipeline, swapchain.currentFiF): 178 WithBind(commandbuffer, (mainSet, ), pipeline, swapchain.currentFiF):
171 WithRenderPass(mainRenderpass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 179 WithRenderPass(mainRenderpass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)):
172 WithPipeline(commandbuffer, pipeline): 180 WithPipeline(commandbuffer, pipeline):
173 Render(commandbuffer = commandbuffer, pipeline = pipeline, firstSet = settings, mesh = quad) 181 Render(commandbuffer = commandbuffer, pipeline = pipeline, firstSet = mainSet, mesh = quad)
174 settings.data.settings.data.gamma = 0.01'f32 + (c.float32 / nFrames.float32) * 5'f32 182 mainSet.data.renderSettings.data.brigthness = (c.float32 / nFrames.float32)
175 UpdateGPUBuffer(settings.data.settings) 183 UpdateGPUBuffer(mainSet.data.renderSettings)
176 renderdata.FlushAllMemory() 184 renderdata.FlushAllMemory()
177 inc c 185 inc c
178 186
179 # cleanup 187 # cleanup
180 checkVkResult vkDeviceWaitIdle(vulkan.device) 188 checkVkResult vkDeviceWaitIdle(vulkan.device)
189 block: 197 block:
190 mainRenderpass = CreatePresentationRenderPass() 198 mainRenderpass = CreatePresentationRenderPass()
191 swapchain = InitSwapchain(renderpass = mainRenderpass).get() 199 swapchain = InitSwapchain(renderpass = mainRenderpass).get()
192 200
193 # tests a simple triangle with minimalistic shader and vertex format 201 # tests a simple triangle with minimalistic shader and vertex format
194 test_01_triangle(nFrames) 202 # test_01_triangle(nFrames)
195 203
196 # tests instanced triangles and quads, mixing meshes and instances 204 # tests instanced triangles and quads, mixing meshes and instances
197 test_02_triangle_quad_instanced(nFrames) 205 # test_02_triangle_quad_instanced(nFrames)
198 206
199 # tests 207 # tests
200 test_03_global_descriptorset(nFrames) 208 test_03_global_descriptorset(nFrames)
201 209
202 checkVkResult vkDeviceWaitIdle(vulkan.device) 210 checkVkResult vkDeviceWaitIdle(vulkan.device)
206 # test MSAA 214 # test MSAA
207 block: 215 block:
208 mainRenderpass = CreatePresentationRenderPass(samples = VK_SAMPLE_COUNT_4_BIT) 216 mainRenderpass = CreatePresentationRenderPass(samples = VK_SAMPLE_COUNT_4_BIT)
209 swapchain = InitSwapchain(renderpass = mainRenderpass, samples = VK_SAMPLE_COUNT_4_BIT).get() 217 swapchain = InitSwapchain(renderpass = mainRenderpass, samples = VK_SAMPLE_COUNT_4_BIT).get()
210 218
211 test_01_triangle(99999999) 219 # test_01_triangle(99999999)
212 220
213 checkVkResult vkDeviceWaitIdle(vulkan.device) 221 checkVkResult vkDeviceWaitIdle(vulkan.device)
214 vkDestroyRenderPass(vulkan.device, mainRenderpass, nil) 222 vkDestroyRenderPass(vulkan.device, mainRenderpass, nil)
215 DestroySwapchain(swapchain) 223 DestroySwapchain(swapchain)
216 224