diff tests/test_rendering.nim @ 1498:d3d667bbdda4 default tip

did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
author sam <sam@basx.dev>
date Thu, 25 Sep 2025 23:53:41 +0700
parents 676fc13685a9
children
line wrap: on
line diff
--- a/tests/test_rendering.nim	Wed Sep 24 23:55:36 2025 +0700
+++ b/tests/test_rendering.nim	Thu Sep 25 23:53:41 2025 +0700
@@ -10,6 +10,7 @@
 import ../semicongine/rendering
 import ../semicongine/input
 import ../semicongine/loaders
+import ../semicongine/images
 
 proc test_01_triangle(time: float32, renderPass: RenderPass) =
   var renderdata = initRenderData()
@@ -374,14 +375,12 @@
   )
   var otherset1 = asDescriptorSetData(
     OtherSet(
-      objectSettings:
-        asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped)
+      objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped)
     )
   )
   var otherset2 = asDescriptorSetData(
     OtherSet(
-      objectSettings:
-        asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped)
+      objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped)
     )
   )
 
@@ -400,8 +399,19 @@
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1)
   initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2)
 
+  updateGPUBuffer(otherset2.data[0].objectSettings, frame=0)
+  updateGPUBuffer(otherset2.data[1].objectSettings, frame=1)
+
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
+
+    mainset.data[currentFiF()].renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time
+    otherset1.data[currentFiF()].objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time
+    updateGPUBuffer(mainset.data[currentFiF()].renderSettings, frame=currentFiF())
+    updateGPUBuffer(otherset1.data[currentFiF()].objectSettings, frame=currentFiF())
+    updateGPUBuffer(otherset2.data[currentFiF()].objectSettings, frame=currentFiF())
+    renderdata.flushAllMemory()
+
     withNextFrame(framebuffer, commandbuffer):
       bindDescriptorSet(commandbuffer, constset, 0, pipeline)
       bindDescriptorSet(commandbuffer, mainset, 1, pipeline)
@@ -421,14 +431,6 @@
           bindDescriptorSet(commandbuffer, otherset2, 2, pipeline)
           render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
 
-    mainset.data.renderSettings.data.brigthness =
-      ((getMonoTime() - start).inMilliseconds().int / 1000) / time
-    otherset1.data.objectSettings.data.scale =
-      0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time
-    updateGPUBuffer(mainset.data.renderSettings)
-    updateGPUBuffer(otherset1.data.objectSettings)
-    renderdata.flushAllMemory()
-
   # cleanup
   checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
   destroyPipeline(pipeline)
@@ -548,13 +550,13 @@
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
     let tStartLoop = getMonoTime() - tStart
 
-    uniforms1.data.data.data.mvp = (
+    uniforms1.data[currentFiF()].data.data.mvp = (
       projection(-PI / 2, getAspectRatio(), 0.01, 100) * translate(0, 0, 2) *
       rotate(PI / 4, X) * rotate(
         PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y
       )
     )
-    updateGPUBuffer(uniforms1.data.data, flush = true)
+    updateGPUBuffer(uniforms1.data[currentFiF()].data, frame=currentFiF(), flush = true)
 
     withNextFrame(framebuffer, commandbuffer):
       withRenderPass(
@@ -831,7 +833,7 @@
   var (offscreenRP, presentRP) =
     createIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
 
-  setupSwapchain(renderpass = presentRP)
+  setupSwapchain(renderpass = presentRP, vSync = false, tripleBuffering = false)
 
   var renderdata = initRenderData()
 
@@ -886,19 +888,16 @@
       indices: GPUArray[uint16, IndexBuffer]
 
   var mesh = TriangleMesh(
-    position:
-      asGPUArray([vec3(-0.5, -0.5), vec3(0, 0.5), vec3(0.5, -0.5)], VertexBuffer),
-    color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
+    position: asGPUArray([vec3(-0.5, -0.5), vec3(0, 0.5), vec3(0.5, -0.5)], VertexBuffer),
+    color:    asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
   )
   var quad = QuadMesh(
-    position:
-      asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer),
-    indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
+    position: asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer),
+    indices:  asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
   )
   var uniforms1 = asDescriptorSetData(
     Uniforms(
-      frameTexture:
-        Image[BGRA](width: frameWidth(), height: frameHeight(), isRenderTarget: true)
+      frameTexture: Image[BGRA](width: frameWidth(), height: frameHeight(), isRenderTarget: true)
     )
   )
   assignBuffers(renderdata, mesh)
@@ -934,7 +933,7 @@
       image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT
     )
 
-  # create msaa images (will not use the one in the swapchain
+  # create msaa images (will not use the one in the swapchain)
   var
     msaaImage: VkImage
     msaaImageView: VkImageView
@@ -948,26 +947,24 @@
       samples = offscreenRP.samples,
     )
     let requirements = svkGetImageMemoryRequirements(msaaImage)
-    msaaMemory = svkAllocateMemory(
-      requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)
-    )
+    msaaMemory = svkAllocateMemory(requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes))
     checkVkResult vkBindImageMemory(engine().vulkan.device, msaaImage, msaaMemory, 0)
     msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT)
 
   var attachments: seq[VkImageView]
   if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT:
     if offscreenRP.depthBuffer:
-      attachments = @[uniforms1.data.frameTexture.imageview, depthImageView]
+      attachments = @[uniforms1.data[currentFiF()].frameTexture.imageview, depthImageView]
     else:
-      attachments = @[uniforms1.data.frameTexture.imageview]
+      attachments = @[uniforms1.data[currentFiF()].frameTexture.imageview]
   else:
     if offscreenRP.depthBuffer:
-      attachments =
-        @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview]
+      attachments = @[msaaImageView, depthImageView, uniforms1.data[currentFiF()].frameTexture.imageview]
     else:
-      attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview]
-  var offscreenFB =
-    svkCreateFramebuffer(offscreenRP.vk, frameWidth(), frameHeight(), attachments)
+      attachments = @[msaaImageView, uniforms1.data[currentFiF()].frameTexture.imageview]
+  var offscreenFB = svkCreateFramebuffer(offscreenRP.vk, frameWidth(), frameHeight(), attachments)
+
+  renderdata.flushAllMemory()
 
   var start = getMonoTime()
   while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
@@ -1024,11 +1021,12 @@
     (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT),
   ]
 
+  #[
   # test normal
+  var renderpass: RenderPass
   for i, (depthBuffer, samples) in renderPasses:
-    var renderpass =
-      createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
-    setupSwapchain(renderpass = renderpass)
+    renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
+    setupSwapchain(renderpass = renderpass, vSync = false, tripleBuffering = false)
 
     # tests a simple triangle with minimalistic shader and vertex format
     test_01_triangle(time, renderpass)
@@ -1055,6 +1053,7 @@
     checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
     destroyRenderPass(renderpass)
     clearSwapchain()
+  ]#
 
   # test multiple render passes
   for i, (depthBuffer, samples) in renderPasses: