diff 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
line wrap: on
line diff
--- a/tests/test_rendering.nim	Thu Jan 09 01:03:06 2025 +0700
+++ b/tests/test_rendering.nim	Thu Jan 09 23:03:47 2025 +0700
@@ -8,7 +8,7 @@
 
 import ../semicongine
 
-proc test_01_triangle(time: float32) =
+proc test_01_triangle(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -43,17 +43,17 @@
   assignBuffers(renderdata, mesh)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(Shader(), renderPass = renderPass)
 
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -67,11 +67,11 @@
           )
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_02_triangle_quad_instanced(time: float32) =
+proc test_02_triangle_quad_instanced(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -136,17 +136,17 @@
   assignBuffers(renderdata, instancesB)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(SomeShader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(SomeShader(), renderPass = renderPass)
 
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -176,11 +176,11 @@
           )
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_03_simple_descriptorset(time: float32) =
+proc test_03_simple_descriptorset(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -251,7 +251,7 @@
   uploadImages(renderdata, uniforms2)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(QuadShader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(QuadShader(), renderPass = renderPass)
 
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2)
@@ -260,11 +260,11 @@
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -275,11 +275,11 @@
           render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_04_multiple_descriptorsets(time: float32) =
+proc test_04_multiple_descriptorsets(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -390,7 +390,7 @@
   uploadImages(renderdata, mainset)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(QuadShader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(QuadShader(), renderPass = renderPass)
 
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset)
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset)
@@ -404,11 +404,11 @@
       bindDescriptorSet(commandbuffer, mainset, 1, pipeline)
 
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -427,11 +427,11 @@
     renderdata.flushAllMemory()
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_05_cube(time: float32) =
+proc test_05_cube(time: float32, renderPass: RenderPass) =
   type
     UniformData = object
       mvp: Mat4
@@ -535,7 +535,7 @@
 
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(CubeShader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(CubeShader(), renderPass = renderPass)
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
 
   var tStart = getMonoTime()
@@ -555,11 +555,11 @@
 
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -574,11 +574,11 @@
       sleep((waitTime / 1000).int)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_06_different_draw_modes(time: float32) =
+proc test_06_different_draw_modes(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -622,36 +622,32 @@
 
   var pipeline1 = createPipeline(
     Shader(),
-    renderPass = vulkan.swapchain.renderPass,
+    renderPass = renderPass,
     polygonMode = VK_POLYGON_MODE_LINE,
     lineWidth = 20'f32,
   )
   var pipeline2 = createPipeline(
-    Shader(),
-    renderPass = vulkan.swapchain.renderPass,
-    polygonMode = VK_POLYGON_MODE_POINT,
+    Shader(), renderPass = renderPass, polygonMode = VK_POLYGON_MODE_POINT
   )
   var pipeline3 = createPipeline(
     Shader(),
-    renderPass = vulkan.swapchain.renderPass,
+    renderPass = renderPass,
     topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
     lineWidth = 5,
   )
   var pipeline4 = createPipeline(
-    Shader(),
-    renderPass = vulkan.swapchain.renderPass,
-    topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
+    Shader(), renderPass = renderPass, topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST
   )
 
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline1):
@@ -664,14 +660,14 @@
           render(commandbuffer = commandbuffer, pipeline = pipeline4, mesh = lines)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline1)
   destroyPipeline(pipeline2)
   destroyPipeline(pipeline3)
   destroyPipeline(pipeline4)
   destroyRenderData(renderdata)
 
-proc test_08_texture_array(time: float32) =
+proc test_08_texture_array(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -724,7 +720,7 @@
   assignBuffers(renderdata, mesh)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(Shader(), renderPass = renderPass)
   var uniforms1 = asDescriptorSetData(
     Uniforms(textures: loadImageArray[BGRA](["art.png", "art1.png"]))
   )
@@ -735,11 +731,11 @@
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -747,11 +743,11 @@
           render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
-proc test_07_png_texture(time: float32) =
+proc test_07_png_texture(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
 
   type
@@ -801,7 +797,7 @@
   assignBuffers(renderdata, mesh)
   renderdata.flushAllMemory()
 
-  var pipeline = createPipeline(Shader(), renderPass = vulkan.swapchain.renderPass)
+  var pipeline = createPipeline(Shader(), renderPass = renderPass)
   var uniforms1 = asDescriptorSetData(Uniforms(texture1: loadImage[BGRA]("art.png")))
   uploadImages(renderdata, uniforms1)
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
@@ -810,11 +806,11 @@
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
-        vulkan.swapchain.renderPass,
+        renderPass,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, pipeline):
@@ -822,7 +818,7 @@
           render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
   destroyRenderData(renderdata)
 
@@ -898,11 +894,8 @@
   )
   var uniforms1 = asDescriptorSetData(
     Uniforms(
-      frameTexture: Image[BGRA](
-        width: vulkan.swapchain.width,
-        height: vulkan.swapchain.height,
-        isRenderTarget: true,
-      )
+      frameTexture:
+        Image[BGRA](width: frameWidth(), height: frameHeight(), isRenderTarget: true)
     )
   )
   assignBuffers(renderdata, mesh)
@@ -923,8 +916,8 @@
     depthMemory: VkDeviceMemory
   if offscreenRP.depthBuffer:
     depthImage = svkCreate2DImage(
-      width = vulkan.swapchain.width,
-      height = vulkan.swapchain.height,
+      width = frameWidth(),
+      height = frameHeight(),
       format = DEPTH_FORMAT,
       usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT],
       samples = offscreenRP.samples,
@@ -933,7 +926,7 @@
     depthMemory = svkAllocateMemory(
       requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)
     )
-    checkVkResult vkBindImageMemory(vulkan.device, depthImage, depthMemory, 0)
+    checkVkResult vkBindImageMemory(engine().vulkan.device, depthImage, depthMemory, 0)
     depthImageView = svkCreate2DImageView(
       image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT
     )
@@ -945,8 +938,8 @@
     msaaMemory: VkDeviceMemory
   if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT:
     msaaImage = svkCreate2DImage(
-      width = vulkan.swapchain.width,
-      height = vulkan.swapchain.height,
+      width = frameWidth(),
+      height = frameHeight(),
       format = SURFACE_FORMAT,
       usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT],
       samples = offscreenRP.samples,
@@ -955,7 +948,7 @@
     msaaMemory = svkAllocateMemory(
       requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)
     )
-    checkVkResult vkBindImageMemory(vulkan.device, msaaImage, msaaMemory, 0)
+    checkVkResult vkBindImageMemory(engine().vulkan.device, msaaImage, msaaMemory, 0)
     msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT)
 
   var attachments: seq[VkImageView]
@@ -970,9 +963,8 @@
         @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview]
     else:
       attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview]
-  var offscreenFB = svkCreateFramebuffer(
-    offscreenRP.vk, vulkan.swapchain.width, vulkan.swapchain.height, attachments
-  )
+  var offscreenFB =
+    svkCreateFramebuffer(offscreenRP.vk, frameWidth(), frameHeight(), attachments)
 
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
@@ -981,8 +973,8 @@
         offscreenRP,
         offscreenFB,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, drawPipeline):
@@ -992,8 +984,8 @@
         presentRP,
         framebuffer,
         commandbuffer,
-        vulkan.swapchain.width,
-        vulkan.swapchain.height,
+        frameWidth(),
+        frameHeight(),
         vec4(0, 0, 0, 0),
       ):
         withPipeline(commandbuffer, presentPipeline):
@@ -1001,28 +993,27 @@
           render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad)
 
   # cleanup
-  checkVkResult vkDeviceWaitIdle(vulkan.device)
+  checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(presentPipeline)
   destroyPipeline(drawPipeline)
   destroyRenderData(renderdata)
   if depthImage.Valid:
-    vkDestroyImageView(vulkan.device, depthImageView, nil)
-    vkDestroyImage(vulkan.device, depthImage, nil)
-    vkFreeMemory(vulkan.device, depthMemory, nil)
+    vkDestroyImageView(engine().vulkan.device, depthImageView, nil)
+    vkDestroyImage(engine().vulkan.device, depthImage, nil)
+    vkFreeMemory(engine().vulkan.device, depthMemory, nil)
   if msaaImage.Valid:
-    vkDestroyImageView(vulkan.device, msaaImageView, nil)
-    vkDestroyImage(vulkan.device, msaaImage, nil)
-    vkFreeMemory(vulkan.device, msaaMemory, nil)
+    vkDestroyImageView(engine().vulkan.device, msaaImageView, nil)
+    vkDestroyImage(engine().vulkan.device, msaaImage, nil)
+    vkFreeMemory(engine().vulkan.device, msaaMemory, nil)
   destroyRenderPass(offscreenRP)
   destroyRenderPass(presentRP)
-  vkDestroyFramebuffer(vulkan.device, offscreenFB, nil)
+  vkDestroyFramebuffer(engine().vulkan.device, offscreenFB, nil)
   clearSwapchain()
 
 when isMainModule:
   var time = 1'f32
-  initVulkan()
+  initEngine("Test rendering")
 
-  var mainRenderpass: RenderPass
   var renderPasses = [
     (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT),
     (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT),
@@ -1037,28 +1028,28 @@
     setupSwapchain(renderpass = renderpass)
 
     # tests a simple triangle with minimalistic shader and vertex format
-    test_01_triangle(time)
+    test_01_triangle(time, renderpass)
 
     # tests instanced triangles and quads, mixing meshes and instances
-    test_02_triangle_quad_instanced(time)
+    test_02_triangle_quad_instanced(time, renderpass)
 
     # teste descriptor sets
-    test_03_simple_descriptorset(time)
+    test_03_simple_descriptorset(time, renderpass)
 
     # tests multiple descriptor sets and arrays
-    test_04_multiple_descriptorsets(time)
+    test_04_multiple_descriptorsets(time, renderpass)
 
     # rotating cube
-    test_05_cube(time)
+    test_05_cube(time, renderpass)
 
     # different draw modes (lines, points, and topologies)
-    test_06_different_draw_modes(time)
+    test_06_different_draw_modes(time, renderpass)
 
-    test_07_png_texture(time)
+    test_07_png_texture(time, renderpass)
 
-    test_08_texture_array(time)
+    test_08_texture_array(time, renderpass)
 
-    checkVkResult vkDeviceWaitIdle(vulkan.device)
+    checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
     destroyRenderPass(renderpass)
     clearSwapchain()