Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1210:570ac1620fb6 compiletime-tests
fix: make uniform-block-arrays working
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 17 Jul 2024 00:30:49 +0700 |
| parents | e177336cac3f |
| children | d9799f74f5a7 |
comparison
equal
deleted
inserted
replaced
| 1209:e177336cac3f | 1210:570ac1620fb6 |
|---|---|
| 117 # cleanup | 117 # cleanup |
| 118 checkVkResult vkDeviceWaitIdle(vulkan.device) | 118 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 119 DestroyPipeline(pipeline) | 119 DestroyPipeline(pipeline) |
| 120 DestroyRenderData(renderdata) | 120 DestroyRenderData(renderdata) |
| 121 | 121 |
| 122 proc test_03_global_descriptorset(nFrames: int) = | 122 proc test_03_simple_descriptorset(nFrames: int) = |
| 123 var renderdata = InitRenderData() | 123 var renderdata = InitRenderData() |
| 124 | 124 |
| 125 type | 125 type |
| 126 RenderSettings = object | 126 Material = object |
| 127 brigthness: float32 | |
| 128 ObjectSettings = object | |
| 129 baseColor: Vec3f | 127 baseColor: Vec3f |
| 130 MainSet = object | 128 |
| 131 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] | 129 Uniforms = object |
| 132 materialSettings: GPUValue[ObjectSettings, UniformBuffer] | 130 material: GPUValue[Material, UniformBuffer] |
| 133 OtherSet = object | 131 texture1: Texture[TVec3[uint8]] |
| 134 # TODO | |
| 135 | 132 |
| 136 QuadShader = object | 133 QuadShader = object |
| 137 position {.VertexAttribute.}: Vec3f | 134 position {.VertexAttribute.}: Vec3f |
| 138 fragmentColor {.Pass.}: Vec3f | 135 fragmentColor {.Pass.}: Vec3f |
| 136 uv {.Pass.}: Vec2f | |
| 139 outColor {.ShaderOutput.}: Vec4f | 137 outColor {.ShaderOutput.}: Vec4f |
| 140 descriptorSets {.DescriptorSets.}: (MainSet, OtherSet) | 138 descriptorSets {.DescriptorSets.}: (Uniforms, ) |
| 141 # code | 139 # code |
| 142 vertexCode: string = """void main() { | 140 vertexCode: string = """void main() { |
| 143 fragmentColor = materialSettings.baseColor * renderSettings.brigthness; | 141 fragmentColor = material.baseColor; |
| 144 gl_Position = vec4(position, 1);}""" | 142 gl_Position = vec4(position, 1); |
| 143 gl_Position.x += ((material.baseColor.b - 0.5) * 2) - 0.5; | |
| 144 uv = position.xy + 0.5; | |
| 145 }""" | |
| 145 fragmentCode: string = """void main() { | 146 fragmentCode: string = """void main() { |
| 146 outColor = vec4(fragmentColor, 1);}""" | 147 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" |
| 147 QuadMesh = object | 148 QuadMesh = object |
| 148 position: GPUArray[Vec3f, VertexBuffer] | 149 position: GPUArray[Vec3f, VertexBuffer] |
| 149 indices: GPUArray[uint16, IndexBuffer] | 150 indices: GPUArray[uint16, IndexBuffer] |
| 150 | 151 |
| 151 var quad = QuadMesh( | 152 let R = TVec3[uint8]([255'u8, 0'u8, 0'u8]) |
| 152 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), | 153 let G = TVec3[uint8]([0'u8, 255'u8, 0'u8]) |
| 153 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 154 let B = TVec3[uint8]([0'u8, 0'u8, 255'u8]) |
| 154 ) | 155 let W = TVec3[uint8]([255'u8, 255'u8, 255'u8]) |
| 155 var mainSet = asDescriptorSet( | 156 var |
| 156 MainSet( | 157 quad = QuadMesh( |
| 157 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), | 158 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), |
| 158 materialSettings: asGPUValue(ObjectSettings(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), | 159 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
| 159 ) | 160 ) |
| 160 ) | 161 uniforms1 = asDescriptorSet( |
| 161 var settings = asDescriptorSet( | 162 Uniforms( |
| 162 OtherSet( | 163 material: asGPUValue(Material(baseColor: NewVec3f(1, 1, 1)), UniformBuffer), |
| 163 # TODO | 164 texture1: Texture[TVec3[uint8]](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], interpolation: VK_FILTER_NEAREST), |
| 164 ) | 165 ) |
| 165 ) | 166 ) |
| 167 uniforms2 = asDescriptorSet( | |
| 168 Uniforms( | |
| 169 material: asGPUValue(Material(baseColor: NewVec3f(0.5, 0.5, 0.5)), UniformBuffer), | |
| 170 texture1: Texture[TVec3[uint8]](width: 2, height: 2, data: @[R, G, B, W]), | |
| 171 ) | |
| 172 ) | |
| 166 | 173 |
| 167 AssignBuffers(renderdata, quad) | 174 AssignBuffers(renderdata, quad) |
| 168 AssignBuffers(renderdata, mainSet) | 175 AssignBuffers(renderdata, uniforms1) |
| 176 AssignBuffers(renderdata, uniforms2) | |
| 177 UploadTextures(renderdata, uniforms1) | |
| 178 UploadTextures(renderdata, uniforms2) | |
| 169 renderdata.FlushAllMemory() | 179 renderdata.FlushAllMemory() |
| 170 | 180 |
| 171 var pipeline = CreatePipeline[QuadShader](renderPass = mainRenderpass, samples = swapchain.samples) | 181 var pipeline = CreatePipeline[QuadShader](renderPass = mainRenderpass, samples = swapchain.samples) |
| 172 | 182 |
| 173 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], mainSet) | 183 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 184 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) | |
| 174 | 185 |
| 175 var c = 0 | 186 var c = 0 |
| 176 while UpdateInputs() and c < nFrames: | 187 while UpdateInputs() and c < nFrames: |
| 177 WithNextFrame(swapchain, framebuffer, commandbuffer): | 188 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 178 WithBind(commandbuffer, (mainSet, ), pipeline, swapchain.currentFiF): | 189 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)): | 190 WithPipeline(commandbuffer, pipeline): |
| 180 WithPipeline(commandbuffer, pipeline): | 191 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): |
| 181 Render(commandbuffer = commandbuffer, pipeline = pipeline, firstSet = mainSet, mesh = quad) | 192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 182 mainSet.data.renderSettings.data.brigthness = (c.float32 / nFrames.float32) | 193 WithBind(commandbuffer, (uniforms2, ), pipeline, swapchain.currentFiF): |
| 183 UpdateGPUBuffer(mainSet.data.renderSettings) | 194 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 184 renderdata.FlushAllMemory() | |
| 185 inc c | 195 inc c |
| 186 | 196 |
| 187 # cleanup | 197 # cleanup |
| 188 checkVkResult vkDeviceWaitIdle(vulkan.device) | 198 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 189 DestroyPipeline(pipeline) | 199 DestroyPipeline(pipeline) |
| 190 DestroyRenderData(renderdata) | 200 DestroyRenderData(renderdata) |
| 191 | 201 |
| 202 proc test_04_multiple_descriptorsets(nFrames: int) = | |
| 203 var renderdata = InitRenderData() | |
| 204 | |
| 205 type | |
| 206 RenderSettings = object | |
| 207 brigthness: float32 | |
| 208 Material = object | |
| 209 baseColor: Vec3f | |
| 210 ObjectSettings = object | |
| 211 scale: float32 | |
| 212 materialIndex: uint32 | |
| 213 Constants = object | |
| 214 offset: Vec2f | |
| 215 | |
| 216 ConstSet = object | |
| 217 constants: GPUValue[Constants, UniformBuffer] | |
| 218 MainSet = object | |
| 219 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] | |
| 220 material: array[2, GPUValue[Material, UniformBuffer]] | |
| 221 texture1: array[2, Texture[TVec1[uint8]]] | |
| 222 OtherSet = object | |
| 223 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped] | |
| 224 | |
| 225 QuadShader = object | |
| 226 position {.VertexAttribute.}: Vec3f | |
| 227 fragmentColor {.Pass.}: Vec3f | |
| 228 uv {.Pass.}: Vec2f | |
| 229 outColor {.ShaderOutput.}: Vec4f | |
| 230 descriptorSets {.DescriptorSets.}: (ConstSet, MainSet, OtherSet) | |
| 231 # code | |
| 232 vertexCode: string = """void main() { | |
| 233 fragmentColor = material[objectSettings.materialIndex].baseColor * renderSettings.brigthness; | |
| 234 gl_Position = vec4(position * objectSettings.scale, 1); | |
| 235 gl_Position.xy += constants.offset.xy; | |
| 236 gl_Position.x += material[objectSettings.materialIndex].baseColor.b - 0.5; | |
| 237 uv = position.xy + 0.5; | |
| 238 }""" | |
| 239 fragmentCode: string = """void main() { | |
| 240 outColor = vec4(fragmentColor * texture(texture1[objectSettings.materialIndex], uv).rrr, 1); | |
| 241 }""" | |
| 242 QuadMesh = object | |
| 243 position: GPUArray[Vec3f, VertexBuffer] | |
| 244 indices: GPUArray[uint16, IndexBuffer] | |
| 245 | |
| 246 var quad = QuadMesh( | |
| 247 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), | |
| 248 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | |
| 249 ) | |
| 250 var constset = asDescriptorSet( | |
| 251 ConstSet( | |
| 252 constants: asGPUValue(Constants(offset: NewVec2f(-0.3, 0.2)), UniformBuffer), | |
| 253 ) | |
| 254 ) | |
| 255 let G = TVec1[uint8]([50'u8]) | |
| 256 let W = TVec1[uint8]([255'u8]) | |
| 257 var mainset = asDescriptorSet( | |
| 258 MainSet( | |
| 259 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), | |
| 260 material: [ | |
| 261 asGPUValue(Material(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), | |
| 262 asGPUValue(Material(baseColor: NewVec3f(1, 0, 1)), UniformBuffer), | |
| 263 ], | |
| 264 texture1: [ | |
| 265 Texture[TVec1[uint8]](width: 2, height: 2, data: @[W, G, G, W], interpolation: VK_FILTER_NEAREST), | |
| 266 Texture[TVec1[uint8]](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], interpolation: VK_FILTER_NEAREST), | |
| 267 ], | |
| 268 ), | |
| 269 ) | |
| 270 var otherset1 = asDescriptorSet( | |
| 271 OtherSet( | |
| 272 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped), | |
| 273 ) | |
| 274 ) | |
| 275 var otherset2 = asDescriptorSet( | |
| 276 OtherSet( | |
| 277 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped), | |
| 278 ) | |
| 279 ) | |
| 280 | |
| 281 AssignBuffers(renderdata, quad) | |
| 282 AssignBuffers(renderdata, constset) | |
| 283 AssignBuffers(renderdata, mainset) | |
| 284 AssignBuffers(renderdata, otherset1) | |
| 285 AssignBuffers(renderdata, otherset2) | |
| 286 UploadTextures(renderdata, mainset) | |
| 287 renderdata.FlushAllMemory() | |
| 288 | |
| 289 var pipeline = CreatePipeline[QuadShader](renderPass = mainRenderpass, samples = swapchain.samples) | |
| 290 | |
| 291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) | |
| 292 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) | |
| 293 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) | |
| 294 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) | |
| 295 | |
| 296 var c = 0 | |
| 297 while UpdateInputs() and c < nFrames: | |
| 298 WithNextFrame(swapchain, framebuffer, commandbuffer): | |
| 299 WithRenderPass(mainRenderpass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | |
| 300 WithPipeline(commandbuffer, pipeline): | |
| 301 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline, swapchain.currentFiF): | |
| 302 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | |
| 303 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline, swapchain.currentFiF): | |
| 304 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | |
| 305 mainset.data.renderSettings.data.brigthness = (c.float32 / nFrames.float32) | |
| 306 otherset1.data.objectSettings.data.scale = 0.5 + (c.float32 / nFrames.float32) | |
| 307 UpdateGPUBuffer(mainset.data.renderSettings) | |
| 308 UpdateGPUBuffer(otherset1.data.objectSettings) | |
| 309 renderdata.FlushAllMemory() | |
| 310 inc c | |
| 311 | |
| 312 # cleanup | |
| 313 checkVkResult vkDeviceWaitIdle(vulkan.device) | |
| 314 DestroyPipeline(pipeline) | |
| 315 DestroyRenderData(renderdata) | |
| 316 | |
| 192 when isMainModule: | 317 when isMainModule: |
| 193 var nFrames = 5000 | 318 var nFrames = 5000 |
| 194 InitVulkan() | 319 InitVulkan() |
| 195 | 320 |
| 196 # test normal | 321 # test normal |
| 202 # test_01_triangle(nFrames) | 327 # test_01_triangle(nFrames) |
| 203 | 328 |
| 204 # tests instanced triangles and quads, mixing meshes and instances | 329 # tests instanced triangles and quads, mixing meshes and instances |
| 205 # test_02_triangle_quad_instanced(nFrames) | 330 # test_02_triangle_quad_instanced(nFrames) |
| 206 | 331 |
| 332 # test_03_simple_descriptorset(nFrames) | |
| 333 | |
| 207 # tests | 334 # tests |
| 208 test_03_global_descriptorset(nFrames) | 335 test_04_multiple_descriptorsets(nFrames) |
| 209 | 336 |
| 210 checkVkResult vkDeviceWaitIdle(vulkan.device) | 337 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 211 vkDestroyRenderPass(vulkan.device, mainRenderpass, nil) | 338 vkDestroyRenderPass(vulkan.device, mainRenderpass, nil) |
| 212 DestroySwapchain(swapchain) | 339 DestroySwapchain(swapchain) |
| 213 | 340 |
