Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1235:c70fee6568f6
did: improv render tests to run without user input
| author | sam <sam@basx.dev> |
|---|---|
| date | Sat, 20 Jul 2024 15:45:02 +0700 |
| parents | 1cf698973dca |
| children | 69489a678141 |
comparison
equal
deleted
inserted
replaced
| 1234:841e12f33c47 | 1235:c70fee6568f6 |
|---|---|
| 5 import std/options | 5 import std/options |
| 6 import std/random | 6 import std/random |
| 7 | 7 |
| 8 import ../semiconginev2 | 8 import ../semiconginev2 |
| 9 | 9 |
| 10 proc test_01_triangle(nFrames: int, swapchain: var Swapchain) = | 10 proc test_01_triangle(time: float32, swapchain: var Swapchain) = |
| 11 var renderdata = InitRenderData() | 11 var renderdata = InitRenderData() |
| 12 | 12 |
| 13 type | 13 type |
| 14 TrianglShader = object | 14 TrianglShader = object |
| 15 position {.VertexAttribute.}: Vec3f | 15 position {.VertexAttribute.}: Vec3f |
| 33 renderdata.FlushAllMemory() | 33 renderdata.FlushAllMemory() |
| 34 | 34 |
| 35 var | 35 var |
| 36 pipeline = CreatePipeline[TrianglShader](renderPass = swapchain.renderPass) | 36 pipeline = CreatePipeline[TrianglShader](renderPass = swapchain.renderPass) |
| 37 | 37 |
| 38 var c = 0 | 38 var start = getMonoTime() |
| 39 while UpdateInputs() and c < nFrames: | 39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 40 WithNextFrame(swapchain, framebuffer, commandbuffer): | 40 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 41 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 41 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 42 WithPipeline(commandbuffer, pipeline): | 42 WithPipeline(commandbuffer, pipeline): |
| 43 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 43 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
| 44 inc c | |
| 45 | 44 |
| 46 # cleanup | 45 # cleanup |
| 47 checkVkResult vkDeviceWaitIdle(vulkan.device) | 46 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 48 DestroyPipeline(pipeline) | 47 DestroyPipeline(pipeline) |
| 49 DestroyRenderData(renderdata) | 48 DestroyRenderData(renderdata) |
| 50 | 49 |
| 51 | 50 |
| 52 proc test_02_triangle_quad_instanced(nFrames: int, swapchain: var Swapchain) = | 51 proc test_02_triangle_quad_instanced(time: float32, swapchain: var Swapchain) = |
| 53 var renderdata = InitRenderData() | 52 var renderdata = InitRenderData() |
| 54 | 53 |
| 55 type | 54 type |
| 56 SomeShader = object | 55 SomeShader = object |
| 57 position {.VertexAttribute.}: Vec3f | 56 position {.VertexAttribute.}: Vec3f |
| 101 AssignBuffers(renderdata, instancesB) | 100 AssignBuffers(renderdata, instancesB) |
| 102 renderdata.FlushAllMemory() | 101 renderdata.FlushAllMemory() |
| 103 | 102 |
| 104 var pipeline = CreatePipeline[SomeShader](renderPass = swapchain.renderPass) | 103 var pipeline = CreatePipeline[SomeShader](renderPass = swapchain.renderPass) |
| 105 | 104 |
| 106 var c = 0 | 105 var start = getMonoTime() |
| 107 while UpdateInputs() and c < nFrames: | 106 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 108 WithNextFrame(swapchain, framebuffer, commandbuffer): | 107 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 109 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 108 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 110 WithPipeline(commandbuffer, pipeline): | 109 WithPipeline(commandbuffer, pipeline): |
| 111 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) | 110 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) |
| 112 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) | 111 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) |
| 113 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) | 112 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) |
| 114 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) | 113 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) |
| 115 inc c | |
| 116 | 114 |
| 117 # cleanup | 115 # cleanup |
| 118 checkVkResult vkDeviceWaitIdle(vulkan.device) | 116 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 119 DestroyPipeline(pipeline) | 117 DestroyPipeline(pipeline) |
| 120 DestroyRenderData(renderdata) | 118 DestroyRenderData(renderdata) |
| 121 | 119 |
| 122 proc test_03_simple_descriptorset(nFrames: int, swapchain: var Swapchain) = | 120 proc test_03_simple_descriptorset(time: float32, swapchain: var Swapchain) = |
| 123 var renderdata = InitRenderData() | 121 var renderdata = InitRenderData() |
| 124 | 122 |
| 125 type | 123 type |
| 126 Material = object | 124 Material = object |
| 127 baseColor: Vec3f | 125 baseColor: Vec3f |
| 181 var pipeline = CreatePipeline[QuadShader](renderPass = swapchain.renderPass) | 179 var pipeline = CreatePipeline[QuadShader](renderPass = swapchain.renderPass) |
| 182 | 180 |
| 183 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 181 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 184 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) | 182 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) |
| 185 | 183 |
| 186 var c = 0 | 184 var start = getMonoTime() |
| 187 while UpdateInputs() and c < nFrames: | 185 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 188 WithNextFrame(swapchain, framebuffer, commandbuffer): | 186 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 189 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 187 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 190 WithPipeline(commandbuffer, pipeline): | 188 WithPipeline(commandbuffer, pipeline): |
| 191 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): | 189 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): |
| 192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 190 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 193 WithBind(commandbuffer, (uniforms2, ), pipeline, swapchain.currentFiF): | 191 WithBind(commandbuffer, (uniforms2, ), pipeline, swapchain.currentFiF): |
| 194 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 195 inc c | |
| 196 | 193 |
| 197 # cleanup | 194 # cleanup |
| 198 checkVkResult vkDeviceWaitIdle(vulkan.device) | 195 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 199 DestroyPipeline(pipeline) | 196 DestroyPipeline(pipeline) |
| 200 DestroyRenderData(renderdata) | 197 DestroyRenderData(renderdata) |
| 201 | 198 |
| 202 proc test_04_multiple_descriptorsets(nFrames: int, swapchain: var Swapchain) = | 199 proc test_04_multiple_descriptorsets(time: float32, swapchain: var Swapchain) = |
| 203 var renderdata = InitRenderData() | 200 var renderdata = InitRenderData() |
| 204 | 201 |
| 205 type | 202 type |
| 206 RenderSettings = object | 203 RenderSettings = object |
| 207 brigthness: float32 | 204 brigthness: float32 |
| 291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) | 288 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) |
| 292 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) | 289 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) |
| 293 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) | 290 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) |
| 294 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) | 291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) |
| 295 | 292 |
| 296 var c = 0 | 293 var start = getMonoTime() |
| 297 while UpdateInputs() and c < nFrames: | 294 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 298 TimeAndLog: | 295 TimeAndLog: |
| 299 WithNextFrame(swapchain, framebuffer, commandbuffer): | 296 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 300 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 297 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 301 WithPipeline(commandbuffer, pipeline): | 298 WithPipeline(commandbuffer, pipeline): |
| 302 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline, swapchain.currentFiF): | 299 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline, swapchain.currentFiF): |
| 303 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 300 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 304 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline, swapchain.currentFiF): | 301 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline, swapchain.currentFiF): |
| 305 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 302 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 306 mainset.data.renderSettings.data.brigthness = (c.float32 / nFrames.float32) | 303 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
| 307 otherset1.data.objectSettings.data.scale = 0.5 + (c.float32 / nFrames.float32) | 304 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
| 308 UpdateGPUBuffer(mainset.data.renderSettings) | 305 UpdateGPUBuffer(mainset.data.renderSettings) |
| 309 UpdateGPUBuffer(otherset1.data.objectSettings) | 306 UpdateGPUBuffer(otherset1.data.objectSettings) |
| 310 renderdata.FlushAllMemory() | 307 renderdata.FlushAllMemory() |
| 311 inc c | |
| 312 | 308 |
| 313 # cleanup | 309 # cleanup |
| 314 checkVkResult vkDeviceWaitIdle(vulkan.device) | 310 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 315 DestroyPipeline(pipeline) | 311 DestroyPipeline(pipeline) |
| 316 DestroyRenderData(renderdata) | 312 DestroyRenderData(renderdata) |
| 317 | 313 |
| 318 proc test_05_cube(nFrames: int, swapchain: var Swapchain) = | 314 proc test_05_cube(time: float32, swapchain: var Swapchain) = |
| 319 type | 315 type |
| 320 | 316 |
| 321 UniformData = object | 317 UniformData = object |
| 322 mvp: Mat4 | 318 mvp: Mat4 |
| 323 Uniforms = object | 319 Uniforms = object |
| 410 renderdata.FlushAllMemory() | 406 renderdata.FlushAllMemory() |
| 411 | 407 |
| 412 var pipeline = CreatePipeline[CubeShader](renderPass = swapchain.renderPass) | 408 var pipeline = CreatePipeline[CubeShader](renderPass = swapchain.renderPass) |
| 413 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 409 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 414 | 410 |
| 415 var c = 0 | |
| 416 var tStart = getMonoTime() | 411 var tStart = getMonoTime() |
| 417 var t = tStart | 412 var t = tStart |
| 418 while UpdateInputs() and c < nFrames: | 413 |
| 419 | 414 var start = getMonoTime() |
| 415 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | |
| 420 let tStartLoop = getMonoTime() - tStart | 416 let tStartLoop = getMonoTime() - tStart |
| 421 | 417 |
| 422 uniforms1.data.data.data.mvp = ( | 418 uniforms1.data.data.data.mvp = ( |
| 423 Perspective(-PI / 2, GetAspectRatio(swapchain), 0.01, 100) * | 419 Perspective(-PI / 2, GetAspectRatio(swapchain), 0.01, 100) * |
| 424 Translate(0, 0, 2) * | 420 Translate(0, 0, 2) * |
| 437 let looptime = tEndLoop - tStartLoop | 433 let looptime = tEndLoop - tStartLoop |
| 438 let waitTime = 16_666 - looptime.inMicroseconds | 434 let waitTime = 16_666 - looptime.inMicroseconds |
| 439 if waitTime > 0: | 435 if waitTime > 0: |
| 440 echo "sleep ", waitTime / 1000 | 436 echo "sleep ", waitTime / 1000 |
| 441 sleep((waitTime / 1000).int) | 437 sleep((waitTime / 1000).int) |
| 442 inc c | |
| 443 | 438 |
| 444 # cleanup | 439 # cleanup |
| 445 checkVkResult vkDeviceWaitIdle(vulkan.device) | 440 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 446 DestroyPipeline(pipeline) | 441 DestroyPipeline(pipeline) |
| 447 DestroyRenderData(renderdata) | 442 DestroyRenderData(renderdata) |
| 448 | 443 |
| 449 proc test_06_triangle_2pass(nFrames: int, depthBuffer: bool, samples: VkSampleCountFlagBits) = | 444 proc test_06_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = |
| 450 var | 445 var |
| 451 (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | 446 (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) |
| 452 swapchain = InitSwapchain(renderpass = presentRP).get() | 447 swapchain = InitSwapchain(renderpass = presentRP).get() |
| 453 | 448 |
| 454 var renderdata = InitRenderData() | 449 var renderdata = InitRenderData() |
| 591 swapchain.width, | 586 swapchain.width, |
| 592 swapchain.height, | 587 swapchain.height, |
| 593 attachments | 588 attachments |
| 594 ) | 589 ) |
| 595 | 590 |
| 596 var c = 0 | 591 var start = getMonoTime() |
| 597 while UpdateInputs() and c < nFrames: | 592 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 598 | 593 |
| 599 TimeAndLog: | 594 TimeAndLog: |
| 600 WithNextFrame(swapchain, framebuffer, commandbuffer): | 595 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 601 | 596 |
| 602 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 597 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 605 | 600 |
| 606 WithRenderPass(presentRP, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 601 WithRenderPass(presentRP, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 607 WithPipeline(commandbuffer, presentPipeline): | 602 WithPipeline(commandbuffer, presentPipeline): |
| 608 WithBind(commandbuffer, (uniforms1, ), presentPipeline, swapchain.currentFiF): | 603 WithBind(commandbuffer, (uniforms1, ), presentPipeline, swapchain.currentFiF): |
| 609 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) | 604 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) |
| 610 inc c | |
| 611 | 605 |
| 612 # cleanup | 606 # cleanup |
| 613 checkVkResult vkDeviceWaitIdle(vulkan.device) | 607 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 614 DestroyPipeline(presentPipeline) | 608 DestroyPipeline(presentPipeline) |
| 615 DestroyPipeline(drawPipeline) | 609 DestroyPipeline(drawPipeline) |
| 626 vkDestroyRenderPass(vulkan.device, presentRP.vk, nil) | 620 vkDestroyRenderPass(vulkan.device, presentRP.vk, nil) |
| 627 vkDestroyFramebuffer(vulkan.device, offscreenFB, nil) | 621 vkDestroyFramebuffer(vulkan.device, offscreenFB, nil) |
| 628 DestroySwapchain(swapchain) | 622 DestroySwapchain(swapchain) |
| 629 | 623 |
| 630 when isMainModule: | 624 when isMainModule: |
| 631 var nFrames = 3000 | 625 var time = 1'f32 |
| 632 InitVulkan() | 626 InitVulkan() |
| 633 | 627 |
| 634 var mainRenderpass: RenderPass | 628 var mainRenderpass: RenderPass |
| 635 var renderPasses = [ | 629 var renderPasses = [ |
| 636 # (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), | 630 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), |
| 637 # (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), | 631 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), |
| 638 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), | 632 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), |
| 639 # (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), | 633 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), |
| 640 ] | 634 ] |
| 641 | 635 |
| 642 # test normal | 636 # test normal |
| 643 for i, (depthBuffer, samples) in renderPasses: | 637 for i, (depthBuffer, samples) in renderPasses: |
| 644 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | 638 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) |
| 645 var swapchain = InitSwapchain(renderpass = renderpass).get() | 639 var swapchain = InitSwapchain(renderpass = renderpass).get() |
| 646 | 640 |
| 647 #[ | |
| 648 # tests a simple triangle with minimalistic shader and vertex format | 641 # tests a simple triangle with minimalistic shader and vertex format |
| 649 test_01_triangle(nFrames, swapchain) | 642 test_01_triangle(time, swapchain) |
| 650 | 643 |
| 651 # tests instanced triangles and quads, mixing meshes and instances | 644 # tests instanced triangles and quads, mixing meshes and instances |
| 652 test_02_triangle_quad_instanced(nFrames, swapchain) | 645 test_02_triangle_quad_instanced(time, swapchain) |
| 653 | 646 |
| 654 # teste descriptor sets | 647 # teste descriptor sets |
| 655 test_03_simple_descriptorset(nFrames, swapchain) | 648 test_03_simple_descriptorset(time, swapchain) |
| 656 | 649 |
| 657 # tests multiple descriptor sets and arrays | 650 # tests multiple descriptor sets and arrays |
| 658 test_04_multiple_descriptorsets(nFrames, swapchain) | 651 test_04_multiple_descriptorsets(time, swapchain) |
| 659 ]# | |
| 660 | 652 |
| 661 # rotating cube | 653 # rotating cube |
| 662 test_05_cube(999999999, swapchain) | 654 test_05_cube(time, swapchain) |
| 663 | 655 |
| 664 checkVkResult vkDeviceWaitIdle(vulkan.device) | 656 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 665 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | 657 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) |
| 666 DestroySwapchain(swapchain) | 658 DestroySwapchain(swapchain) |
| 667 | 659 |
| 668 # test multiple render passes | 660 # test multiple render passes |
| 669 # for i, (depthBuffer, samples) in renderPasses: | 661 for i, (depthBuffer, samples) in renderPasses: |
| 670 # test_06_triangle_2pass(nFrames, depthBuffer, samples) | 662 test_06_triangle_2pass(time, depthBuffer, samples) |
| 671 | 663 |
| 672 DestroyVulkan() | 664 DestroyVulkan() |
