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: 
1232diff
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: 
1285diff
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: 
1427diff
changeset | 13 import ../semicongine/images | 
| 1203 | 14 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1299diff
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: 
1277diff
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: 
1280diff
changeset | 47 assignBuffers(renderdata, mesh) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 48 renderdata.flushAllMemory() | 
| 1203 | 49 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1233diff
changeset | 52 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 59 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1414diff
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: 
1280diff
changeset | 75 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 76 destroyRenderData(renderdata) | 
| 1203 | 77 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1280diff
changeset | 137 assignBuffers(renderdata, tri) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 138 assignBuffers(renderdata, quad) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 139 assignBuffers(renderdata, instancesA) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 140 assignBuffers(renderdata, instancesB) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 141 renderdata.flushAllMemory() | 
| 1204 | 142 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1233diff
changeset | 145 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 152 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1414diff
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: 
1280diff
changeset | 184 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 185 destroyRenderData(renderdata) | 
| 1204 | 186 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1299diff
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: 
1299diff
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: 
1277diff
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: 
1299diff
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: 
1277diff
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: 
1280diff
changeset | 251 assignBuffers(renderdata, quad) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 252 assignBuffers(renderdata, uniforms1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 253 assignBuffers(renderdata, uniforms2) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 254 uploadImages(renderdata, uniforms1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 255 uploadImages(renderdata, uniforms2) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 256 renderdata.flushAllMemory() | 
| 1210 | 257 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1280diff
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: 
1233diff
changeset | 263 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 270 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 274 withPipeline(commandbuffer, pipeline): | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 275 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 276 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 
| 1242 | 277 | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 278 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1414diff
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: 
1280diff
changeset | 283 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 284 destroyRenderData(renderdata) | 
| 1210 | 285 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1299diff
changeset | 319 descriptorSets0 {.DescriptorSet: 0.}: ConstSet | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 320 descriptorSets1 {.DescriptorSet: 1.}: MainSet | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1299diff
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: 
1299diff
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: 
1277diff
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: 
1277diff
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: 
1299diff
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: 
1427diff
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: 
1299diff
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: 
1427diff
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: 
1280diff
changeset | 387 assignBuffers(renderdata, quad) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 388 assignBuffers(renderdata, constset) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 389 assignBuffers(renderdata, mainset) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 390 assignBuffers(renderdata, otherset1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 391 assignBuffers(renderdata, otherset2) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 392 uploadImages(renderdata, mainset) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 393 renderdata.flushAllMemory() | 
| 1204 | 394 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1280diff
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: 
1280diff
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: 
1280diff
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: 
1204diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
changeset | 404 | 
| 1235 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
changeset | 405 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
changeset | 414 | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 415 withNextFrame(framebuffer, commandbuffer): | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 416 bindDescriptorSet(commandbuffer, constset, 0, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1414diff
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: 
1414diff
changeset | 423 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 427 withPipeline(commandbuffer, pipeline): | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 428 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 429 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 
| 1242 | 430 | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 431 bindDescriptorSet(commandbuffer, otherset2, 2, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1414diff
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: 
1280diff
changeset | 436 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 437 destroyRenderData(renderdata) | 
| 1204 | 438 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1299diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1277diff
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: 
1280diff
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: 
1280diff
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: 
1277diff
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: 
1280diff
changeset | 534 assignBuffers(renderdata, floor) | 
| 1231 | 535 | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1280diff
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: 
1280diff
changeset | 541 renderdata.flushAllMemory() | 
| 1231 | 542 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
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: 
1233diff
changeset | 549 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
changeset | 550 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 
| 1233 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
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: 
1427diff
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: 
1427diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 566 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 570 withPipeline(commandbuffer, pipeline): | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 571 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 572 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 573 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) | 
| 1233 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
changeset | 574 | 
| 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
changeset | 575 let tEndLoop = getMonoTime() - tStart | 
| 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
changeset | 576 let looptime = tEndLoop - tStartLoop | 
| 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
changeset | 577 let waitTime = 16_666 - looptime.inMicroseconds | 
| 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
changeset | 578 if waitTime > 0: | 
| 
1cf698973dca
did: cleanup tests and old platform layer files
 sam <sam@basx.dev> parents: 
1232diff
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: 
1414diff
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: 
1280diff
changeset | 583 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 584 destroyRenderData(renderdata) | 
| 1231 | 585 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 587 var renderdata = initRenderData() | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 588 | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 589 type | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 590 Shader = object | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 591 position {.VertexAttribute.}: Vec3f | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 592 color {.VertexAttribute.}: Vec3f | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 593 fragmentColor {.Pass.}: Vec3f | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 594 outColor {.ShaderOutput.}: Vec4f | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 595 # code | 
| 1332 | 596 vertexCode: string = | 
| 597 """void main() { | |
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 598 gl_PointSize = 100; | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 599 fragmentColor = color; | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
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: 
1239diff
changeset | 603 outColor = vec4(fragmentColor, 1);}""" | 
| 1332 | 604 | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 605 TriangleMesh = object | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 606 position: GPUArray[Vec3f, VertexBuffer] | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 607 color: GPUArray[Vec3f, VertexBuffer] | 
| 1332 | 608 | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
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: 
1277diff
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: 
1239diff
changeset | 614 ) | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
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: 
1239diff
changeset | 623 ) | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 624 assignBuffers(renderdata, triangle) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 625 assignBuffers(renderdata, lines) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 626 renderdata.flushAllMemory() | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 627 | 
| 1414 
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
 sam <sam@basx.dev> parents: 
1375diff
changeset | 628 var pipeline1 = createPipeline( | 
| 
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
 sam <sam@basx.dev> parents: 
1375diff
changeset | 629 Shader(), | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1375diff
changeset | 634 var pipeline2 = createPipeline( | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1375diff
changeset | 637 var pipeline3 = createPipeline( | 
| 
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
 sam <sam@basx.dev> parents: 
1375diff
changeset | 638 Shader(), | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1375diff
changeset | 643 var pipeline4 = createPipeline( | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1239diff
changeset | 646 | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 647 var start = getMonoTime() | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 654 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 658 withPipeline(commandbuffer, pipeline1): | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1280diff
changeset | 660 withPipeline(commandbuffer, pipeline2): | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1280diff
changeset | 662 withPipeline(commandbuffer, pipeline3): | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1280diff
changeset | 664 withPipeline(commandbuffer, pipeline4): | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 665 render(commandbuffer = commandbuffer, pipeline = pipeline4, mesh = lines) | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 666 | 
| 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 667 # cleanup | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 669 destroyPipeline(pipeline1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 670 destroyPipeline(pipeline2) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 671 destroyPipeline(pipeline3) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 672 destroyPipeline(pipeline4) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 673 destroyRenderData(renderdata) | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 674 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1414diff
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: 
1414diff
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: 
1414diff
changeset | 742 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1414diff
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: 
1414diff
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: 
1280diff
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: 
1299diff
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: 
1280diff
changeset | 802 assignBuffers(renderdata, mesh) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 803 renderdata.flushAllMemory() | 
| 1242 | 804 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 807 uploadImages(renderdata, uniforms1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1280diff
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: 
1414diff
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: 
1414diff
changeset | 817 frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 821 withPipeline(commandbuffer, pipeline): | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 822 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) | 
| 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
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: 
1414diff
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: 
1280diff
changeset | 827 destroyPipeline(pipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1235diff
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: 
1427diff
changeset | 833 setupSwapchain(renderpass = presentRP, vSync = false, tripleBuffering = false) | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 834 | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 835 var renderdata = initRenderData() | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 836 | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 837 type | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1213diff
changeset | 841 TriangleShader = object | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 842 position {.VertexAttribute.}: Vec3f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 843 color {.VertexAttribute.}: Vec3f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 844 fragmentColor {.Pass.}: Vec3f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 845 outColor {.ShaderOutput.}: Vec4f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 846 # code | 
| 1332 | 847 vertexCode: string = | 
| 848 """void main() { | |
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 849 fragmentColor = color; | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1213diff
changeset | 853 outColor = vec4(fragmentColor, 1);}""" | 
| 1332 | 854 | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 855 PresentShader = object | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 856 position {.VertexAttribute.}: Vec2f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 857 uv {.Pass.}: Vec2f | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 858 outColor {.ShaderOutput.}: Vec4f | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 859 descriptorSets {.DescriptorSet: 0.}: Uniforms | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 860 # code | 
| 1332 | 861 vertexCode: string = | 
| 862 """void main() { | |
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 863 uv = ((position + 1) * 0.5) * vec2(1, -1); | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1213diff
changeset | 867 vec2 uv1 = uv + vec2(0.001, 0.001); | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 868 vec2 uv2 = uv + vec2(0.001, -0.001); | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 869 vec2 uv3 = uv + vec2(-0.001, 0.001); | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 870 vec2 uv4 = uv + vec2(-0.001, -0.001); | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 871 outColor = ( | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 872 texture(frameTexture, uv1) + | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 873 texture(frameTexture, uv2) + | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 874 texture(frameTexture, uv3) + | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 875 texture(frameTexture, uv4) | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 876 ) / 4; | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 877 }""" | 
| 1332 | 878 | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 879 TriangleMesh = object | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 880 position: GPUArray[Vec3f, VertexBuffer] | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 881 color: GPUArray[Vec3f, VertexBuffer] | 
| 1332 | 882 | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 883 QuadMesh = object | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 884 position: GPUArray[Vec2f, VertexBuffer] | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 885 indices: GPUArray[uint16, IndexBuffer] | 
| 1332 | 886 | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1427diff
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: 
1427diff
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: 
1213diff
changeset | 890 ) | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1427diff
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: 
1427diff
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: 
1213diff
changeset | 894 ) | 
| 1322 
4a1c2b1128bc
did: improve handling of descriptor sets
 sam <sam@basx.dev> parents: 
1299diff
changeset | 895 var uniforms1 = asDescriptorSetData( | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1427diff
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: 
1213diff
changeset | 898 ) | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 899 ) | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 900 assignBuffers(renderdata, mesh) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 901 assignBuffers(renderdata, quad) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 902 uploadImages(renderdata, uniforms1) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 903 renderdata.flushAllMemory() | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 904 | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 905 var | 
| 1414 
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
 sam <sam@basx.dev> parents: 
1375diff
changeset | 906 drawPipeline = createPipeline(TriangleShader(), renderPass = offscreenRP) | 
| 
5e5a3311ca44
did: small improvment to allow easy adjustment of shader-code
 sam <sam@basx.dev> parents: 
1375diff
changeset | 907 presentPipeline = createPipeline(PresentShader(), renderPass = presentRP) | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 908 | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1228diff
changeset | 910 | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
changeset | 912 var | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 913 depthImage: VkImage | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 914 depthImageView: VkImageView | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
changeset | 917 if offscreenRP.depthBuffer: | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 918 depthImage = svkCreate2DImage( | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 919 width = frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 920 height = frameHeight(), | 
| 1229 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 921 format = DEPTH_FORMAT, | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
changeset | 923 samples = offscreenRP.samples, | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 924 ) | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
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: 
1228diff
changeset | 928 ) | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1228diff
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: 
1228diff
changeset | 932 ) | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1427diff
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: 
1228diff
changeset | 935 var | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 936 msaaImage: VkImage | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 937 msaaImageView: VkImageView | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
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: 
1228diff
changeset | 941 msaaImage = svkCreate2DImage( | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 942 width = frameWidth(), | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 943 height = frameHeight(), | 
| 1229 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 944 format = SURFACE_FORMAT, | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
changeset | 946 samples = offscreenRP.samples, | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 947 ) | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1427diff
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: 
1414diff
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: 
1228diff
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: 
1228diff
changeset | 952 | 
| 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
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: 
1228diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
changeset | 968 renderdata.flushAllMemory() | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 969 | 
| 1235 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
changeset | 970 var start = getMonoTime() | 
| 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
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: 
1213diff
changeset | 997 | 
| 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 998 # cleanup | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 1000 destroyPipeline(presentPipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 1001 destroyPipeline(drawPipeline) | 
| 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 1002 destroyRenderData(renderdata) | 
| 1229 
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
 sam <sam@basx.dev> parents: 
1228diff
changeset | 1003 if depthImage.Valid: | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 1004 vkDestroyImageView(engine().vulkan.device, depthImageView, nil) | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 1005 vkDestroyImage(engine().vulkan.device, depthImage, nil) | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1228diff
changeset | 1007 if msaaImage.Valid: | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 1008 vkDestroyImageView(engine().vulkan.device, msaaImageView, nil) | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 1009 vkDestroyImage(engine().vulkan.device, msaaImage, nil) | 
| 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
changeset | 1010 vkFreeMemory(engine().vulkan.device, msaaMemory, nil) | 
| 1285 
6d16003406fb
add: missing destroy-function for renderpass
 sam <sam@basx.dev> parents: 
1283diff
changeset | 1011 destroyRenderPass(offscreenRP) | 
| 
6d16003406fb
add: missing destroy-function for renderpass
 sam <sam@basx.dev> parents: 
1283diff
changeset | 1012 destroyRenderPass(presentRP) | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1280diff
changeset | 1014 clearSwapchain() | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
changeset | 1015 | 
| 1204 | 1016 when isMainModule: | 
| 1235 
c70fee6568f6
did: improv render tests to run without user input
 sam <sam@basx.dev> parents: 
1233diff
changeset | 1017 var time = 1'f32 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1228diff
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: 
1228diff
changeset | 1025 ] | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1427diff
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: 
1414diff
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: 
1414diff
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: 
1414diff
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: 
1414diff
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: 
1414diff
changeset | 1047 test_05_cube(time, renderpass) | 
| 1204 | 1048 | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
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: 
1414diff
changeset | 1050 test_06_different_draw_modes(time, renderpass) | 
| 1240 
42eeb59f3a43
add: more tests, line and point rendering
 sam <sam@basx.dev> parents: 
1239diff
changeset | 1051 | 
| 1423 
3b8a736c45a7
did: put almost all global state into a single struct
 sam <sam@basx.dev> parents: 
1414diff
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: 
1414diff
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: 
1414diff
changeset | 1056 checkVkResult vkDeviceWaitIdle(engine().vulkan.device) | 
| 1285 
6d16003406fb
add: missing destroy-function for renderpass
 sam <sam@basx.dev> parents: 
1283diff
changeset | 1057 destroyRenderPass(renderpass) | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
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: 
1427diff
changeset | 1059 ]# | 
| 1204 | 1060 | 
| 1214 
04e446a7eb2b
add: multipass renderer, finish tets for now
 sam <sam@basx.dev> parents: 
1213diff
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: 
1213diff
changeset | 1065 | 
| 1283 
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
 sam <sam@basx.dev> parents: 
1280diff
changeset | 1066 destroyVulkan() | 
