Mercurial > games > semicongine
annotate 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 |
rev | line source |
---|---|
1233
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
1 import std/os |
1231 | 2 import std/sequtils |
1299
6d0162bfe48a
did: finish mentioned refactoring, no API changes still
sam <sam@basx.dev>
parents:
1285
diff
changeset
|
3 import std/math |
1232 | 4 import std/monotimes |
5 import std/times | |
1203 | 6 import std/options |
1204 | 7 import std/random |
8 | |
1267 | 9 import ../semicongine |
1427 | 10 import ../semicongine/rendering |
11 import ../semicongine/input | |
12 import ../semicongine/loaders | |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
13 import ../semicongine/images |
1203 | 14 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
15 proc test_01_triangle(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
16 var renderdata = initRenderData() |
1203 | 17 |
18 type | |
1252 | 19 PushConstant = object |
20 scale: float32 | |
1332 | 21 |
1242 | 22 Shader = object |
1203 | 23 position {.VertexAttribute.}: Vec3f |
24 color {.VertexAttribute.}: Vec3f | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
25 pushConstant {.PushConstant.}: PushConstant |
1203 | 26 fragmentColor {.Pass.}: Vec3f |
27 outColor {.ShaderOutput.}: Vec4f | |
28 # code | |
1332 | 29 vertexCode: string = |
30 """void main() { | |
1203 | 31 fragmentColor = color; |
1252 | 32 gl_Position = vec4(position * pushConstant.scale, 1);}""" |
1332 | 33 fragmentCode: string = |
34 """void main() { | |
1203 | 35 outColor = vec4(fragmentColor, 1);}""" |
1332 | 36 |
1203 | 37 TriangleMesh = object |
38 position: GPUArray[Vec3f, VertexBuffer] | |
39 color: GPUArray[Vec3f, VertexBuffer] | |
1332 | 40 |
1203 | 41 var mesh = TriangleMesh( |
1332 | 42 position: asGPUArray( |
43 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer | |
44 ), | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
45 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), |
1203 | 46 ) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
47 assignBuffers(renderdata, mesh) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
48 renderdata.flushAllMemory() |
1203 | 49 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
50 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
1203 | 51 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
52 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
53 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
54 withNextFrame(framebuffer, commandbuffer): |
1332 | 55 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
56 renderPass, |
1332 | 57 framebuffer, |
58 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
59 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
60 frameHeight(), |
1332 | 61 vec4(0, 0, 0, 0), |
62 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
63 withPipeline(commandbuffer, pipeline): |
1332 | 64 renderWithPushConstant( |
65 commandbuffer = commandbuffer, | |
66 pipeline = pipeline, | |
67 mesh = mesh, | |
68 pushConstant = PushConstant( | |
69 scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000) | |
70 ), | |
71 ) | |
1203 | 72 |
73 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
74 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
75 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
76 destroyRenderData(renderdata) |
1203 | 77 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
78 proc test_02_triangle_quad_instanced(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
79 var renderdata = initRenderData() |
1204 | 80 |
81 type | |
82 SomeShader = object | |
83 position {.VertexAttribute.}: Vec3f | |
84 color {.VertexAttribute.}: Vec3f | |
85 pos {.InstanceAttribute.}: Vec3f | |
86 scale {.InstanceAttribute.}: float32 | |
87 fragmentColor {.Pass.}: Vec3f | |
88 outColor {.ShaderOutput.}: Vec4f | |
89 # code | |
1332 | 90 vertexCode: string = |
91 """void main() { | |
1204 | 92 fragmentColor = color; |
93 gl_Position = vec4((position * scale) + pos, 1);}""" | |
1332 | 94 fragmentCode: string = |
95 """void main() { | |
1204 | 96 outColor = vec4(fragmentColor, 1);}""" |
1332 | 97 |
1204 | 98 TriangleMesh = object |
99 position: GPUArray[Vec3f, VertexBuffer] | |
100 color: GPUArray[Vec3f, VertexBuffer] | |
1332 | 101 |
1204 | 102 QuadMesh = object |
103 position: GPUArray[Vec3f, VertexBuffer] | |
104 color: GPUArray[Vec3f, VertexBuffer] | |
105 indices: GPUArray[uint16, IndexBuffer] | |
1332 | 106 |
1204 | 107 Instances = object |
108 pos: GPUArray[Vec3f, VertexBuffer] | |
109 scale: GPUArray[float32, VertexBuffer] | |
1332 | 110 |
1204 | 111 var tri = TriangleMesh( |
1332 | 112 position: asGPUArray( |
113 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer | |
114 ), | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
115 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), |
1204 | 116 ) |
117 var quad = QuadMesh( | |
1332 | 118 position: asGPUArray( |
119 [vec3(-0.3, -0.3, 0), vec3(-0.3, 0.3, 0), vec3(0.3, 0.3, 0), vec3(0.3, -0.3, 0)], | |
120 VertexBuffer, | |
121 ), | |
1204 | 122 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
1332 | 123 color: asGPUArray( |
124 [vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1)], VertexBuffer | |
125 ), | |
1204 | 126 ) |
127 | |
128 var instancesA: Instances | |
1332 | 129 for n in 1 .. 100: |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
130 instancesA.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(-0.8'f32 .. 0'f32), 0) |
1204 | 131 instancesA.scale.data.add rand(0.3'f32 .. 0.4'f32) |
132 var instancesB: Instances | |
1332 | 133 for n in 1 .. 100: |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
134 instancesB.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(0'f32 .. 0.8'f32), 0) |
1204 | 135 instancesB.scale.data.add rand(0.1'f32 .. 0.2'f32) |
136 | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
137 assignBuffers(renderdata, tri) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
138 assignBuffers(renderdata, quad) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
139 assignBuffers(renderdata, instancesA) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
140 assignBuffers(renderdata, instancesB) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
141 renderdata.flushAllMemory() |
1204 | 142 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
143 var pipeline = createPipeline(SomeShader(), renderPass = renderPass) |
1204 | 144 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
145 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
146 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
147 withNextFrame(framebuffer, commandbuffer): |
1332 | 148 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
149 renderPass, |
1332 | 150 framebuffer, |
151 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
152 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
153 frameHeight(), |
1332 | 154 vec4(0, 0, 0, 0), |
155 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
156 withPipeline(commandbuffer, pipeline): |
1332 | 157 render( |
158 commandbuffer = commandbuffer, | |
159 pipeline = pipeline, | |
160 mesh = quad, | |
161 instances = instancesA, | |
162 ) | |
163 render( | |
164 commandbuffer = commandbuffer, | |
165 pipeline = pipeline, | |
166 mesh = quad, | |
167 instances = instancesB, | |
168 ) | |
169 render( | |
170 commandbuffer = commandbuffer, | |
171 pipeline = pipeline, | |
172 mesh = tri, | |
173 instances = instancesA, | |
174 ) | |
175 render( | |
176 commandbuffer = commandbuffer, | |
177 pipeline = pipeline, | |
178 mesh = tri, | |
179 instances = instancesB, | |
180 ) | |
1204 | 181 |
182 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
183 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
184 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
185 destroyRenderData(renderdata) |
1204 | 186 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
187 proc test_03_simple_descriptorset(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
188 var renderdata = initRenderData() |
1210 | 189 |
190 type | |
191 Material = object | |
192 baseColor: Vec3f | |
193 | |
194 Uniforms = object | |
195 material: GPUValue[Material, UniformBuffer] | |
1252 | 196 texture1: Image[BGRA] |
1210 | 197 |
198 QuadShader = object | |
199 position {.VertexAttribute.}: Vec3f | |
200 fragmentColor {.Pass.}: Vec3f | |
201 uv {.Pass.}: Vec2f | |
202 outColor {.ShaderOutput.}: Vec4f | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
203 descriptorSets {.DescriptorSet: 0.}: Uniforms |
1210 | 204 # code |
1332 | 205 vertexCode: string = |
206 """void main() { | |
1210 | 207 fragmentColor = material.baseColor; |
208 gl_Position = vec4(position, 1); | |
209 gl_Position.x += ((material.baseColor.b - 0.5) * 2) - 0.5; | |
210 uv = position.xy + 0.5; | |
211 }""" | |
1332 | 212 fragmentCode: string = |
213 """void main() { | |
1210 | 214 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" |
1332 | 215 |
1210 | 216 QuadMesh = object |
217 position: GPUArray[Vec3f, VertexBuffer] | |
218 indices: GPUArray[uint16, IndexBuffer] | |
219 | |
1252 | 220 let R = BGRA([255'u8, 0'u8, 0'u8, 255'u8]) |
221 let G = BGRA([0'u8, 255'u8, 0'u8, 255'u8]) | |
222 let B = BGRA([0'u8, 0'u8, 255'u8, 255'u8]) | |
223 let W = BGRA([255'u8, 255'u8, 255'u8, 255'u8]) | |
1210 | 224 var |
225 quad = QuadMesh( | |
1332 | 226 position: asGPUArray( |
227 [vec3(-0.5, -0.5, 0), vec3(-0.5, 0.5, 0), vec3(0.5, 0.5, 0), vec3(0.5, -0.5, 0)], | |
228 VertexBuffer, | |
229 ), | |
1210 | 230 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
231 ) | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
232 uniforms1 = asDescriptorSetData( |
1210 | 233 Uniforms( |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
234 material: asGPUValue(Material(baseColor: vec3(1, 1, 1)), UniformBuffer), |
1332 | 235 texture1: Image[BGRA]( |
236 width: 3, | |
237 height: 3, | |
238 data: @[R, G, B, G, B, R, B, R, G], | |
239 minInterpolation: VK_FILTER_NEAREST, | |
240 magInterpolation: VK_FILTER_NEAREST, | |
241 ), | |
1210 | 242 ) |
243 ) | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
244 uniforms2 = asDescriptorSetData( |
1210 | 245 Uniforms( |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
246 material: asGPUValue(Material(baseColor: vec3(0.5, 0.5, 0.5)), UniformBuffer), |
1252 | 247 texture1: Image[BGRA](width: 2, height: 2, data: @[R, G, B, W]), |
1332 | 248 ) |
1210 | 249 ) |
250 | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
251 assignBuffers(renderdata, quad) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
252 assignBuffers(renderdata, uniforms1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
253 assignBuffers(renderdata, uniforms2) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
254 uploadImages(renderdata, uniforms1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
255 uploadImages(renderdata, uniforms2) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
256 renderdata.flushAllMemory() |
1210 | 257 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
258 var pipeline = createPipeline(QuadShader(), renderPass = renderPass) |
1210 | 259 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
260 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
261 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) |
1210 | 262 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
263 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
264 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
265 withNextFrame(framebuffer, commandbuffer): |
1332 | 266 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
267 renderPass, |
1332 | 268 framebuffer, |
269 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
270 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
271 frameHeight(), |
1332 | 272 vec4(0, 0, 0, 0), |
273 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
274 withPipeline(commandbuffer, pipeline): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
275 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
276 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
1242 | 277 |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
278 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
279 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
1210 | 280 |
281 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
282 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
283 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
284 destroyRenderData(renderdata) |
1210 | 285 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
286 proc test_04_multiple_descriptorsets(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
287 var renderdata = initRenderData() |
1203 | 288 |
1204 | 289 type |
290 RenderSettings = object | |
1209 | 291 brigthness: float32 |
1332 | 292 |
1210 | 293 Material = object |
294 baseColor: Vec3f | |
1332 | 295 |
1209 | 296 ObjectSettings = object |
1210 | 297 scale: float32 |
298 materialIndex: uint32 | |
1332 | 299 |
1210 | 300 Constants = object |
301 offset: Vec2f | |
302 | |
303 ConstSet = object | |
304 constants: GPUValue[Constants, UniformBuffer] | |
1332 | 305 |
1209 | 306 MainSet = object |
307 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] | |
1210 | 308 material: array[2, GPUValue[Material, UniformBuffer]] |
1242 | 309 texture1: array[2, Image[Gray]] |
1332 | 310 |
1209 | 311 OtherSet = object |
1210 | 312 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped] |
1209 | 313 |
1204 | 314 QuadShader = object |
315 position {.VertexAttribute.}: Vec3f | |
316 fragmentColor {.Pass.}: Vec3f | |
1210 | 317 uv {.Pass.}: Vec2f |
1204 | 318 outColor {.ShaderOutput.}: Vec4f |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
319 descriptorSets0 {.DescriptorSet: 0.}: ConstSet |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
320 descriptorSets1 {.DescriptorSet: 1.}: MainSet |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
321 descriptorSets2 {.DescriptorSet: 2.}: OtherSet |
1204 | 322 # code |
1332 | 323 vertexCode: string = |
324 """void main() { | |
1210 | 325 fragmentColor = material[objectSettings.materialIndex].baseColor * renderSettings.brigthness; |
326 gl_Position = vec4(position * objectSettings.scale, 1); | |
327 gl_Position.xy += constants.offset.xy; | |
328 gl_Position.x += material[objectSettings.materialIndex].baseColor.b - 0.5; | |
329 uv = position.xy + 0.5; | |
330 }""" | |
1332 | 331 fragmentCode: string = |
332 """void main() { | |
1210 | 333 outColor = vec4(fragmentColor * texture(texture1[objectSettings.materialIndex], uv).rrr, 1); |
334 }""" | |
1332 | 335 |
1204 | 336 QuadMesh = object |
337 position: GPUArray[Vec3f, VertexBuffer] | |
338 indices: GPUArray[uint16, IndexBuffer] | |
1203 | 339 |
1204 | 340 var quad = QuadMesh( |
1332 | 341 position: asGPUArray( |
342 [vec3(-0.5, -0.5), vec3(-0.5, 0.5), vec3(0.5, 0.5), vec3(0.5, -0.5)], VertexBuffer | |
343 ), | |
1204 | 344 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
1209 | 345 ) |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
346 var constset = asDescriptorSetData( |
1332 | 347 ConstSet(constants: asGPUValue(Constants(offset: vec2(-0.3, 0.2)), UniformBuffer)) |
1210 | 348 ) |
1242 | 349 let G = Gray([50'u8]) |
350 let W = Gray([255'u8]) | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
351 var mainset = asDescriptorSetData( |
1209 | 352 MainSet( |
353 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), | |
1210 | 354 material: [ |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
355 asGPUValue(Material(baseColor: vec3(1, 1, 0)), UniformBuffer), |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
356 asGPUValue(Material(baseColor: vec3(1, 0, 1)), UniformBuffer), |
1332 | 357 ], |
358 texture1: [ | |
359 Image[Gray]( | |
360 width: 2, | |
361 height: 2, | |
362 data: @[W, G, G, W], | |
363 minInterpolation: VK_FILTER_NEAREST, | |
364 magInterpolation: VK_FILTER_NEAREST, | |
365 ), | |
366 Image[Gray]( | |
367 width: 3, | |
368 height: 3, | |
369 data: @[W, G, W, G, W, G, W, G, W], | |
370 minInterpolation: VK_FILTER_NEAREST, | |
371 magInterpolation: VK_FILTER_NEAREST, | |
372 ), | |
373 ], | |
374 ) | |
1210 | 375 ) |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
376 var otherset1 = asDescriptorSetData( |
1210 | 377 OtherSet( |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
378 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped) |
1209 | 379 ) |
1204 | 380 ) |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
381 var otherset2 = asDescriptorSetData( |
1209 | 382 OtherSet( |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
383 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped) |
1209 | 384 ) |
1204 | 385 ) |
1209 | 386 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
387 assignBuffers(renderdata, quad) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
388 assignBuffers(renderdata, constset) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
389 assignBuffers(renderdata, mainset) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
390 assignBuffers(renderdata, otherset1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
391 assignBuffers(renderdata, otherset2) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
392 uploadImages(renderdata, mainset) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
393 renderdata.flushAllMemory() |
1204 | 394 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
395 var pipeline = createPipeline(QuadShader(), renderPass = renderPass) |
1204 | 396 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
397 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], constset) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
398 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[1], mainset) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
399 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
400 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
401 |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
402 updateGPUBuffer(otherset2.data[0].objectSettings, frame=0) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
403 updateGPUBuffer(otherset2.data[1].objectSettings, frame=1) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
404 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
405 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
406 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
407 |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
408 mainset.data[currentFiF()].renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
409 otherset1.data[currentFiF()].objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
410 updateGPUBuffer(mainset.data[currentFiF()].renderSettings, frame=currentFiF()) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
411 updateGPUBuffer(otherset1.data[currentFiF()].objectSettings, frame=currentFiF()) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
412 updateGPUBuffer(otherset2.data[currentFiF()].objectSettings, frame=currentFiF()) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
413 renderdata.flushAllMemory() |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
414 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
415 withNextFrame(framebuffer, commandbuffer): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
416 bindDescriptorSet(commandbuffer, constset, 0, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
417 bindDescriptorSet(commandbuffer, mainset, 1, pipeline) |
1242 | 418 |
1332 | 419 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
420 renderPass, |
1332 | 421 framebuffer, |
422 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
423 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
424 frameHeight(), |
1332 | 425 vec4(0, 0, 0, 0), |
426 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
427 withPipeline(commandbuffer, pipeline): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
428 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
429 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
1242 | 430 |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
431 bindDescriptorSet(commandbuffer, otherset2, 2, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
432 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
1242 | 433 |
1204 | 434 # cleanup |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
435 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
436 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
437 destroyRenderData(renderdata) |
1204 | 438 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
439 proc test_05_cube(time: float32, renderPass: RenderPass) = |
1231 | 440 type |
441 UniformData = object | |
1232 | 442 mvp: Mat4 |
1332 | 443 |
1231 | 444 Uniforms = object |
445 data: GPUValue[UniformData, UniformBufferMapped] | |
1332 | 446 |
1231 | 447 CubeShader = object |
448 position {.VertexAttribute.}: Vec3f | |
449 color {.VertexAttribute.}: Vec4f | |
450 fragmentColor {.Pass.}: Vec4f | |
451 outColor {.ShaderOutput.}: Vec4f | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
452 descriptorSets {.DescriptorSet: 0.}: Uniforms |
1231 | 453 # code |
1332 | 454 vertexCode = |
455 """void main() { | |
1231 | 456 fragmentColor = color; |
1232 | 457 gl_Position = vec4(position, 1) * data.mvp; |
1231 | 458 }""" |
1332 | 459 fragmentCode = |
460 """void main() { | |
1231 | 461 outColor = fragmentColor; |
462 }""" | |
1332 | 463 |
1231 | 464 Mesh = object |
465 position: GPUArray[Vec3f, VertexBuffer] | |
466 normals: GPUArray[Vec3f, VertexBuffer] | |
467 color: GPUArray[Vec4f, VertexBuffer] | |
468 | |
1332 | 469 let quad = |
470 @[ | |
471 vec3(-0.5, -0.5), | |
472 vec3(-0.5, +0.5), | |
473 vec3(+0.5, +0.5), | |
474 vec3(+0.5, +0.5), | |
475 vec3(+0.5, -0.5), | |
476 vec3(-0.5, -0.5), | |
477 ] | |
1232 | 478 proc transf(data: seq[Vec3f], mat: Mat4): seq[Vec3f] = |
1231 | 479 for v in data: |
1232 | 480 result.add mat * v |
1231 | 481 |
482 var | |
483 vertices: seq[Vec3f] | |
484 colors: seq[Vec4f] | |
485 normals: seq[Vec3f] | |
486 | |
487 # front, red | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
488 vertices.add quad.transf(translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
489 colors.add newSeqWith(6, vec4(1, 0, 0, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
490 normals.add newSeqWith(6, vec3(0, 0, -1)) |
1231 | 491 |
492 # back, cyan | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
493 vertices.add quad.transf(rotate(PI, Y) * translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
494 colors.add newSeqWith(6, vec4(0, 1, 1, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
495 normals.add newSeqWith(6, vec3(0, 0, 1)) |
1231 | 496 |
497 # right, green | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
498 vertices.add quad.transf(rotate(PI / 2, Y) * translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
499 colors.add newSeqWith(6, vec4(0, 1, 0, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
500 normals.add newSeqWith(6, vec3(-1, 0, 0)) |
1231 | 501 |
502 # left, magenta | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
503 vertices.add quad.transf(rotate(-PI / 2, Y) * translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
504 colors.add newSeqWith(6, vec4(1, 0, 1, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
505 normals.add newSeqWith(6, vec3(1, 0, 0)) |
1231 | 506 |
507 # bottom, blue | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
508 vertices.add quad.transf(rotate(PI / 2, X) * translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
509 colors.add newSeqWith(6, vec4(0, 0, 1, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
510 normals.add newSeqWith(6, vec3(0, -1, 0)) |
1231 | 511 |
512 # top, yellow | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
513 vertices.add quad.transf(rotate(-PI / 2, X) * translate(0, 0, -0.5)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
514 colors.add newSeqWith(6, vec4(1, 1, 0, 1)) |
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
515 normals.add newSeqWith(6, vec3(0, 1, 0)) |
1231 | 516 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
517 var renderdata = initRenderData() |
1231 | 518 |
519 var mesh = Mesh( | |
520 position: asGPUArray(vertices, VertexBuffer), | |
521 color: asGPUArray(colors, VertexBuffer), | |
522 normals: asGPUArray(normals, VertexBuffer), | |
523 ) | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
524 assignBuffers(renderdata, mesh) |
1231 | 525 |
526 var floor = Mesh( | |
1332 | 527 position: asGPUArray( |
528 quad.transf(scale(10, 10, 10) * rotate(-PI / 2, X) * translate(0, 0, 0.05)), | |
529 VertexBuffer, | |
530 ), | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
531 color: asGPUArray(newSeqWith(6, vec4(0.1, 0.1, 0.1, 1)), VertexBuffer), |
1231 | 532 normals: asGPUArray(newSeqWith(6, Y), VertexBuffer), |
533 ) | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
534 assignBuffers(renderdata, floor) |
1231 | 535 |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
536 var uniforms1 = asDescriptorSetData( |
1332 | 537 Uniforms(data: asGPUValue(UniformData(mvp: Unit4), UniformBufferMapped)) |
1231 | 538 ) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
539 assignBuffers(renderdata, uniforms1) |
1231 | 540 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
541 renderdata.flushAllMemory() |
1231 | 542 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
543 var pipeline = createPipeline(CubeShader(), renderPass = renderPass) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
544 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
1231 | 545 |
1232 | 546 var tStart = getMonoTime() |
547 var t = tStart | |
1231 | 548 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
549 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
550 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1233
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
551 let tStartLoop = getMonoTime() - tStart |
1232 | 552 |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
553 uniforms1.data[currentFiF()].data.data.mvp = ( |
1332 | 554 projection(-PI / 2, getAspectRatio(), 0.01, 100) * translate(0, 0, 2) * |
555 rotate(PI / 4, X) * rotate( | |
556 PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y | |
557 ) | |
1232 | 558 ) |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
559 updateGPUBuffer(uniforms1.data[currentFiF()].data, frame=currentFiF(), flush = true) |
1242 | 560 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
561 withNextFrame(framebuffer, commandbuffer): |
1332 | 562 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
563 renderPass, |
1332 | 564 framebuffer, |
565 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
566 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
567 frameHeight(), |
1332 | 568 vec4(0, 0, 0, 0), |
569 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
570 withPipeline(commandbuffer, pipeline): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
571 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
572 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
573 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) |
1233
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
574 |
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
575 let tEndLoop = getMonoTime() - tStart |
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
576 let looptime = tEndLoop - tStartLoop |
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
577 let waitTime = 16_666 - looptime.inMicroseconds |
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
578 if waitTime > 0: |
1cf698973dca
did: cleanup tests and old platform layer files
sam <sam@basx.dev>
parents:
1232
diff
changeset
|
579 sleep((waitTime / 1000).int) |
1231 | 580 |
581 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
582 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
583 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
584 destroyRenderData(renderdata) |
1231 | 585 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
586 proc test_06_different_draw_modes(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
587 var renderdata = initRenderData() |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
588 |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
589 type |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
590 Shader = object |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
591 position {.VertexAttribute.}: Vec3f |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
592 color {.VertexAttribute.}: Vec3f |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
593 fragmentColor {.Pass.}: Vec3f |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
594 outColor {.ShaderOutput.}: Vec4f |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
595 # code |
1332 | 596 vertexCode: string = |
597 """void main() { | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
598 gl_PointSize = 100; |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
599 fragmentColor = color; |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
600 gl_Position = vec4(position, 1);}""" |
1332 | 601 fragmentCode: string = |
602 """void main() { | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
603 outColor = vec4(fragmentColor, 1);}""" |
1332 | 604 |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
605 TriangleMesh = object |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
606 position: GPUArray[Vec3f, VertexBuffer] |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
607 color: GPUArray[Vec3f, VertexBuffer] |
1332 | 608 |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
609 var triangle = TriangleMesh( |
1332 | 610 position: asGPUArray( |
611 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer | |
612 ), | |
1280
a89a70ea3da2
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
613 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
614 ) |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
615 var lines = TriangleMesh( |
1332 | 616 position: asGPUArray( |
617 [vec3(-0.9, 0, 0), vec3(-0.05, -0.9, 0), vec3(0.05, -0.9, 0), vec3(0.9, 0, 0)], | |
618 VertexBuffer, | |
619 ), | |
620 color: asGPUArray( | |
621 [vec3(1, 1, 0), vec3(1, 1, 0), vec3(0, 1, 0), vec3(0, 1, 0)], VertexBuffer | |
622 ), | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
623 ) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
624 assignBuffers(renderdata, triangle) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
625 assignBuffers(renderdata, lines) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
626 renderdata.flushAllMemory() |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
627 |
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
628 var pipeline1 = createPipeline( |
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
629 Shader(), |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
630 renderPass = renderPass, |
1332 | 631 polygonMode = VK_POLYGON_MODE_LINE, |
632 lineWidth = 20'f32, | |
633 ) | |
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
634 var pipeline2 = createPipeline( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
635 Shader(), renderPass = renderPass, polygonMode = VK_POLYGON_MODE_POINT |
1332 | 636 ) |
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
637 var pipeline3 = createPipeline( |
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
638 Shader(), |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
639 renderPass = renderPass, |
1332 | 640 topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST, |
641 lineWidth = 5, | |
642 ) | |
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
643 var pipeline4 = createPipeline( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
644 Shader(), renderPass = renderPass, topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST |
1332 | 645 ) |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
646 |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
647 var start = getMonoTime() |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
648 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
649 withNextFrame(framebuffer, commandbuffer): |
1332 | 650 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
651 renderPass, |
1332 | 652 framebuffer, |
653 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
654 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
655 frameHeight(), |
1332 | 656 vec4(0, 0, 0, 0), |
657 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
658 withPipeline(commandbuffer, pipeline1): |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
659 render(commandbuffer = commandbuffer, pipeline = pipeline1, mesh = triangle) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
660 withPipeline(commandbuffer, pipeline2): |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
661 render(commandbuffer = commandbuffer, pipeline = pipeline2, mesh = triangle) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
662 withPipeline(commandbuffer, pipeline3): |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
663 render(commandbuffer = commandbuffer, pipeline = pipeline3, mesh = lines) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
664 withPipeline(commandbuffer, pipeline4): |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
665 render(commandbuffer = commandbuffer, pipeline = pipeline4, mesh = lines) |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
666 |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
667 # cleanup |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
668 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
669 destroyPipeline(pipeline1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
670 destroyPipeline(pipeline2) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
671 destroyPipeline(pipeline3) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
672 destroyPipeline(pipeline4) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
673 destroyRenderData(renderdata) |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
674 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
675 proc test_08_texture_array(time: float32, renderPass: RenderPass) = |
1334 | 676 var renderdata = initRenderData() |
677 | |
678 type | |
679 Uniforms = object | |
680 textures: ImageArray[BGRA] | |
681 | |
682 Shader = object | |
683 position {.VertexAttribute.}: Vec3f | |
684 uv {.VertexAttribute.}: Vec2f | |
685 fragmentUv {.Pass.}: Vec2f | |
686 outColor {.ShaderOutput.}: Vec4f | |
687 descriptorSets {.DescriptorSet: 0.}: Uniforms | |
688 # code | |
689 vertexCode: string = | |
690 """ | |
691 void main() { | |
692 fragmentUv = uv; | |
693 gl_Position = vec4(position, 1); | |
694 }""" | |
695 fragmentCode: string = | |
696 """ | |
697 void main() { | |
698 vec4 col1 = texture(textures, vec3(fragmentUv, 0)); | |
699 vec4 col2 = texture(textures, vec3(fragmentUv, 1)); | |
700 float w = length(fragmentUv * 2 - 1) / 1.41421; | |
701 outColor = (1 - w) * col1 + w * col2; | |
702 }""" | |
703 | |
704 Quad = object | |
705 position: GPUArray[Vec3f, VertexBuffer] | |
706 uv: GPUArray[Vec2f, VertexBuffer] | |
707 | |
708 var mesh = Quad( | |
709 position: asGPUArray( | |
710 [ | |
711 vec3(-0.8, -0.5), | |
712 vec3(-0.8, 0.5), | |
713 vec3(0.8, 0.5), | |
714 vec3(0.8, 0.5), | |
715 vec3(0.8, -0.5), | |
716 vec3(-0.8, -0.5), | |
717 ], | |
718 VertexBuffer, | |
719 ), | |
720 uv: asGPUArray( | |
721 [vec2(0, 1), vec2(0, 0), vec2(1, 0), vec2(1, 0), vec2(1, 1), vec2(0, 1)], | |
722 VertexBuffer, | |
723 ), | |
724 ) | |
725 assignBuffers(renderdata, mesh) | |
726 renderdata.flushAllMemory() | |
727 | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
728 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
1334 | 729 var uniforms1 = asDescriptorSetData( |
730 Uniforms(textures: loadImageArray[BGRA](["art.png", "art1.png"])) | |
731 ) | |
732 uploadImages(renderdata, uniforms1) | |
733 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | |
734 | |
735 var start = getMonoTime() | |
736 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | |
737 withNextFrame(framebuffer, commandbuffer): | |
738 withRenderPass( | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
739 renderPass, |
1334 | 740 framebuffer, |
741 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
742 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
743 frameHeight(), |
1334 | 744 vec4(0, 0, 0, 0), |
745 ): | |
746 withPipeline(commandbuffer, pipeline): | |
747 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | |
748 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | |
749 | |
750 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
751 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1334 | 752 destroyPipeline(pipeline) |
753 destroyRenderData(renderdata) | |
754 | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
755 proc test_07_png_texture(time: float32, renderPass: RenderPass) = |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
756 var renderdata = initRenderData() |
1242 | 757 |
758 type | |
759 Uniforms = object | |
1252 | 760 texture1: Image[BGRA] |
1332 | 761 |
1242 | 762 Shader = object |
763 position {.VertexAttribute.}: Vec3f | |
764 uv {.VertexAttribute.}: Vec2f | |
765 fragmentUv {.Pass.}: Vec2f | |
766 outColor {.ShaderOutput.}: Vec4f | |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
767 descriptorSets {.DescriptorSet: 0.}: Uniforms |
1242 | 768 # code |
1332 | 769 vertexCode: string = |
770 """ | |
1242 | 771 void main() { |
772 fragmentUv = uv; | |
773 gl_Position = vec4(position, 1); | |
774 }""" | |
1332 | 775 fragmentCode: string = |
776 """ | |
1242 | 777 void main() { |
778 outColor = texture(texture1, fragmentUv); | |
779 }""" | |
1332 | 780 |
1242 | 781 Quad = object |
782 position: GPUArray[Vec3f, VertexBuffer] | |
783 uv: GPUArray[Vec2f, VertexBuffer] | |
1332 | 784 |
1242 | 785 var mesh = Quad( |
1332 | 786 position: asGPUArray( |
787 [ | |
788 vec3(-0.8, -0.5), | |
789 vec3(-0.8, 0.5), | |
790 vec3(0.8, 0.5), | |
791 vec3(0.8, 0.5), | |
792 vec3(0.8, -0.5), | |
793 vec3(-0.8, -0.5), | |
794 ], | |
795 VertexBuffer, | |
796 ), | |
797 uv: asGPUArray( | |
798 [vec2(0, 1), vec2(0, 0), vec2(1, 0), vec2(1, 0), vec2(1, 1), vec2(0, 1)], | |
799 VertexBuffer, | |
800 ), | |
1242 | 801 ) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
802 assignBuffers(renderdata, mesh) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
803 renderdata.flushAllMemory() |
1242 | 804 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
805 var pipeline = createPipeline(Shader(), renderPass = renderPass) |
1332 | 806 var uniforms1 = asDescriptorSetData(Uniforms(texture1: loadImage[BGRA]("art.png"))) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
807 uploadImages(renderdata, uniforms1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
808 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
1242 | 809 |
810 var start = getMonoTime() | |
811 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
812 withNextFrame(framebuffer, commandbuffer): |
1332 | 813 withRenderPass( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
814 renderPass, |
1332 | 815 framebuffer, |
816 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
817 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
818 frameHeight(), |
1332 | 819 vec4(0, 0, 0, 0), |
820 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
821 withPipeline(commandbuffer, pipeline): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
822 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
823 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
1242 | 824 |
825 # cleanup | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
826 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
827 destroyPipeline(pipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
828 destroyRenderData(renderdata) |
1242 | 829 |
1334 | 830 proc test_09_triangle_2pass( |
1332 | 831 time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits |
832 ) = | |
833 var (offscreenRP, presentRP) = | |
834 createIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | |
1239
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1235
diff
changeset
|
835 |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
836 setupSwapchain(renderpass = presentRP, vSync = false, tripleBuffering = false) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
837 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
838 var renderdata = initRenderData() |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
839 |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
840 type |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
841 Uniforms = object |
1252 | 842 frameTexture: Image[BGRA] |
1332 | 843 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
844 TriangleShader = object |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
845 position {.VertexAttribute.}: Vec3f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
846 color {.VertexAttribute.}: Vec3f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
847 fragmentColor {.Pass.}: Vec3f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
848 outColor {.ShaderOutput.}: Vec4f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
849 # code |
1332 | 850 vertexCode: string = |
851 """void main() { | |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
852 fragmentColor = color; |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
853 gl_Position = vec4(position, 1);}""" |
1332 | 854 fragmentCode: string = |
855 """void main() { | |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
856 outColor = vec4(fragmentColor, 1);}""" |
1332 | 857 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
858 PresentShader = object |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
859 position {.VertexAttribute.}: Vec2f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
860 uv {.Pass.}: Vec2f |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
861 outColor {.ShaderOutput.}: Vec4f |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
862 descriptorSets {.DescriptorSet: 0.}: Uniforms |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
863 # code |
1332 | 864 vertexCode: string = |
865 """void main() { | |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
866 uv = ((position + 1) * 0.5) * vec2(1, -1); |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
867 gl_Position = vec4(position, 0, 1);}""" |
1332 | 868 fragmentCode: string = |
869 """void main() { | |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
870 vec2 uv1 = uv + vec2(0.001, 0.001); |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
871 vec2 uv2 = uv + vec2(0.001, -0.001); |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
872 vec2 uv3 = uv + vec2(-0.001, 0.001); |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
873 vec2 uv4 = uv + vec2(-0.001, -0.001); |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
874 outColor = ( |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
875 texture(frameTexture, uv1) + |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
876 texture(frameTexture, uv2) + |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
877 texture(frameTexture, uv3) + |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
878 texture(frameTexture, uv4) |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
879 ) / 4; |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
880 }""" |
1332 | 881 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
882 TriangleMesh = object |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
883 position: GPUArray[Vec3f, VertexBuffer] |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
884 color: GPUArray[Vec3f, VertexBuffer] |
1332 | 885 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
886 QuadMesh = object |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
887 position: GPUArray[Vec2f, VertexBuffer] |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
888 indices: GPUArray[uint16, IndexBuffer] |
1332 | 889 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
890 var mesh = TriangleMesh( |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
891 position: asGPUArray([vec3(-0.5, -0.5), vec3(0, 0.5), vec3(0.5, -0.5)], VertexBuffer), |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
892 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
893 ) |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
894 var quad = QuadMesh( |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
895 position: asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer), |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
896 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
897 ) |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
898 var uniforms1 = asDescriptorSetData( |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
899 Uniforms( |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
900 frameTexture: Image[BGRA](width: frameWidth(), height: frameHeight(), isRenderTarget: true) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
901 ) |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
902 ) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
903 assignBuffers(renderdata, mesh) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
904 assignBuffers(renderdata, quad) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
905 uploadImages(renderdata, uniforms1) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
906 renderdata.flushAllMemory() |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
907 |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
908 var |
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
909 drawPipeline = createPipeline(TriangleShader(), renderPass = offscreenRP) |
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
910 presentPipeline = createPipeline(PresentShader(), renderPass = presentRP) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
911 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
912 initDescriptorSet(renderdata, presentPipeline.descriptorSetLayouts[0], uniforms1) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
913 |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
914 # create depth buffer images (will not use the one in the swapchain |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
915 var |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
916 depthImage: VkImage |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
917 depthImageView: VkImageView |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
918 depthMemory: VkDeviceMemory |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
919 if offscreenRP.depthBuffer: |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
920 depthImage = svkCreate2DImage( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
921 width = frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
922 height = frameHeight(), |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
923 format = DEPTH_FORMAT, |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
924 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT], |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
925 samples = offscreenRP.samples, |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
926 ) |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
927 let requirements = svkGetImageMemoryRequirements(depthImage) |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
928 depthMemory = svkAllocateMemory( |
1332 | 929 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
930 ) |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
931 checkVkResult vkBindImageMemory(engine().vulkan.device, depthImage, depthMemory, 0) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
932 depthImageView = svkCreate2DImageView( |
1332 | 933 image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
934 ) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
935 |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
936 # create msaa images (will not use the one in the swapchain) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
937 var |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
938 msaaImage: VkImage |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
939 msaaImageView: VkImageView |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
940 msaaMemory: VkDeviceMemory |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
941 if offscreenRP.samples != VK_SAMPLE_COUNT_1_BIT: |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
942 msaaImage = svkCreate2DImage( |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
943 width = frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
944 height = frameHeight(), |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
945 format = SURFACE_FORMAT, |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
946 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT], |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
947 samples = offscreenRP.samples, |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
948 ) |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
949 let requirements = svkGetImageMemoryRequirements(msaaImage) |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
950 msaaMemory = svkAllocateMemory(requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)) |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
951 checkVkResult vkBindImageMemory(engine().vulkan.device, msaaImage, msaaMemory, 0) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
952 msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT) |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
953 |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
954 var attachments: seq[VkImageView] |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
955 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT: |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
956 if offscreenRP.depthBuffer: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
957 attachments = @[uniforms1.data[currentFiF()].frameTexture.imageview, depthImageView] |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
958 else: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
959 attachments = @[uniforms1.data[currentFiF()].frameTexture.imageview] |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
960 else: |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
961 if offscreenRP.depthBuffer: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
962 attachments = @[msaaImageView, depthImageView, uniforms1.data[currentFiF()].frameTexture.imageview] |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
963 else: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
964 attachments = @[msaaImageView, uniforms1.data[currentFiF()].frameTexture.imageview] |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
965 var offscreenFB = svkCreateFramebuffer(offscreenRP.vk, frameWidth(), frameHeight(), attachments) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
966 |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
967 renderdata.flushAllMemory() |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
968 |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
969 var start = getMonoTime() |
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
970 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
971 withNextFrame(framebuffer, commandbuffer): |
1332 | 972 withRenderPass( |
973 offscreenRP, | |
974 offscreenFB, | |
975 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
976 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
977 frameHeight(), |
1332 | 978 vec4(0, 0, 0, 0), |
979 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
980 withPipeline(commandbuffer, drawPipeline): |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
981 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
982 |
1332 | 983 withRenderPass( |
984 presentRP, | |
985 framebuffer, | |
986 commandbuffer, | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
987 frameWidth(), |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
988 frameHeight(), |
1332 | 989 vec4(0, 0, 0, 0), |
990 ): | |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
991 withPipeline(commandbuffer, presentPipeline): |
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
992 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline) |
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
993 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
994 |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
995 # cleanup |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
996 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
997 destroyPipeline(presentPipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
998 destroyPipeline(drawPipeline) |
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
999 destroyRenderData(renderdata) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
1000 if depthImage.Valid: |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1001 vkDestroyImageView(engine().vulkan.device, depthImageView, nil) |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1002 vkDestroyImage(engine().vulkan.device, depthImage, nil) |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1003 vkFreeMemory(engine().vulkan.device, depthMemory, nil) |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
1004 if msaaImage.Valid: |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1005 vkDestroyImageView(engine().vulkan.device, msaaImageView, nil) |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1006 vkDestroyImage(engine().vulkan.device, msaaImage, nil) |
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1007 vkFreeMemory(engine().vulkan.device, msaaMemory, nil) |
1285
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1008 destroyRenderPass(offscreenRP) |
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1009 destroyRenderPass(presentRP) |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1010 vkDestroyFramebuffer(engine().vulkan.device, offscreenFB, nil) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1011 clearSwapchain() |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1012 |
1204 | 1013 when isMainModule: |
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
1014 var time = 1'f32 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1015 initEngine("Test rendering") |
1204 | 1016 |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
1017 var renderPasses = [ |
1332 | 1018 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), |
1019 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), | |
1020 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), | |
1021 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), | |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
1022 ] |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1023 |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
1024 #[ |
1204 | 1025 # test normal |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
1026 var renderpass: RenderPass |
1230 | 1027 for i, (depthBuffer, samples) in renderPasses: |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
1028 renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) |
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
1029 setupSwapchain(renderpass = renderpass, vSync = false, tripleBuffering = false) |
1204 | 1030 |
1230 | 1031 # tests a simple triangle with minimalistic shader and vertex format |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1032 test_01_triangle(time, renderpass) |
1230 | 1033 |
1034 # tests instanced triangles and quads, mixing meshes and instances | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1035 test_02_triangle_quad_instanced(time, renderpass) |
1210 | 1036 |
1230 | 1037 # teste descriptor sets |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1038 test_03_simple_descriptorset(time, renderpass) |
1204 | 1039 |
1230 | 1040 # tests multiple descriptor sets and arrays |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1041 test_04_multiple_descriptorsets(time, renderpass) |
1231 | 1042 |
1043 # rotating cube | |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1044 test_05_cube(time, renderpass) |
1204 | 1045 |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
1046 # different draw modes (lines, points, and topologies) |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1047 test_06_different_draw_modes(time, renderpass) |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
1048 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1049 test_07_png_texture(time, renderpass) |
1334 | 1050 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1051 test_08_texture_array(time, renderpass) |
1242 | 1052 |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1053 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
1285
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1054 destroyRenderPass(renderpass) |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1055 clearSwapchain() |
1498
d3d667bbdda4
did: add support for per-frame-buffers, still need to limit this, to maybe only mapped buffers
sam <sam@basx.dev>
parents:
1427
diff
changeset
|
1056 ]# |
1204 | 1057 |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1058 # test multiple render passes |
1375
ca3299ea1bdf
did: make vector distinct from arrays, better code for compile-time handling of descriptors
sam <sam@basx.dev>
parents:
1334
diff
changeset
|
1059 for i, (depthBuffer, samples) in renderPasses: |
ca3299ea1bdf
did: make vector distinct from arrays, better code for compile-time handling of descriptors
sam <sam@basx.dev>
parents:
1334
diff
changeset
|
1060 test_09_triangle_2pass(time, depthBuffer, samples) |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1061 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1062 destroyVulkan() |