comparison tests/test_vulkan_wrapper.nim @ 128:9901ec3831d1

did: finish refactoring of render pipeline, yipi! :)
author Sam <sam@basx.dev>
date Mon, 17 Apr 2023 18:02:19 +0700
parents 5871acc2977e
children 15d37022625c
comparison
equal deleted inserted replaced
127:5871acc2977e 128:9901ec3831d1
31 echo " " & $mode 31 echo " " & $mode
32 echo " Surface formats" 32 echo " Surface formats"
33 for format in device.getSurfaceFormats(): 33 for format in device.getSurfaceFormats():
34 echo " " & $format 34 echo " " & $format
35 35
36 proc scene_different_mesh_types(): Scene = 36 proc scene_different_mesh_types(): Entity =
37 result = Scene( 37 result = newEntity("root",
38 name: "main", 38 newEntity("triangle1", newMesh(
39 root: newEntity("root", 39 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)],
40 newEntity("triangle1", newMesh( 40 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)],
41 positions=[newVec3f(0.0, -0.5), newVec3f(0.5, 0.5), newVec3f(-0.5, 0.5)], 41 )),
42 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], 42 newEntity("triangle1b", newMesh(
43 )), 43 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)],
44 newEntity("triangle1b", newMesh( 44 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)],
45 positions=[newVec3f(0.0, -0.4), newVec3f(0.4, 0.4), newVec3f(-0.4, 0.5)], 45 )),
46 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], 46 newEntity("triangle2a", newMesh(
47 )), 47 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)],
48 newEntity("triangle2a", newMesh( 48 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)],
49 positions=[newVec3f(0.0, 0.5), newVec3f(0.5, -0.5), newVec3f(-0.5, -0.5)], 49 indices=[[0'u16, 2'u16, 1'u16]]
50 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], 50 )),
51 indices=[[0'u16, 2'u16, 1'u16]] 51 newEntity("triangle2b", newMesh(
52 )), 52 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)],
53 newEntity("triangle2b", newMesh( 53 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)],
54 positions=[newVec3f(0.0, 0.4), newVec3f(0.4, -0.4), newVec3f(-0.4, -0.4)], 54 indices=[[0'u16, 2'u16, 1'u16]]
55 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], 55 )),
56 indices=[[0'u16, 2'u16, 1'u16]] 56 newEntity("triangle3a", newMesh(
57 )), 57 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)],
58 newEntity("triangle3a", newMesh( 58 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)],
59 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], 59 indices=[[0'u32, 2'u32, 1'u32]],
60 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], 60 autoResize=false
61 indices=[[0'u32, 2'u32, 1'u32]], 61 )),
62 autoResize=false 62 newEntity("triangle3b", newMesh(
63 )), 63 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)],
64 newEntity("triangle3b", newMesh( 64 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)],
65 positions=[newVec3f(0.4, 0.5), newVec3f(0.9, -0.3), newVec3f(0.0, -0.3)], 65 indices=[[0'u32, 2'u32, 1'u32]],
66 colors=[newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0), newVec3f(1.0, 1.0, 0.0)], 66 autoResize=false
67 indices=[[0'u32, 2'u32, 1'u32]], 67 )),
68 autoResize=false
69 )),
70 )
71 ) 68 )
69 for mesh in allComponentsOfType[Mesh](result):
70 mesh.setInstanceData("translate", @[newVec3f()])
72 71
73 proc scene_simple(): Scene = 72 proc scene_simple(): Entity =
74 var mymesh1 = newMesh( 73 var mymesh1 = newMesh(
75 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)], 74 positions=[newVec3f(0.0, -0.3), newVec3f(0.3, 0.3), newVec3f(-0.3, 0.3)],
76 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)], 75 colors=[newVec3f(1.0, 0.0, 0.0), newVec3f(0.0, 1.0, 0.0), newVec3f(0.0, 0.0, 1.0)],
77 ) 76 )
78 var mymesh2 = newMesh( 77 var mymesh2 = newMesh(
93 ) 92 )
94 mymesh1.setInstanceData("translate", @[newVec3f(0.3, 0.0)]) 93 mymesh1.setInstanceData("translate", @[newVec3f(0.3, 0.0)])
95 mymesh2.setInstanceData("translate", @[newVec3f(0.0, 0.3)]) 94 mymesh2.setInstanceData("translate", @[newVec3f(0.0, 0.3)])
96 mymesh3.setInstanceData("translate", @[newVec3f(-0.3, 0.0)]) 95 mymesh3.setInstanceData("translate", @[newVec3f(-0.3, 0.0)])
97 mymesh4.setInstanceData("translate", @[newVec3f(0.0, -0.3), newVec3f(0.0, 0.5)]) 96 mymesh4.setInstanceData("translate", @[newVec3f(0.0, -0.3), newVec3f(0.0, 0.5)])
98 result = Scene( 97 result = newEntity("root", newEntity("triangle", mymesh4, mymesh3, mymesh2, mymesh1))
99 name: "main",
100 root: newEntity("root", newEntity("triangle", mymesh4, mymesh3, mymesh2, mymesh1))
101 )
102 98
103 proc scene_primitives(): Scene = 99 proc scene_primitives(): Entity =
104 var r = rect(color="ff0000") 100 var r = rect(color="ff0000")
105 var t = tri(color="0000ff") 101 var t = tri(color="0000ff")
106 var c = circle(color="00ff00") 102 var c = circle(color="00ff00")
107 setInstanceData[Vec3f](r, "translate", @[newVec3f(0.5, -0.3)]) 103 setInstanceData[Vec3f](r, "translate", @[newVec3f(0.5, -0.3)])
108 setInstanceData[Vec3f](t, "translate", @[newVec3f(0.3, 0.3)]) 104 setInstanceData[Vec3f](t, "translate", @[newVec3f(0.3, 0.3)])
109 setInstanceData[Vec3f](c, "translate", @[newVec3f(-0.3, 0.1)]) 105 setInstanceData[Vec3f](c, "translate", @[newVec3f(-0.3, 0.1)])
110 result = Scene( 106 result = newEntity("root", t, r, c)
111 name: "main",
112 root: newEntity("root", t, r, c)
113 )
114 107
115 when isMainModule: 108 when isMainModule:
116 var engine = initEngine("Test") 109 var engine = initEngine("Test")
117 110
118 # INIT RENDERER: 111 # INIT RENDERER:
138 uniforms=uniforms, 131 uniforms=uniforms,
139 outputs=fragOutput, 132 outputs=fragOutput,
140 main="color = vec4(outcolor, 1);" 133 main="color = vec4(outcolor, 1);"
141 ) 134 )
142 var 135 var
143 vertexshader = engine.gpuDevice.createShaderModule(vertexCode)
144 fragmentshader = engine.gpuDevice.createShaderModule(fragmentCode)
145 surfaceFormat = engine.gpuDevice.physicalDevice.getSurfaceFormats().filterSurfaceFormat() 136 surfaceFormat = engine.gpuDevice.physicalDevice.getSurfaceFormats().filterSurfaceFormat()
146 renderPass = engine.gpuDevice.simpleForwardRenderPass(surfaceFormat.format, vertexshader, fragmentshader, 2) 137 renderPass = engine.gpuDevice.simpleForwardRenderPass(surfaceFormat.format, vertexCode, fragmentCode, 2)
147 (swapchain, res) = engine.gpuDevice.createSwapchain(renderPass, surfaceFormat, engine.gpuDevice.firstGraphicsQueue().get().family, 2) 138 renderer = engine.gpuDevice.initRenderer([renderPass])
148 if res != VK_SUCCESS:
149 raise newException(Exception, "Unable to create swapchain")
150 139
151 # INIT SCENE 140 # INIT SCENE
152 141
153 # var thescene = scene_simple() 142 var scenes = [scene_simple(), scene_different_mesh_types(), scene_primitives()]
154 # var thescene = scene_different_mesh_types()
155 var thescene = scene_primitives()
156 var time = initShaderGlobal("time", 0.0'f32) 143 var time = initShaderGlobal("time", 0.0'f32)
157 thescene.root.components.add time 144 for scene in scenes.mitems:
158 thescene.setupDrawableBuffers(engine.gpuDevice, vertexInput) 145 scene.components.add time
146 renderer.setupDrawableBuffers(scene, vertexInput)
159 147
160 # MAINLOOP 148 # MAINLOOP
161 echo "Setup successfull, start rendering" 149 echo "Setup successfull, start rendering"
162 for i in 0 ..< 10000: 150 for i in 0 ..< 3:
163 setValue[float32](time.value, get[float32](time.value) + 0.0005) 151 for scene in scenes:
164 discard swapchain.drawScene(thescene) 152 for i in 0 ..< 1000:
165 echo "Rendered ", swapchain.framesRendered, " frames" 153 setValue[float32](time.value, get[float32](time.value) + 0.0005)
154 discard renderer.render(scene)
155 echo "Rendered ", renderer.framesRendered, " frames"
166 156
167 # cleanup 157 # cleanup
168 echo "Start cleanup" 158 echo "Start cleanup"
169 checkVkResult engine.gpuDevice.vk.vkDeviceWaitIdle() 159 checkVkResult engine.gpuDevice.vk.vkDeviceWaitIdle()
170 160 renderer.destroy()
171 # destroy scene
172 thescene.destroy()
173
174 # destroy renderer
175 vertexshader.destroy()
176 fragmentshader.destroy()
177 renderPass.destroy()
178 swapchain.destroy()
179
180 # destroy engine
181 engine.destroy() 161 engine.destroy()