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: