Mercurial > games > semicongine
annotate tests/test_rendering.nim @ 1499:1f58458b7ef7 default tip main
did: fix a few issues with tests
| author | sam <sam@basx.dev> |
|---|---|
| date | Tue, 14 Oct 2025 00:27:28 +0700 |
| parents | d3d667bbdda4 |
| 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 |
| 1499 | 830 proc test_09_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = |
| 831 var (offscreenRP, presentRP) = 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
|
832 |
|
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
|
833 setupSwapchain(renderpass = presentRP, vSync = false, tripleBuffering = false) |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
834 |
|
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
835 var renderdata = initRenderData() |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
836 |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
837 type |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
838 Uniforms = object |
| 1252 | 839 frameTexture: Image[BGRA] |
| 1332 | 840 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
841 TriangleShader = object |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
842 position {.VertexAttribute.}: Vec3f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
843 color {.VertexAttribute.}: Vec3f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
844 fragmentColor {.Pass.}: Vec3f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
845 outColor {.ShaderOutput.}: Vec4f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
846 # code |
| 1332 | 847 vertexCode: string = |
| 848 """void main() { | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
849 fragmentColor = color; |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
850 gl_Position = vec4(position, 1);}""" |
| 1332 | 851 fragmentCode: string = |
| 852 """void main() { | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
853 outColor = vec4(fragmentColor, 1);}""" |
| 1332 | 854 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
855 PresentShader = object |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
856 position {.VertexAttribute.}: Vec2f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
857 uv {.Pass.}: Vec2f |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
858 outColor {.ShaderOutput.}: Vec4f |
|
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
859 descriptorSets {.DescriptorSet: 0.}: Uniforms |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
860 # code |
| 1332 | 861 vertexCode: string = |
| 862 """void main() { | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
863 uv = ((position + 1) * 0.5) * vec2(1, -1); |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
864 gl_Position = vec4(position, 0, 1);}""" |
| 1332 | 865 fragmentCode: string = |
| 866 """void main() { | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
867 vec2 uv1 = uv + vec2(0.001, 0.001); |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
868 vec2 uv2 = uv + vec2(0.001, -0.001); |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
869 vec2 uv3 = uv + vec2(-0.001, 0.001); |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
870 vec2 uv4 = uv + vec2(-0.001, -0.001); |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
871 outColor = ( |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
872 texture(frameTexture, uv1) + |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
873 texture(frameTexture, uv2) + |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
874 texture(frameTexture, uv3) + |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
875 texture(frameTexture, uv4) |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
876 ) / 4; |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
877 }""" |
| 1332 | 878 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
879 TriangleMesh = object |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
880 position: GPUArray[Vec3f, VertexBuffer] |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
881 color: GPUArray[Vec3f, VertexBuffer] |
| 1332 | 882 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
883 QuadMesh = object |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
884 position: GPUArray[Vec2f, VertexBuffer] |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
885 indices: GPUArray[uint16, IndexBuffer] |
| 1332 | 886 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
887 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
|
888 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
|
889 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
|
890 ) |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
891 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
|
892 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
|
893 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
|
894 ) |
|
1322
4a1c2b1128bc
did: improve handling of descriptor sets
sam <sam@basx.dev>
parents:
1299
diff
changeset
|
895 var uniforms1 = asDescriptorSetData( |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
896 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
|
897 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
|
898 ) |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
899 ) |
|
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
900 assignBuffers(renderdata, mesh) |
|
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
901 assignBuffers(renderdata, quad) |
|
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
902 uploadImages(renderdata, uniforms1) |
|
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
903 renderdata.flushAllMemory() |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
904 |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
905 var |
|
1414
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
906 drawPipeline = createPipeline(TriangleShader(), renderPass = offscreenRP) |
|
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
sam <sam@basx.dev>
parents:
1375
diff
changeset
|
907 presentPipeline = createPipeline(PresentShader(), renderPass = presentRP) |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
908 |
|
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
909 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
|
910 |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
911 # 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
|
912 var |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
913 depthImage: VkImage |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
914 depthImageView: VkImageView |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
915 depthMemory: VkDeviceMemory |
| 1499 | 916 |
|
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
917 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
|
918 depthImage = svkCreate2DImage( |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
919 width = frameWidth(), |
|
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
920 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
|
921 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
|
922 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
|
923 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
|
924 ) |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
925 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
|
926 depthMemory = svkAllocateMemory( |
| 1332 | 927 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
|
928 ) |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
929 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
|
930 depthImageView = svkCreate2DImageView( |
| 1332 | 931 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
|
932 ) |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
933 |
|
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
|
934 # 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
|
935 var |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
936 msaaImage: VkImage |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
937 msaaImageView: VkImageView |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
938 msaaMemory: VkDeviceMemory |
| 1499 | 939 |
|
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
940 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
|
941 msaaImage = svkCreate2DImage( |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
942 width = frameWidth(), |
|
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
943 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
|
944 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
|
945 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
|
946 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
|
947 ) |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
948 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
|
949 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
|
950 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
|
951 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
|
952 |
|
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
953 var attachments: seq[VkImageView] |
| 1499 | 954 for j in 0 ..< INFLIGHTFRAMES: |
| 955 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT: | |
| 956 if offscreenRP.depthBuffer: | |
| 957 attachments = @[uniforms1.data[j].frameTexture.imageview, depthImageView] | |
| 958 else: | |
| 959 attachments = @[uniforms1.data[j].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: |
| 1499 | 961 if offscreenRP.depthBuffer: |
| 962 attachments = @[msaaImageView, depthImageView, uniforms1.data[j].frameTexture.imageview] | |
| 963 else: | |
| 964 attachments = @[msaaImageView, uniforms1.data[j].frameTexture.imageview] | |
| 965 | |
|
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
|
966 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
|
967 |
|
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
|
968 renderdata.flushAllMemory() |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
969 |
|
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
970 var start = getMonoTime() |
|
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
971 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 1499 | 972 discard updateInputs() |
| 973 if keyWasPressed(Space): | |
| 974 withNextFrame(framebuffer, commandbuffer): | |
| 975 withRenderPass( | |
| 976 offscreenRP, | |
| 977 offscreenFB, | |
| 978 commandbuffer, | |
| 979 frameWidth(), | |
| 980 frameHeight(), | |
| 981 vec4(0.5, 0.5, 0.5, 1), | |
| 982 ): | |
| 983 withPipeline(commandbuffer, drawPipeline): | |
| 984 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) | |
| 985 | |
| 986 withRenderPass( | |
| 987 presentRP, | |
| 988 framebuffer, | |
| 989 commandbuffer, | |
| 990 frameWidth(), | |
| 991 frameHeight(), | |
| 992 vec4(1, 0, 1, 1), | |
| 993 ): | |
| 994 withPipeline(commandbuffer, presentPipeline): | |
| 995 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline) | |
| 996 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
997 |
|
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
998 # cleanup |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
999 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
|
1000 destroyPipeline(presentPipeline) |
|
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1001 destroyPipeline(drawPipeline) |
|
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1002 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
|
1003 if depthImage.Valid: |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1004 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
|
1005 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
|
1006 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
|
1007 if msaaImage.Valid: |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1008 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
|
1009 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
|
1010 vkFreeMemory(engine().vulkan.device, msaaMemory, nil) |
|
1285
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1011 destroyRenderPass(offscreenRP) |
|
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1012 destroyRenderPass(presentRP) |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1013 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
|
1014 clearSwapchain() |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1015 |
| 1204 | 1016 when isMainModule: |
|
1235
c70fee6568f6
did: improv render tests to run without user input
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
1017 var time = 1'f32 |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1018 initEngine("Test rendering") |
| 1204 | 1019 |
|
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
1020 var renderPasses = [ |
| 1332 | 1021 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), |
| 1022 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), | |
| 1023 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), | |
| 1024 (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
|
1025 ] |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1026 |
|
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
|
1027 #[ |
| 1204 | 1028 # 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
|
1029 var renderpass: RenderPass |
| 1230 | 1030 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
|
1031 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
|
1032 setupSwapchain(renderpass = renderpass, vSync = false, tripleBuffering = false) |
| 1204 | 1033 |
| 1230 | 1034 # 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
|
1035 test_01_triangle(time, renderpass) |
| 1230 | 1036 |
| 1037 # 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
|
1038 test_02_triangle_quad_instanced(time, renderpass) |
| 1210 | 1039 |
| 1230 | 1040 # teste descriptor sets |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1041 test_03_simple_descriptorset(time, renderpass) |
| 1204 | 1042 |
| 1230 | 1043 # 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
|
1044 test_04_multiple_descriptorsets(time, renderpass) |
| 1231 | 1045 |
| 1046 # rotating cube | |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1047 test_05_cube(time, renderpass) |
| 1204 | 1048 |
|
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
1049 # 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
|
1050 test_06_different_draw_modes(time, renderpass) |
|
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
1051 |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1052 test_07_png_texture(time, renderpass) |
| 1334 | 1053 |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1054 test_08_texture_array(time, renderpass) |
| 1242 | 1055 |
|
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1414
diff
changeset
|
1056 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) |
|
1285
6d16003406fb
add: missing destroy-function for renderpass
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
1057 destroyRenderPass(renderpass) |
|
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1058 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
|
1059 ]# |
| 1204 | 1060 |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1061 # test multiple render passes |
| 1499 | 1062 test_09_triangle_2pass(1000'f, true, VK_SAMPLE_COUNT_1_BIT) |
| 1063 # for i, (depthBuffer, samples) in renderPasses: | |
| 1064 # test_09_triangle_2pass(time, depthBuffer, samples) | |
|
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1213
diff
changeset
|
1065 |
|
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1280
diff
changeset
|
1066 destroyVulkan() |
