Mercurial > games > semicongine
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: