comparison tests/test_rendering.nim @ 1239:69489a678141

add: better syncing, better swapchain access, correct font offset, two font-rendering tests
author sam <sam@basx.dev>
date Mon, 22 Jul 2024 00:46:10 +0700
parents c70fee6568f6
children 42eeb59f3a43
comparison
equal deleted inserted replaced
1238:03634915bbdb 1239:69489a678141
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(time: float32, swapchain: var Swapchain) = 10 proc test_01_triangle(time: float32) =
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
31 ) 31 )
32 AssignBuffers(renderdata, mesh) 32 AssignBuffers(renderdata, mesh)
33 renderdata.FlushAllMemory() 33 renderdata.FlushAllMemory()
34 34
35 var 35 var
36 pipeline = CreatePipeline[TrianglShader](renderPass = swapchain.renderPass) 36 pipeline = CreatePipeline[TrianglShader](renderPass = vulkan.swapchain.renderPass)
37 37
38 var start = getMonoTime() 38 var start = getMonoTime()
39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
40 WithNextFrame(swapchain, framebuffer, commandbuffer): 40 WithNextFrame(framebuffer, commandbuffer):
41 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 41 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.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 44
45 # cleanup 45 # cleanup
46 checkVkResult vkDeviceWaitIdle(vulkan.device) 46 checkVkResult vkDeviceWaitIdle(vulkan.device)
47 DestroyPipeline(pipeline) 47 DestroyPipeline(pipeline)
48 DestroyRenderData(renderdata) 48 DestroyRenderData(renderdata)
49 49
50 50
51 proc test_02_triangle_quad_instanced(time: float32, swapchain: var Swapchain) = 51 proc test_02_triangle_quad_instanced(time: float32) =
52 var renderdata = InitRenderData() 52 var renderdata = InitRenderData()
53 53
54 type 54 type
55 SomeShader = object 55 SomeShader = object
56 position {.VertexAttribute.}: Vec3f 56 position {.VertexAttribute.}: Vec3f
98 AssignBuffers(renderdata, quad) 98 AssignBuffers(renderdata, quad)
99 AssignBuffers(renderdata, instancesA) 99 AssignBuffers(renderdata, instancesA)
100 AssignBuffers(renderdata, instancesB) 100 AssignBuffers(renderdata, instancesB)
101 renderdata.FlushAllMemory() 101 renderdata.FlushAllMemory()
102 102
103 var pipeline = CreatePipeline[SomeShader](renderPass = swapchain.renderPass) 103 var pipeline = CreatePipeline[SomeShader](renderPass = vulkan.swapchain.renderPass)
104 104
105 var start = getMonoTime() 105 var start = getMonoTime()
106 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 106 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
107 WithNextFrame(swapchain, framebuffer, commandbuffer): 107 WithNextFrame(framebuffer, commandbuffer):
108 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 108 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
109 WithPipeline(commandbuffer, pipeline): 109 WithPipeline(commandbuffer, pipeline):
110 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) 110 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA)
111 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) 111 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB)
112 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) 112 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA)
113 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) 113 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB)
115 # cleanup 115 # cleanup
116 checkVkResult vkDeviceWaitIdle(vulkan.device) 116 checkVkResult vkDeviceWaitIdle(vulkan.device)
117 DestroyPipeline(pipeline) 117 DestroyPipeline(pipeline)
118 DestroyRenderData(renderdata) 118 DestroyRenderData(renderdata)
119 119
120 proc test_03_simple_descriptorset(time: float32, swapchain: var Swapchain) = 120 proc test_03_simple_descriptorset(time: float32) =
121 var renderdata = InitRenderData() 121 var renderdata = InitRenderData()
122 122
123 type 123 type
124 Material = object 124 Material = object
125 baseColor: Vec3f 125 baseColor: Vec3f
174 AssignBuffers(renderdata, uniforms2) 174 AssignBuffers(renderdata, uniforms2)
175 UploadImages(renderdata, uniforms1) 175 UploadImages(renderdata, uniforms1)
176 UploadImages(renderdata, uniforms2) 176 UploadImages(renderdata, uniforms2)
177 renderdata.FlushAllMemory() 177 renderdata.FlushAllMemory()
178 178
179 var pipeline = CreatePipeline[QuadShader](renderPass = swapchain.renderPass) 179 var pipeline = CreatePipeline[QuadShader](renderPass = vulkan.swapchain.renderPass)
180 180
181 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) 181 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
182 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) 182 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2)
183 183
184 var start = getMonoTime() 184 var start = getMonoTime()
185 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 185 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
186 WithNextFrame(swapchain, framebuffer, commandbuffer): 186 WithNextFrame(framebuffer, commandbuffer):
187 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 187 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
188 WithPipeline(commandbuffer, pipeline): 188 WithPipeline(commandbuffer, pipeline):
189 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): 189 WithBind(commandbuffer, (uniforms1, ), pipeline):
190 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 190 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
191 WithBind(commandbuffer, (uniforms2, ), pipeline, swapchain.currentFiF): 191 WithBind(commandbuffer, (uniforms2, ), pipeline):
192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
193 193
194 # cleanup 194 # cleanup
195 checkVkResult vkDeviceWaitIdle(vulkan.device) 195 checkVkResult vkDeviceWaitIdle(vulkan.device)
196 DestroyPipeline(pipeline) 196 DestroyPipeline(pipeline)
197 DestroyRenderData(renderdata) 197 DestroyRenderData(renderdata)
198 198
199 proc test_04_multiple_descriptorsets(time: float32, swapchain: var Swapchain) = 199 proc test_04_multiple_descriptorsets(time: float32) =
200 var renderdata = InitRenderData() 200 var renderdata = InitRenderData()
201 201
202 type 202 type
203 RenderSettings = object 203 RenderSettings = object
204 brigthness: float32 204 brigthness: float32
281 AssignBuffers(renderdata, otherset1) 281 AssignBuffers(renderdata, otherset1)
282 AssignBuffers(renderdata, otherset2) 282 AssignBuffers(renderdata, otherset2)
283 UploadImages(renderdata, mainset) 283 UploadImages(renderdata, mainset)
284 renderdata.FlushAllMemory() 284 renderdata.FlushAllMemory()
285 285
286 var pipeline = CreatePipeline[QuadShader](renderPass = swapchain.renderPass) 286 var pipeline = CreatePipeline[QuadShader](renderPass = vulkan.swapchain.renderPass)
287 287
288 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) 288 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset)
289 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) 289 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset)
290 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) 290 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1)
291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) 291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2)
292 292
293 var start = getMonoTime() 293 var start = getMonoTime()
294 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 294 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
295 TimeAndLog: 295 TimeAndLog:
296 WithNextFrame(swapchain, framebuffer, commandbuffer): 296 WithNextFrame(framebuffer, commandbuffer):
297 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 297 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
298 WithPipeline(commandbuffer, pipeline): 298 WithPipeline(commandbuffer, pipeline):
299 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline, swapchain.currentFiF): 299 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline):
300 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 300 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
301 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline, swapchain.currentFiF): 301 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline):
302 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 302 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
303 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time 303 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
304 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time 304 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time
305 UpdateGPUBuffer(mainset.data.renderSettings) 305 UpdateGPUBuffer(mainset.data.renderSettings)
306 UpdateGPUBuffer(otherset1.data.objectSettings) 306 UpdateGPUBuffer(otherset1.data.objectSettings)
309 # cleanup 309 # cleanup
310 checkVkResult vkDeviceWaitIdle(vulkan.device) 310 checkVkResult vkDeviceWaitIdle(vulkan.device)
311 DestroyPipeline(pipeline) 311 DestroyPipeline(pipeline)
312 DestroyRenderData(renderdata) 312 DestroyRenderData(renderdata)
313 313
314 proc test_05_cube(time: float32, swapchain: var Swapchain) = 314 proc test_05_cube(time: float32) =
315 type 315 type
316 316
317 UniformData = object 317 UniformData = object
318 mvp: Mat4 318 mvp: Mat4
319 Uniforms = object 319 Uniforms = object
403 ) 403 )
404 AssignBuffers(renderdata, uniforms1) 404 AssignBuffers(renderdata, uniforms1)
405 405
406 renderdata.FlushAllMemory() 406 renderdata.FlushAllMemory()
407 407
408 var pipeline = CreatePipeline[CubeShader](renderPass = swapchain.renderPass) 408 var pipeline = CreatePipeline[CubeShader](renderPass = vulkan.swapchain.renderPass)
409 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) 409 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
410 410
411 var tStart = getMonoTime() 411 var tStart = getMonoTime()
412 var t = tStart 412 var t = tStart
413 413
414 var start = getMonoTime() 414 var start = getMonoTime()
415 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 415 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
416 let tStartLoop = getMonoTime() - tStart 416 let tStartLoop = getMonoTime() - tStart
417 417
418 uniforms1.data.data.data.mvp = ( 418 uniforms1.data.data.data.mvp = (
419 Perspective(-PI / 2, GetAspectRatio(swapchain), 0.01, 100) * 419 Perspective(-PI / 2, GetAspectRatio(), 0.01, 100) *
420 Translate(0, 0, 2) * 420 Translate(0, 0, 2) *
421 Rotate(PI / 4, X) * 421 Rotate(PI / 4, X) *
422 Rotate(PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y) 422 Rotate(PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y)
423 ) 423 )
424 UpdateGPUBuffer(uniforms1.data.data, flush = true) 424 UpdateGPUBuffer(uniforms1.data.data, flush = true)
425 WithNextFrame(swapchain, framebuffer, commandbuffer): 425 WithNextFrame(framebuffer, commandbuffer):
426 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 426 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
427 WithPipeline(commandbuffer, pipeline): 427 WithPipeline(commandbuffer, pipeline):
428 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): 428 WithBind(commandbuffer, (uniforms1, ), pipeline):
429 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) 429 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh)
430 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) 430 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor)
431 431
432 let tEndLoop = getMonoTime() - tStart 432 let tEndLoop = getMonoTime() - tStart
433 let looptime = tEndLoop - tStartLoop 433 let looptime = tEndLoop - tStartLoop
440 checkVkResult vkDeviceWaitIdle(vulkan.device) 440 checkVkResult vkDeviceWaitIdle(vulkan.device)
441 DestroyPipeline(pipeline) 441 DestroyPipeline(pipeline)
442 DestroyRenderData(renderdata) 442 DestroyRenderData(renderdata)
443 443
444 proc test_06_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = 444 proc test_06_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) =
445 var 445 var (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
446 (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) 446
447 swapchain = InitSwapchain(renderpass = presentRP).get() 447 SetupSwapchain(renderpass = presentRP)
448 448
449 var renderdata = InitRenderData() 449 var renderdata = InitRenderData()
450 450
451 type 451 type
452 Uniforms = object 452 Uniforms = object
497 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer), 497 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer),
498 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 498 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
499 ) 499 )
500 var uniforms1 = asDescriptorSet( 500 var uniforms1 = asDescriptorSet(
501 Uniforms( 501 Uniforms(
502 frameTexture: Image[TVec4[uint8]](width: swapchain.width, height: swapchain.height, isRenderTarget: true), 502 frameTexture: Image[TVec4[uint8]](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true),
503 ) 503 )
504 ) 504 )
505 AssignBuffers(renderdata, mesh) 505 AssignBuffers(renderdata, mesh)
506 AssignBuffers(renderdata, quad) 506 AssignBuffers(renderdata, quad)
507 UploadImages(renderdata, uniforms1) 507 UploadImages(renderdata, uniforms1)
518 depthImage: VkImage 518 depthImage: VkImage
519 depthImageView: VkImageView 519 depthImageView: VkImageView
520 depthMemory: VkDeviceMemory 520 depthMemory: VkDeviceMemory
521 if offscreenRP.depthBuffer: 521 if offscreenRP.depthBuffer:
522 depthImage = svkCreate2DImage( 522 depthImage = svkCreate2DImage(
523 width = swapchain.width, 523 width = vulkan.swapchain.width,
524 height = swapchain.height, 524 height = vulkan.swapchain.height,
525 format = DEPTH_FORMAT, 525 format = DEPTH_FORMAT,
526 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT], 526 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT],
527 samples = offscreenRP.samples, 527 samples = offscreenRP.samples,
528 ) 528 )
529 let requirements = svkGetImageMemoryRequirements(depthImage) 529 let requirements = svkGetImageMemoryRequirements(depthImage)
548 msaaImage: VkImage 548 msaaImage: VkImage
549 msaaImageView: VkImageView 549 msaaImageView: VkImageView
550 msaaMemory: VkDeviceMemory 550 msaaMemory: VkDeviceMemory
551 if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT: 551 if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT:
552 msaaImage = svkCreate2DImage( 552 msaaImage = svkCreate2DImage(
553 width = swapchain.width, 553 width = vulkan.swapchain.width,
554 height = swapchain.height, 554 height = vulkan.swapchain.height,
555 format = SURFACE_FORMAT, 555 format = SURFACE_FORMAT,
556 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT], 556 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT],
557 samples = offscreenRP.samples, 557 samples = offscreenRP.samples,
558 ) 558 )
559 let requirements = svkGetImageMemoryRequirements(msaaImage) 559 let requirements = svkGetImageMemoryRequirements(msaaImage)
581 else: 581 else:
582 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview] 582 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview]
583 echo attachments 583 echo attachments
584 var offscreenFB = svkCreateFramebuffer( 584 var offscreenFB = svkCreateFramebuffer(
585 offscreenRP.vk, 585 offscreenRP.vk,
586 swapchain.width, 586 vulkan.swapchain.width,
587 swapchain.height, 587 vulkan.swapchain.height,
588 attachments 588 attachments
589 ) 589 )
590 590
591 var start = getMonoTime() 591 var start = getMonoTime()
592 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 592 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
593 593
594 TimeAndLog: 594 TimeAndLog:
595 WithNextFrame(swapchain, framebuffer, commandbuffer): 595 WithNextFrame(framebuffer, commandbuffer):
596 596
597 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 597 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
598 WithPipeline(commandbuffer, drawPipeline): 598 WithPipeline(commandbuffer, drawPipeline):
599 Render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) 599 Render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh)
600 600
601 WithRenderPass(presentRP, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): 601 WithRenderPass(presentRP, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
602 WithPipeline(commandbuffer, presentPipeline): 602 WithPipeline(commandbuffer, presentPipeline):
603 WithBind(commandbuffer, (uniforms1, ), presentPipeline, swapchain.currentFiF): 603 WithBind(commandbuffer, (uniforms1, ), presentPipeline):
604 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) 604 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad)
605 605
606 # cleanup 606 # cleanup
607 checkVkResult vkDeviceWaitIdle(vulkan.device) 607 checkVkResult vkDeviceWaitIdle(vulkan.device)
608 DestroyPipeline(presentPipeline) 608 DestroyPipeline(presentPipeline)
617 vkDestroyImage(vulkan.device, msaaImage, nil) 617 vkDestroyImage(vulkan.device, msaaImage, nil)
618 vkFreeMemory(vulkan.device, msaaMemory, nil) 618 vkFreeMemory(vulkan.device, msaaMemory, nil)
619 vkDestroyRenderPass(vulkan.device, offscreenRP.vk, nil) 619 vkDestroyRenderPass(vulkan.device, offscreenRP.vk, nil)
620 vkDestroyRenderPass(vulkan.device, presentRP.vk, nil) 620 vkDestroyRenderPass(vulkan.device, presentRP.vk, nil)
621 vkDestroyFramebuffer(vulkan.device, offscreenFB, nil) 621 vkDestroyFramebuffer(vulkan.device, offscreenFB, nil)
622 DestroySwapchain(swapchain) 622 ClearSwapchain()
623 623
624 when isMainModule: 624 when isMainModule:
625 var time = 1'f32 625 var time = 1'f32
626 InitVulkan() 626 InitVulkan()
627 627
634 ] 634 ]
635 635
636 # test normal 636 # test normal
637 for i, (depthBuffer, samples) in renderPasses: 637 for i, (depthBuffer, samples) in renderPasses:
638 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) 638 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
639 var swapchain = InitSwapchain(renderpass = renderpass).get() 639 SetupSwapchain(renderpass = renderpass)
640 640
641 # tests a simple triangle with minimalistic shader and vertex format 641 # tests a simple triangle with minimalistic shader and vertex format
642 test_01_triangle(time, swapchain) 642 test_01_triangle(time)
643 643
644 # tests instanced triangles and quads, mixing meshes and instances 644 # tests instanced triangles and quads, mixing meshes and instances
645 test_02_triangle_quad_instanced(time, swapchain) 645 test_02_triangle_quad_instanced(time)
646 646
647 # teste descriptor sets 647 # teste descriptor sets
648 test_03_simple_descriptorset(time, swapchain) 648 test_03_simple_descriptorset(time)
649 649
650 # tests multiple descriptor sets and arrays 650 # tests multiple descriptor sets and arrays
651 test_04_multiple_descriptorsets(time, swapchain) 651 test_04_multiple_descriptorsets(time)
652 652
653 # rotating cube 653 # rotating cube
654 test_05_cube(time, swapchain) 654 test_05_cube(time)
655 655
656 checkVkResult vkDeviceWaitIdle(vulkan.device) 656 checkVkResult vkDeviceWaitIdle(vulkan.device)
657 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) 657 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)
658 DestroySwapchain(swapchain) 658 ClearSwapchain()
659 659
660 # test multiple render passes 660 # test multiple render passes
661 for i, (depthBuffer, samples) in renderPasses: 661 for i, (depthBuffer, samples) in renderPasses:
662 test_06_triangle_2pass(time, depthBuffer, samples) 662 test_06_triangle_2pass(time, depthBuffer, samples)
663 663