Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1423:3b8a736c45a7
did: put almost all global state into a single struct
author | sam <sam@basx.dev> |
---|---|
date | Thu, 09 Jan 2025 23:03:47 +0700 |
parents | 5e5a3311ca44 |
children | 676fc13685a9 |
comparison
equal
deleted
inserted
replaced
1422:6f0c1b347403 | 1423:3b8a736c45a7 |
---|---|
6 import std/options | 6 import std/options |
7 import std/random | 7 import std/random |
8 | 8 |
9 import ../semicongine | 9 import ../semicongine |
10 | 10 |
11 proc test_01_triangle(time: float32) = | 11 proc test_01_triangle(time: float32, renderPass: RenderPass) = |
12 var renderdata = initRenderData() | 12 var renderdata = initRenderData() |
13 | 13 |
14 type | 14 type |
15 PushConstant = object | 15 PushConstant = object |
16 scale: float32 | 16 scale: float32 |
41 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), | 41 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), |
42 ) | 42 ) |
43 assignBuffers(renderdata, mesh) | 43 assignBuffers(renderdata, mesh) |
44 renderdata.flushAllMemory() | 44 renderdata.flushAllMemory() |
45 | 45 |
46 var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass) | 46 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
47 | 47 |
48 var start = getMonoTime() | 48 var start = getMonoTime() |
49 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 49 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
50 withNextFrame(framebuffer, commandbuffer): | 50 withNextFrame(framebuffer, commandbuffer): |
51 withRenderPass( | 51 withRenderPass( |
52 vulkan.swapchain.renderPass, | 52 renderPass, |
53 framebuffer, | 53 framebuffer, |
54 commandbuffer, | 54 commandbuffer, |
55 vulkan.swapchain.width, | 55 frameWidth(), |
56 vulkan.swapchain.height, | 56 frameHeight(), |
57 vec4(0, 0, 0, 0), | 57 vec4(0, 0, 0, 0), |
58 ): | 58 ): |
59 withPipeline(commandbuffer, pipeline): | 59 withPipeline(commandbuffer, pipeline): |
60 renderWithPushConstant( | 60 renderWithPushConstant( |
61 commandbuffer = commandbuffer, | 61 commandbuffer = commandbuffer, |
65 scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000) | 65 scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000) |
66 ), | 66 ), |
67 ) | 67 ) |
68 | 68 |
69 # cleanup | 69 # cleanup |
70 checkVkResult vkDeviceWaitIdle(vulkan.device) | 70 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
71 destroyPipeline(pipeline) | 71 destroyPipeline(pipeline) |
72 destroyRenderData(renderdata) | 72 destroyRenderData(renderdata) |
73 | 73 |
74 proc test_02_triangle_quad_instanced(time: float32) = | 74 proc test_02_triangle_quad_instanced(time: float32, renderPass: RenderPass) = |
75 var renderdata = initRenderData() | 75 var renderdata = initRenderData() |
76 | 76 |
77 type | 77 type |
78 SomeShader = object | 78 SomeShader = object |
79 position {.VertexAttribute.}: Vec3f | 79 position {.VertexAttribute.}: Vec3f |
134 assignBuffers(renderdata, quad) | 134 assignBuffers(renderdata, quad) |
135 assignBuffers(renderdata, instancesA) | 135 assignBuffers(renderdata, instancesA) |
136 assignBuffers(renderdata, instancesB) | 136 assignBuffers(renderdata, instancesB) |
137 renderdata.flushAllMemory() | 137 renderdata.flushAllMemory() |
138 | 138 |
139 var pipeline = createPipeline(SomeShader(), renderPass = vulkan.swapchain.renderPass) | 139 var pipeline = createPipeline(SomeShader(), renderPass = renderPass) |
140 | 140 |
141 var start = getMonoTime() | 141 var start = getMonoTime() |
142 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 142 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
143 withNextFrame(framebuffer, commandbuffer): | 143 withNextFrame(framebuffer, commandbuffer): |
144 withRenderPass( | 144 withRenderPass( |
145 vulkan.swapchain.renderPass, | 145 renderPass, |
146 framebuffer, | 146 framebuffer, |
147 commandbuffer, | 147 commandbuffer, |
148 vulkan.swapchain.width, | 148 frameWidth(), |
149 vulkan.swapchain.height, | 149 frameHeight(), |
150 vec4(0, 0, 0, 0), | 150 vec4(0, 0, 0, 0), |
151 ): | 151 ): |
152 withPipeline(commandbuffer, pipeline): | 152 withPipeline(commandbuffer, pipeline): |
153 render( | 153 render( |
154 commandbuffer = commandbuffer, | 154 commandbuffer = commandbuffer, |
174 mesh = tri, | 174 mesh = tri, |
175 instances = instancesB, | 175 instances = instancesB, |
176 ) | 176 ) |
177 | 177 |
178 # cleanup | 178 # cleanup |
179 checkVkResult vkDeviceWaitIdle(vulkan.device) | 179 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
180 destroyPipeline(pipeline) | 180 destroyPipeline(pipeline) |
181 destroyRenderData(renderdata) | 181 destroyRenderData(renderdata) |
182 | 182 |
183 proc test_03_simple_descriptorset(time: float32) = | 183 proc test_03_simple_descriptorset(time: float32, renderPass: RenderPass) = |
184 var renderdata = initRenderData() | 184 var renderdata = initRenderData() |
185 | 185 |
186 type | 186 type |
187 Material = object | 187 Material = object |
188 baseColor: Vec3f | 188 baseColor: Vec3f |
249 assignBuffers(renderdata, uniforms2) | 249 assignBuffers(renderdata, uniforms2) |
250 uploadImages(renderdata, uniforms1) | 250 uploadImages(renderdata, uniforms1) |
251 uploadImages(renderdata, uniforms2) | 251 uploadImages(renderdata, uniforms2) |
252 renderdata.flushAllMemory() | 252 renderdata.flushAllMemory() |
253 | 253 |
254 var pipeline = createPipeline(QuadShader(), renderPass = vulkan.swapchain.renderPass) | 254 var pipeline = createPipeline(QuadShader(), renderPass = renderPass) |
255 | 255 |
256 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 256 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
257 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) | 257 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) |
258 | 258 |
259 var start = getMonoTime() | 259 var start = getMonoTime() |
260 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 260 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
261 withNextFrame(framebuffer, commandbuffer): | 261 withNextFrame(framebuffer, commandbuffer): |
262 withRenderPass( | 262 withRenderPass( |
263 vulkan.swapchain.renderPass, | 263 renderPass, |
264 framebuffer, | 264 framebuffer, |
265 commandbuffer, | 265 commandbuffer, |
266 vulkan.swapchain.width, | 266 frameWidth(), |
267 vulkan.swapchain.height, | 267 frameHeight(), |
268 vec4(0, 0, 0, 0), | 268 vec4(0, 0, 0, 0), |
269 ): | 269 ): |
270 withPipeline(commandbuffer, pipeline): | 270 withPipeline(commandbuffer, pipeline): |
271 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 271 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
272 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 272 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
273 | 273 |
274 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline) | 274 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline) |
275 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 275 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
276 | 276 |
277 # cleanup | 277 # cleanup |
278 checkVkResult vkDeviceWaitIdle(vulkan.device) | 278 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
279 destroyPipeline(pipeline) | 279 destroyPipeline(pipeline) |
280 destroyRenderData(renderdata) | 280 destroyRenderData(renderdata) |
281 | 281 |
282 proc test_04_multiple_descriptorsets(time: float32) = | 282 proc test_04_multiple_descriptorsets(time: float32, renderPass: RenderPass) = |
283 var renderdata = initRenderData() | 283 var renderdata = initRenderData() |
284 | 284 |
285 type | 285 type |
286 RenderSettings = object | 286 RenderSettings = object |
287 brigthness: float32 | 287 brigthness: float32 |
388 assignBuffers(renderdata, otherset1) | 388 assignBuffers(renderdata, otherset1) |
389 assignBuffers(renderdata, otherset2) | 389 assignBuffers(renderdata, otherset2) |
390 uploadImages(renderdata, mainset) | 390 uploadImages(renderdata, mainset) |
391 renderdata.flushAllMemory() | 391 renderdata.flushAllMemory() |
392 | 392 |
393 var pipeline = createPipeline(QuadShader(), renderPass = vulkan.swapchain.renderPass) | 393 var pipeline = createPipeline(QuadShader(), renderPass = renderPass) |
394 | 394 |
395 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) | 395 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) |
396 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) | 396 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) |
397 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) | 397 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) |
398 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) | 398 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) |
402 withNextFrame(framebuffer, commandbuffer): | 402 withNextFrame(framebuffer, commandbuffer): |
403 bindDescriptorSet(commandbuffer, constset, 0, pipeline) | 403 bindDescriptorSet(commandbuffer, constset, 0, pipeline) |
404 bindDescriptorSet(commandbuffer, mainset, 1, pipeline) | 404 bindDescriptorSet(commandbuffer, mainset, 1, pipeline) |
405 | 405 |
406 withRenderPass( | 406 withRenderPass( |
407 vulkan.swapchain.renderPass, | 407 renderPass, |
408 framebuffer, | 408 framebuffer, |
409 commandbuffer, | 409 commandbuffer, |
410 vulkan.swapchain.width, | 410 frameWidth(), |
411 vulkan.swapchain.height, | 411 frameHeight(), |
412 vec4(0, 0, 0, 0), | 412 vec4(0, 0, 0, 0), |
413 ): | 413 ): |
414 withPipeline(commandbuffer, pipeline): | 414 withPipeline(commandbuffer, pipeline): |
415 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline) | 415 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline) |
416 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 416 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
425 updateGPUBuffer(mainset.data.renderSettings) | 425 updateGPUBuffer(mainset.data.renderSettings) |
426 updateGPUBuffer(otherset1.data.objectSettings) | 426 updateGPUBuffer(otherset1.data.objectSettings) |
427 renderdata.flushAllMemory() | 427 renderdata.flushAllMemory() |
428 | 428 |
429 # cleanup | 429 # cleanup |
430 checkVkResult vkDeviceWaitIdle(vulkan.device) | 430 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
431 destroyPipeline(pipeline) | 431 destroyPipeline(pipeline) |
432 destroyRenderData(renderdata) | 432 destroyRenderData(renderdata) |
433 | 433 |
434 proc test_05_cube(time: float32) = | 434 proc test_05_cube(time: float32, renderPass: RenderPass) = |
435 type | 435 type |
436 UniformData = object | 436 UniformData = object |
437 mvp: Mat4 | 437 mvp: Mat4 |
438 | 438 |
439 Uniforms = object | 439 Uniforms = object |
533 ) | 533 ) |
534 assignBuffers(renderdata, uniforms1) | 534 assignBuffers(renderdata, uniforms1) |
535 | 535 |
536 renderdata.flushAllMemory() | 536 renderdata.flushAllMemory() |
537 | 537 |
538 var pipeline = createPipeline(CubeShader(), renderPass = vulkan.swapchain.renderPass) | 538 var pipeline = createPipeline(CubeShader(), renderPass = renderPass) |
539 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 539 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
540 | 540 |
541 var tStart = getMonoTime() | 541 var tStart = getMonoTime() |
542 var t = tStart | 542 var t = tStart |
543 | 543 |
553 ) | 553 ) |
554 updateGPUBuffer(uniforms1.data.data, flush = true) | 554 updateGPUBuffer(uniforms1.data.data, flush = true) |
555 | 555 |
556 withNextFrame(framebuffer, commandbuffer): | 556 withNextFrame(framebuffer, commandbuffer): |
557 withRenderPass( | 557 withRenderPass( |
558 vulkan.swapchain.renderPass, | 558 renderPass, |
559 framebuffer, | 559 framebuffer, |
560 commandbuffer, | 560 commandbuffer, |
561 vulkan.swapchain.width, | 561 frameWidth(), |
562 vulkan.swapchain.height, | 562 frameHeight(), |
563 vec4(0, 0, 0, 0), | 563 vec4(0, 0, 0, 0), |
564 ): | 564 ): |
565 withPipeline(commandbuffer, pipeline): | 565 withPipeline(commandbuffer, pipeline): |
566 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 566 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
567 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 567 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
572 let waitTime = 16_666 - looptime.inMicroseconds | 572 let waitTime = 16_666 - looptime.inMicroseconds |
573 if waitTime > 0: | 573 if waitTime > 0: |
574 sleep((waitTime / 1000).int) | 574 sleep((waitTime / 1000).int) |
575 | 575 |
576 # cleanup | 576 # cleanup |
577 checkVkResult vkDeviceWaitIdle(vulkan.device) | 577 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
578 destroyPipeline(pipeline) | 578 destroyPipeline(pipeline) |
579 destroyRenderData(renderdata) | 579 destroyRenderData(renderdata) |
580 | 580 |
581 proc test_06_different_draw_modes(time: float32) = | 581 proc test_06_different_draw_modes(time: float32, renderPass: RenderPass) = |
582 var renderdata = initRenderData() | 582 var renderdata = initRenderData() |
583 | 583 |
584 type | 584 type |
585 Shader = object | 585 Shader = object |
586 position {.VertexAttribute.}: Vec3f | 586 position {.VertexAttribute.}: Vec3f |
620 assignBuffers(renderdata, lines) | 620 assignBuffers(renderdata, lines) |
621 renderdata.flushAllMemory() | 621 renderdata.flushAllMemory() |
622 | 622 |
623 var pipeline1 = createPipeline( | 623 var pipeline1 = createPipeline( |
624 Shader(), | 624 Shader(), |
625 renderPass = vulkan.swapchain.renderPass, | 625 renderPass = renderPass, |
626 polygonMode = VK_POLYGON_MODE_LINE, | 626 polygonMode = VK_POLYGON_MODE_LINE, |
627 lineWidth = 20'f32, | 627 lineWidth = 20'f32, |
628 ) | 628 ) |
629 var pipeline2 = createPipeline( | 629 var pipeline2 = createPipeline( |
630 Shader(), | 630 Shader(), renderPass = renderPass, polygonMode = VK_POLYGON_MODE_POINT |
631 renderPass = vulkan.swapchain.renderPass, | |
632 polygonMode = VK_POLYGON_MODE_POINT, | |
633 ) | 631 ) |
634 var pipeline3 = createPipeline( | 632 var pipeline3 = createPipeline( |
635 Shader(), | 633 Shader(), |
636 renderPass = vulkan.swapchain.renderPass, | 634 renderPass = renderPass, |
637 topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST, | 635 topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST, |
638 lineWidth = 5, | 636 lineWidth = 5, |
639 ) | 637 ) |
640 var pipeline4 = createPipeline( | 638 var pipeline4 = createPipeline( |
641 Shader(), | 639 Shader(), renderPass = renderPass, topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST |
642 renderPass = vulkan.swapchain.renderPass, | |
643 topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST, | |
644 ) | 640 ) |
645 | 641 |
646 var start = getMonoTime() | 642 var start = getMonoTime() |
647 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 643 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
648 withNextFrame(framebuffer, commandbuffer): | 644 withNextFrame(framebuffer, commandbuffer): |
649 withRenderPass( | 645 withRenderPass( |
650 vulkan.swapchain.renderPass, | 646 renderPass, |
651 framebuffer, | 647 framebuffer, |
652 commandbuffer, | 648 commandbuffer, |
653 vulkan.swapchain.width, | 649 frameWidth(), |
654 vulkan.swapchain.height, | 650 frameHeight(), |
655 vec4(0, 0, 0, 0), | 651 vec4(0, 0, 0, 0), |
656 ): | 652 ): |
657 withPipeline(commandbuffer, pipeline1): | 653 withPipeline(commandbuffer, pipeline1): |
658 render(commandbuffer = commandbuffer, pipeline = pipeline1, mesh = triangle) | 654 render(commandbuffer = commandbuffer, pipeline = pipeline1, mesh = triangle) |
659 withPipeline(commandbuffer, pipeline2): | 655 withPipeline(commandbuffer, pipeline2): |
662 render(commandbuffer = commandbuffer, pipeline = pipeline3, mesh = lines) | 658 render(commandbuffer = commandbuffer, pipeline = pipeline3, mesh = lines) |
663 withPipeline(commandbuffer, pipeline4): | 659 withPipeline(commandbuffer, pipeline4): |
664 render(commandbuffer = commandbuffer, pipeline = pipeline4, mesh = lines) | 660 render(commandbuffer = commandbuffer, pipeline = pipeline4, mesh = lines) |
665 | 661 |
666 # cleanup | 662 # cleanup |
667 checkVkResult vkDeviceWaitIdle(vulkan.device) | 663 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
668 destroyPipeline(pipeline1) | 664 destroyPipeline(pipeline1) |
669 destroyPipeline(pipeline2) | 665 destroyPipeline(pipeline2) |
670 destroyPipeline(pipeline3) | 666 destroyPipeline(pipeline3) |
671 destroyPipeline(pipeline4) | 667 destroyPipeline(pipeline4) |
672 destroyRenderData(renderdata) | 668 destroyRenderData(renderdata) |
673 | 669 |
674 proc test_08_texture_array(time: float32) = | 670 proc test_08_texture_array(time: float32, renderPass: RenderPass) = |
675 var renderdata = initRenderData() | 671 var renderdata = initRenderData() |
676 | 672 |
677 type | 673 type |
678 Uniforms = object | 674 Uniforms = object |
679 textures: ImageArray[BGRA] | 675 textures: ImageArray[BGRA] |
722 ), | 718 ), |
723 ) | 719 ) |
724 assignBuffers(renderdata, mesh) | 720 assignBuffers(renderdata, mesh) |
725 renderdata.flushAllMemory() | 721 renderdata.flushAllMemory() |
726 | 722 |
727 var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass) | 723 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
728 var uniforms1 = asDescriptorSetData( | 724 var uniforms1 = asDescriptorSetData( |
729 Uniforms(textures: loadImageArray[BGRA](["art.png", "art1.png"])) | 725 Uniforms(textures: loadImageArray[BGRA](["art.png", "art1.png"])) |
730 ) | 726 ) |
731 uploadImages(renderdata, uniforms1) | 727 uploadImages(renderdata, uniforms1) |
732 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 728 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
733 | 729 |
734 var start = getMonoTime() | 730 var start = getMonoTime() |
735 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 731 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
736 withNextFrame(framebuffer, commandbuffer): | 732 withNextFrame(framebuffer, commandbuffer): |
737 withRenderPass( | 733 withRenderPass( |
738 vulkan.swapchain.renderPass, | 734 renderPass, |
739 framebuffer, | 735 framebuffer, |
740 commandbuffer, | 736 commandbuffer, |
741 vulkan.swapchain.width, | 737 frameWidth(), |
742 vulkan.swapchain.height, | 738 frameHeight(), |
743 vec4(0, 0, 0, 0), | 739 vec4(0, 0, 0, 0), |
744 ): | 740 ): |
745 withPipeline(commandbuffer, pipeline): | 741 withPipeline(commandbuffer, pipeline): |
746 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 742 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
747 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 743 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
748 | 744 |
749 # cleanup | 745 # cleanup |
750 checkVkResult vkDeviceWaitIdle(vulkan.device) | 746 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
751 destroyPipeline(pipeline) | 747 destroyPipeline(pipeline) |
752 destroyRenderData(renderdata) | 748 destroyRenderData(renderdata) |
753 | 749 |
754 proc test_07_png_texture(time: float32) = | 750 proc test_07_png_texture(time: float32, renderPass: RenderPass) = |
755 var renderdata = initRenderData() | 751 var renderdata = initRenderData() |
756 | 752 |
757 type | 753 type |
758 Uniforms = object | 754 Uniforms = object |
759 texture1: Image[BGRA] | 755 texture1: Image[BGRA] |
799 ), | 795 ), |
800 ) | 796 ) |
801 assignBuffers(renderdata, mesh) | 797 assignBuffers(renderdata, mesh) |
802 renderdata.flushAllMemory() | 798 renderdata.flushAllMemory() |
803 | 799 |
804 var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass) | 800 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
805 var uniforms1 = asDescriptorSetData(Uniforms(texture1: loadImage[BGRA]("art.png"))) | 801 var uniforms1 = asDescriptorSetData(Uniforms(texture1: loadImage[BGRA]("art.png"))) |
806 uploadImages(renderdata, uniforms1) | 802 uploadImages(renderdata, uniforms1) |
807 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 803 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
808 | 804 |
809 var start = getMonoTime() | 805 var start = getMonoTime() |
810 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 806 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
811 withNextFrame(framebuffer, commandbuffer): | 807 withNextFrame(framebuffer, commandbuffer): |
812 withRenderPass( | 808 withRenderPass( |
813 vulkan.swapchain.renderPass, | 809 renderPass, |
814 framebuffer, | 810 framebuffer, |
815 commandbuffer, | 811 commandbuffer, |
816 vulkan.swapchain.width, | 812 frameWidth(), |
817 vulkan.swapchain.height, | 813 frameHeight(), |
818 vec4(0, 0, 0, 0), | 814 vec4(0, 0, 0, 0), |
819 ): | 815 ): |
820 withPipeline(commandbuffer, pipeline): | 816 withPipeline(commandbuffer, pipeline): |
821 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 817 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
822 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 818 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
823 | 819 |
824 # cleanup | 820 # cleanup |
825 checkVkResult vkDeviceWaitIdle(vulkan.device) | 821 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
826 destroyPipeline(pipeline) | 822 destroyPipeline(pipeline) |
827 destroyRenderData(renderdata) | 823 destroyRenderData(renderdata) |
828 | 824 |
829 proc test_09_triangle_2pass( | 825 proc test_09_triangle_2pass( |
830 time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits | 826 time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits |
896 asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer), | 892 asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer), |
897 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 893 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
898 ) | 894 ) |
899 var uniforms1 = asDescriptorSetData( | 895 var uniforms1 = asDescriptorSetData( |
900 Uniforms( | 896 Uniforms( |
901 frameTexture: Image[BGRA]( | 897 frameTexture: |
902 width: vulkan.swapchain.width, | 898 Image[BGRA](width: frameWidth(), height: frameHeight(), isRenderTarget: true) |
903 height: vulkan.swapchain.height, | |
904 isRenderTarget: true, | |
905 ) | |
906 ) | 899 ) |
907 ) | 900 ) |
908 assignBuffers(renderdata, mesh) | 901 assignBuffers(renderdata, mesh) |
909 assignBuffers(renderdata, quad) | 902 assignBuffers(renderdata, quad) |
910 uploadImages(renderdata, uniforms1) | 903 uploadImages(renderdata, uniforms1) |
921 depthImage: VkImage | 914 depthImage: VkImage |
922 depthImageView: VkImageView | 915 depthImageView: VkImageView |
923 depthMemory: VkDeviceMemory | 916 depthMemory: VkDeviceMemory |
924 if offscreenRP.depthBuffer: | 917 if offscreenRP.depthBuffer: |
925 depthImage = svkCreate2DImage( | 918 depthImage = svkCreate2DImage( |
926 width = vulkan.swapchain.width, | 919 width = frameWidth(), |
927 height = vulkan.swapchain.height, | 920 height = frameHeight(), |
928 format = DEPTH_FORMAT, | 921 format = DEPTH_FORMAT, |
929 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT], | 922 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT], |
930 samples = offscreenRP.samples, | 923 samples = offscreenRP.samples, |
931 ) | 924 ) |
932 let requirements = svkGetImageMemoryRequirements(depthImage) | 925 let requirements = svkGetImageMemoryRequirements(depthImage) |
933 depthMemory = svkAllocateMemory( | 926 depthMemory = svkAllocateMemory( |
934 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes) | 927 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes) |
935 ) | 928 ) |
936 checkVkResult vkBindImageMemory(vulkan.device, depthImage, depthMemory, 0) | 929 checkVkResult vkBindImageMemory(engine().vulkan.device, depthImage, depthMemory, 0) |
937 depthImageView = svkCreate2DImageView( | 930 depthImageView = svkCreate2DImageView( |
938 image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT | 931 image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT |
939 ) | 932 ) |
940 | 933 |
941 # create msaa images (will not use the one in the swapchain | 934 # create msaa images (will not use the one in the swapchain |
943 msaaImage: VkImage | 936 msaaImage: VkImage |
944 msaaImageView: VkImageView | 937 msaaImageView: VkImageView |
945 msaaMemory: VkDeviceMemory | 938 msaaMemory: VkDeviceMemory |
946 if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT: | 939 if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT: |
947 msaaImage = svkCreate2DImage( | 940 msaaImage = svkCreate2DImage( |
948 width = vulkan.swapchain.width, | 941 width = frameWidth(), |
949 height = vulkan.swapchain.height, | 942 height = frameHeight(), |
950 format = SURFACE_FORMAT, | 943 format = SURFACE_FORMAT, |
951 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT], | 944 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT], |
952 samples = offscreenRP.samples, | 945 samples = offscreenRP.samples, |
953 ) | 946 ) |
954 let requirements = svkGetImageMemoryRequirements(msaaImage) | 947 let requirements = svkGetImageMemoryRequirements(msaaImage) |
955 msaaMemory = svkAllocateMemory( | 948 msaaMemory = svkAllocateMemory( |
956 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes) | 949 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes) |
957 ) | 950 ) |
958 checkVkResult vkBindImageMemory(vulkan.device, msaaImage, msaaMemory, 0) | 951 checkVkResult vkBindImageMemory(engine().vulkan.device, msaaImage, msaaMemory, 0) |
959 msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT) | 952 msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT) |
960 | 953 |
961 var attachments: seq[VkImageView] | 954 var attachments: seq[VkImageView] |
962 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT: | 955 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT: |
963 if offscreenRP.depthBuffer: | 956 if offscreenRP.depthBuffer: |
968 if offscreenRP.depthBuffer: | 961 if offscreenRP.depthBuffer: |
969 attachments = | 962 attachments = |
970 @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview] | 963 @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview] |
971 else: | 964 else: |
972 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview] | 965 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview] |
973 var offscreenFB = svkCreateFramebuffer( | 966 var offscreenFB = |
974 offscreenRP.vk, vulkan.swapchain.width, vulkan.swapchain.height, attachments | 967 svkCreateFramebuffer(offscreenRP.vk, frameWidth(), frameHeight(), attachments) |
975 ) | |
976 | 968 |
977 var start = getMonoTime() | 969 var start = getMonoTime() |
978 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 970 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
979 withNextFrame(framebuffer, commandbuffer): | 971 withNextFrame(framebuffer, commandbuffer): |
980 withRenderPass( | 972 withRenderPass( |
981 offscreenRP, | 973 offscreenRP, |
982 offscreenFB, | 974 offscreenFB, |
983 commandbuffer, | 975 commandbuffer, |
984 vulkan.swapchain.width, | 976 frameWidth(), |
985 vulkan.swapchain.height, | 977 frameHeight(), |
986 vec4(0, 0, 0, 0), | 978 vec4(0, 0, 0, 0), |
987 ): | 979 ): |
988 withPipeline(commandbuffer, drawPipeline): | 980 withPipeline(commandbuffer, drawPipeline): |
989 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) | 981 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) |
990 | 982 |
991 withRenderPass( | 983 withRenderPass( |
992 presentRP, | 984 presentRP, |
993 framebuffer, | 985 framebuffer, |
994 commandbuffer, | 986 commandbuffer, |
995 vulkan.swapchain.width, | 987 frameWidth(), |
996 vulkan.swapchain.height, | 988 frameHeight(), |
997 vec4(0, 0, 0, 0), | 989 vec4(0, 0, 0, 0), |
998 ): | 990 ): |
999 withPipeline(commandbuffer, presentPipeline): | 991 withPipeline(commandbuffer, presentPipeline): |
1000 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline) | 992 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline) |
1001 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) | 993 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) |
1002 | 994 |
1003 # cleanup | 995 # cleanup |
1004 checkVkResult vkDeviceWaitIdle(vulkan.device) | 996 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1005 destroyPipeline(presentPipeline) | 997 destroyPipeline(presentPipeline) |
1006 destroyPipeline(drawPipeline) | 998 destroyPipeline(drawPipeline) |
1007 destroyRenderData(renderdata) | 999 destroyRenderData(renderdata) |
1008 if depthImage.Valid: | 1000 if depthImage.Valid: |
1009 vkDestroyImageView(vulkan.device, depthImageView, nil) | 1001 vkDestroyImageView(engine().vulkan.device, depthImageView, nil) |
1010 vkDestroyImage(vulkan.device, depthImage, nil) | 1002 vkDestroyImage(engine().vulkan.device, depthImage, nil) |
1011 vkFreeMemory(vulkan.device, depthMemory, nil) | 1003 vkFreeMemory(engine().vulkan.device, depthMemory, nil) |
1012 if msaaImage.Valid: | 1004 if msaaImage.Valid: |
1013 vkDestroyImageView(vulkan.device, msaaImageView, nil) | 1005 vkDestroyImageView(engine().vulkan.device, msaaImageView, nil) |
1014 vkDestroyImage(vulkan.device, msaaImage, nil) | 1006 vkDestroyImage(engine().vulkan.device, msaaImage, nil) |
1015 vkFreeMemory(vulkan.device, msaaMemory, nil) | 1007 vkFreeMemory(engine().vulkan.device, msaaMemory, nil) |
1016 destroyRenderPass(offscreenRP) | 1008 destroyRenderPass(offscreenRP) |
1017 destroyRenderPass(presentRP) | 1009 destroyRenderPass(presentRP) |
1018 vkDestroyFramebuffer(vulkan.device, offscreenFB, nil) | 1010 vkDestroyFramebuffer(engine().vulkan.device, offscreenFB, nil) |
1019 clearSwapchain() | 1011 clearSwapchain() |
1020 | 1012 |
1021 when isMainModule: | 1013 when isMainModule: |
1022 var time = 1'f32 | 1014 var time = 1'f32 |
1023 initVulkan() | 1015 initEngine("Test rendering") |
1024 | 1016 |
1025 var mainRenderpass: RenderPass | |
1026 var renderPasses = [ | 1017 var renderPasses = [ |
1027 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), | 1018 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), |
1028 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), | 1019 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), |
1029 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), | 1020 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), |
1030 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), | 1021 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), |
1035 var renderpass = | 1026 var renderpass = |
1036 createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | 1027 createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) |
1037 setupSwapchain(renderpass = renderpass) | 1028 setupSwapchain(renderpass = renderpass) |
1038 | 1029 |
1039 # tests a simple triangle with minimalistic shader and vertex format | 1030 # tests a simple triangle with minimalistic shader and vertex format |
1040 test_01_triangle(time) | 1031 test_01_triangle(time, renderpass) |
1041 | 1032 |
1042 # tests instanced triangles and quads, mixing meshes and instances | 1033 # tests instanced triangles and quads, mixing meshes and instances |
1043 test_02_triangle_quad_instanced(time) | 1034 test_02_triangle_quad_instanced(time, renderpass) |
1044 | 1035 |
1045 # teste descriptor sets | 1036 # teste descriptor sets |
1046 test_03_simple_descriptorset(time) | 1037 test_03_simple_descriptorset(time, renderpass) |
1047 | 1038 |
1048 # tests multiple descriptor sets and arrays | 1039 # tests multiple descriptor sets and arrays |
1049 test_04_multiple_descriptorsets(time) | 1040 test_04_multiple_descriptorsets(time, renderpass) |
1050 | 1041 |
1051 # rotating cube | 1042 # rotating cube |
1052 test_05_cube(time) | 1043 test_05_cube(time, renderpass) |
1053 | 1044 |
1054 # different draw modes (lines, points, and topologies) | 1045 # different draw modes (lines, points, and topologies) |
1055 test_06_different_draw_modes(time) | 1046 test_06_different_draw_modes(time, renderpass) |
1056 | 1047 |
1057 test_07_png_texture(time) | 1048 test_07_png_texture(time, renderpass) |
1058 | 1049 |
1059 test_08_texture_array(time) | 1050 test_08_texture_array(time, renderpass) |
1060 | 1051 |
1061 checkVkResult vkDeviceWaitIdle(vulkan.device) | 1052 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1062 destroyRenderPass(renderpass) | 1053 destroyRenderPass(renderpass) |
1063 clearSwapchain() | 1054 clearSwapchain() |
1064 | 1055 |
1065 # test multiple render passes | 1056 # test multiple render passes |
1066 for i, (depthBuffer, samples) in renderPasses: | 1057 for i, (depthBuffer, samples) in renderPasses: |