comparison tests/test_rendering.nim @ 1332:df3c075e5dea

did: formatting
author sam <sam@basx.dev>
date Thu, 22 Aug 2024 18:31:59 +0700
parents 4a1c2b1128bc
children d5a6f69dc855
comparison
equal deleted inserted replaced
1331:1abdd42f5cfe 1332:df3c075e5dea
12 var renderdata = initRenderData() 12 var renderdata = initRenderData()
13 13
14 type 14 type
15 PushConstant = object 15 PushConstant = object
16 scale: float32 16 scale: float32
17
17 Shader = object 18 Shader = object
18 position {.VertexAttribute.}: Vec3f 19 position {.VertexAttribute.}: Vec3f
19 color {.VertexAttribute.}: Vec3f 20 color {.VertexAttribute.}: Vec3f
20 pushConstant {.PushConstant.}: PushConstant 21 pushConstant {.PushConstant.}: PushConstant
21 fragmentColor {.Pass.}: Vec3f 22 fragmentColor {.Pass.}: Vec3f
22 outColor {.ShaderOutput.}: Vec4f 23 outColor {.ShaderOutput.}: Vec4f
23 # code 24 # code
24 vertexCode: string = """void main() { 25 vertexCode: string =
26 """void main() {
25 fragmentColor = color; 27 fragmentColor = color;
26 gl_Position = vec4(position * pushConstant.scale, 1);}""" 28 gl_Position = vec4(position * pushConstant.scale, 1);}"""
27 fragmentCode: string = """void main() { 29 fragmentCode: string =
30 """void main() {
28 outColor = vec4(fragmentColor, 1);}""" 31 outColor = vec4(fragmentColor, 1);}"""
32
29 TriangleMesh = object 33 TriangleMesh = object
30 position: GPUArray[Vec3f, VertexBuffer] 34 position: GPUArray[Vec3f, VertexBuffer]
31 color: GPUArray[Vec3f, VertexBuffer] 35 color: GPUArray[Vec3f, VertexBuffer]
36
32 var mesh = TriangleMesh( 37 var mesh = TriangleMesh(
33 position: asGPUArray([vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer), 38 position: asGPUArray(
39 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer
40 ),
34 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), 41 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
35 ) 42 )
36 assignBuffers(renderdata, mesh) 43 assignBuffers(renderdata, mesh)
37 renderdata.flushAllMemory() 44 renderdata.flushAllMemory()
38 45
39 var pipeline = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass) 46 var pipeline = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass)
40 47
41 var start = getMonoTime() 48 var start = getMonoTime()
42 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 49 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
43
44 withNextFrame(framebuffer, commandbuffer): 50 withNextFrame(framebuffer, commandbuffer):
45 51 withRenderPass(
46 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 52 vulkan.swapchain.renderPass,
47 53 framebuffer,
54 commandbuffer,
55 vulkan.swapchain.width,
56 vulkan.swapchain.height,
57 vec4(0, 0, 0, 0),
58 ):
48 withPipeline(commandbuffer, pipeline): 59 withPipeline(commandbuffer, pipeline):
49 60 renderWithPushConstant(
50 renderWithPushConstant(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh, pushConstant = PushConstant(scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000))) 61 commandbuffer = commandbuffer,
62 pipeline = pipeline,
63 mesh = mesh,
64 pushConstant = PushConstant(
65 scale: 0.3 + ((getMonoTime() - start).inMilliseconds().int / 1000)
66 ),
67 )
51 68
52 # cleanup 69 # cleanup
53 checkVkResult vkDeviceWaitIdle(vulkan.device) 70 checkVkResult vkDeviceWaitIdle(vulkan.device)
54 destroyPipeline(pipeline) 71 destroyPipeline(pipeline)
55 destroyRenderData(renderdata) 72 destroyRenderData(renderdata)
56
57 73
58 proc test_02_triangle_quad_instanced(time: float32) = 74 proc test_02_triangle_quad_instanced(time: float32) =
59 var renderdata = initRenderData() 75 var renderdata = initRenderData()
60 76
61 type 77 type
65 pos {.InstanceAttribute.}: Vec3f 81 pos {.InstanceAttribute.}: Vec3f
66 scale {.InstanceAttribute.}: float32 82 scale {.InstanceAttribute.}: float32
67 fragmentColor {.Pass.}: Vec3f 83 fragmentColor {.Pass.}: Vec3f
68 outColor {.ShaderOutput.}: Vec4f 84 outColor {.ShaderOutput.}: Vec4f
69 # code 85 # code
70 vertexCode: string = """void main() { 86 vertexCode: string =
87 """void main() {
71 fragmentColor = color; 88 fragmentColor = color;
72 gl_Position = vec4((position * scale) + pos, 1);}""" 89 gl_Position = vec4((position * scale) + pos, 1);}"""
73 fragmentCode: string = """void main() { 90 fragmentCode: string =
91 """void main() {
74 outColor = vec4(fragmentColor, 1);}""" 92 outColor = vec4(fragmentColor, 1);}"""
93
75 TriangleMesh = object 94 TriangleMesh = object
76 position: GPUArray[Vec3f, VertexBuffer] 95 position: GPUArray[Vec3f, VertexBuffer]
77 color: GPUArray[Vec3f, VertexBuffer] 96 color: GPUArray[Vec3f, VertexBuffer]
97
78 QuadMesh = object 98 QuadMesh = object
79 position: GPUArray[Vec3f, VertexBuffer] 99 position: GPUArray[Vec3f, VertexBuffer]
80 color: GPUArray[Vec3f, VertexBuffer] 100 color: GPUArray[Vec3f, VertexBuffer]
81 indices: GPUArray[uint16, IndexBuffer] 101 indices: GPUArray[uint16, IndexBuffer]
102
82 Instances = object 103 Instances = object
83 pos: GPUArray[Vec3f, VertexBuffer] 104 pos: GPUArray[Vec3f, VertexBuffer]
84 scale: GPUArray[float32, VertexBuffer] 105 scale: GPUArray[float32, VertexBuffer]
106
85 var tri = TriangleMesh( 107 var tri = TriangleMesh(
86 position: asGPUArray([vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer), 108 position: asGPUArray(
109 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer
110 ),
87 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), 111 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
88 ) 112 )
89 var quad = QuadMesh( 113 var quad = QuadMesh(
90 position: asGPUArray([vec3(-0.3, -0.3, 0), vec3(-0.3, 0.3, 0), vec3(0.3, 0.3, 0), vec3(0.3, -0.3, 0)], VertexBuffer), 114 position: asGPUArray(
115 [vec3(-0.3, -0.3, 0), vec3(-0.3, 0.3, 0), vec3(0.3, 0.3, 0), vec3(0.3, -0.3, 0)],
116 VertexBuffer,
117 ),
91 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 118 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
92 color: asGPUArray([vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1)], VertexBuffer), 119 color: asGPUArray(
120 [vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1), vec3(1, 1, 1)], VertexBuffer
121 ),
93 ) 122 )
94 123
95 var instancesA: Instances 124 var instancesA: Instances
96 for n in 1..100: 125 for n in 1 .. 100:
97 instancesA.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(-0.8'f32 .. 0'f32), 0) 126 instancesA.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(-0.8'f32 .. 0'f32), 0)
98 instancesA.scale.data.add rand(0.3'f32 .. 0.4'f32) 127 instancesA.scale.data.add rand(0.3'f32 .. 0.4'f32)
99 var instancesB: Instances 128 var instancesB: Instances
100 for n in 1..100: 129 for n in 1 .. 100:
101 instancesB.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(0'f32 .. 0.8'f32), 0) 130 instancesB.pos.data.add vec3(rand(-0.8'f32 .. 0.8'f32), rand(0'f32 .. 0.8'f32), 0)
102 instancesB.scale.data.add rand(0.1'f32 .. 0.2'f32) 131 instancesB.scale.data.add rand(0.1'f32 .. 0.2'f32)
103 132
104 assignBuffers(renderdata, tri) 133 assignBuffers(renderdata, tri)
105 assignBuffers(renderdata, quad) 134 assignBuffers(renderdata, quad)
109 138
110 var pipeline = createPipeline[SomeShader](renderPass = vulkan.swapchain.renderPass) 139 var pipeline = createPipeline[SomeShader](renderPass = vulkan.swapchain.renderPass)
111 140
112 var start = getMonoTime() 141 var start = getMonoTime()
113 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 142 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
114
115 withNextFrame(framebuffer, commandbuffer): 143 withNextFrame(framebuffer, commandbuffer):
116 144 withRenderPass(
117 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 145 vulkan.swapchain.renderPass,
118 146 framebuffer,
147 commandbuffer,
148 vulkan.swapchain.width,
149 vulkan.swapchain.height,
150 vec4(0, 0, 0, 0),
151 ):
119 withPipeline(commandbuffer, pipeline): 152 withPipeline(commandbuffer, pipeline):
120 153 render(
121 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) 154 commandbuffer = commandbuffer,
122 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) 155 pipeline = pipeline,
123 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) 156 mesh = quad,
124 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) 157 instances = instancesA,
158 )
159 render(
160 commandbuffer = commandbuffer,
161 pipeline = pipeline,
162 mesh = quad,
163 instances = instancesB,
164 )
165 render(
166 commandbuffer = commandbuffer,
167 pipeline = pipeline,
168 mesh = tri,
169 instances = instancesA,
170 )
171 render(
172 commandbuffer = commandbuffer,
173 pipeline = pipeline,
174 mesh = tri,
175 instances = instancesB,
176 )
125 177
126 # cleanup 178 # cleanup
127 checkVkResult vkDeviceWaitIdle(vulkan.device) 179 checkVkResult vkDeviceWaitIdle(vulkan.device)
128 destroyPipeline(pipeline) 180 destroyPipeline(pipeline)
129 destroyRenderData(renderdata) 181 destroyRenderData(renderdata)
144 fragmentColor {.Pass.}: Vec3f 196 fragmentColor {.Pass.}: Vec3f
145 uv {.Pass.}: Vec2f 197 uv {.Pass.}: Vec2f
146 outColor {.ShaderOutput.}: Vec4f 198 outColor {.ShaderOutput.}: Vec4f
147 descriptorSets {.DescriptorSet: 0.}: Uniforms 199 descriptorSets {.DescriptorSet: 0.}: Uniforms
148 # code 200 # code
149 vertexCode: string = """void main() { 201 vertexCode: string =
202 """void main() {
150 fragmentColor = material.baseColor; 203 fragmentColor = material.baseColor;
151 gl_Position = vec4(position, 1); 204 gl_Position = vec4(position, 1);
152 gl_Position.x += ((material.baseColor.b - 0.5) * 2) - 0.5; 205 gl_Position.x += ((material.baseColor.b - 0.5) * 2) - 0.5;
153 uv = position.xy + 0.5; 206 uv = position.xy + 0.5;
154 }""" 207 }"""
155 fragmentCode: string = """void main() { 208 fragmentCode: string =
209 """void main() {
156 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" 210 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}"""
211
157 QuadMesh = object 212 QuadMesh = object
158 position: GPUArray[Vec3f, VertexBuffer] 213 position: GPUArray[Vec3f, VertexBuffer]
159 indices: GPUArray[uint16, IndexBuffer] 214 indices: GPUArray[uint16, IndexBuffer]
160 215
161 let R = BGRA([255'u8, 0'u8, 0'u8, 255'u8]) 216 let R = BGRA([255'u8, 0'u8, 0'u8, 255'u8])
162 let G = BGRA([0'u8, 255'u8, 0'u8, 255'u8]) 217 let G = BGRA([0'u8, 255'u8, 0'u8, 255'u8])
163 let B = BGRA([0'u8, 0'u8, 255'u8, 255'u8]) 218 let B = BGRA([0'u8, 0'u8, 255'u8, 255'u8])
164 let W = BGRA([255'u8, 255'u8, 255'u8, 255'u8]) 219 let W = BGRA([255'u8, 255'u8, 255'u8, 255'u8])
165 var 220 var
166 quad = QuadMesh( 221 quad = QuadMesh(
167 position: asGPUArray([vec3(-0.5, -0.5, 0), vec3(-0.5, 0.5, 0), vec3(0.5, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer), 222 position: asGPUArray(
223 [vec3(-0.5, -0.5, 0), vec3(-0.5, 0.5, 0), vec3(0.5, 0.5, 0), vec3(0.5, -0.5, 0)],
224 VertexBuffer,
225 ),
168 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 226 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
169 ) 227 )
170 uniforms1 = asDescriptorSetData( 228 uniforms1 = asDescriptorSetData(
171 Uniforms( 229 Uniforms(
172 material: asGPUValue(Material(baseColor: vec3(1, 1, 1)), UniformBuffer), 230 material: asGPUValue(Material(baseColor: vec3(1, 1, 1)), UniformBuffer),
173 texture1: Image[BGRA](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), 231 texture1: Image[BGRA](
232 width: 3,
233 height: 3,
234 data: @[R, G, B, G, B, R, B, R, G],
235 minInterpolation: VK_FILTER_NEAREST,
236 magInterpolation: VK_FILTER_NEAREST,
237 ),
174 ) 238 )
175 ) 239 )
176 uniforms2 = asDescriptorSetData( 240 uniforms2 = asDescriptorSetData(
177 Uniforms( 241 Uniforms(
178 material: asGPUValue(Material(baseColor: vec3(0.5, 0.5, 0.5)), UniformBuffer), 242 material: asGPUValue(Material(baseColor: vec3(0.5, 0.5, 0.5)), UniformBuffer),
179 texture1: Image[BGRA](width: 2, height: 2, data: @[R, G, B, W]), 243 texture1: Image[BGRA](width: 2, height: 2, data: @[R, G, B, W]),
180 ) 244 )
181 ) 245 )
182 246
183 assignBuffers(renderdata, quad) 247 assignBuffers(renderdata, quad)
184 assignBuffers(renderdata, uniforms1) 248 assignBuffers(renderdata, uniforms1)
185 assignBuffers(renderdata, uniforms2) 249 assignBuffers(renderdata, uniforms2)
192 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) 256 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
193 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) 257 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2)
194 258
195 var start = getMonoTime() 259 var start = getMonoTime()
196 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 260 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
197
198 withNextFrame(framebuffer, commandbuffer): 261 withNextFrame(framebuffer, commandbuffer):
199 262 withRenderPass(
200 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 263 vulkan.swapchain.renderPass,
201 264 framebuffer,
265 commandbuffer,
266 vulkan.swapchain.width,
267 vulkan.swapchain.height,
268 vec4(0, 0, 0, 0),
269 ):
202 withPipeline(commandbuffer, pipeline): 270 withPipeline(commandbuffer, pipeline):
203
204 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) 271 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline)
205 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 272 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
206 273
207 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline) 274 bindDescriptorSet(commandbuffer, uniforms2, 0, pipeline)
208 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 275 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
216 var renderdata = initRenderData() 283 var renderdata = initRenderData()
217 284
218 type 285 type
219 RenderSettings = object 286 RenderSettings = object
220 brigthness: float32 287 brigthness: float32
288
221 Material = object 289 Material = object
222 baseColor: Vec3f 290 baseColor: Vec3f
291
223 ObjectSettings = object 292 ObjectSettings = object
224 scale: float32 293 scale: float32
225 materialIndex: uint32 294 materialIndex: uint32
295
226 Constants = object 296 Constants = object
227 offset: Vec2f 297 offset: Vec2f
228 298
229 ConstSet = object 299 ConstSet = object
230 constants: GPUValue[Constants, UniformBuffer] 300 constants: GPUValue[Constants, UniformBuffer]
301
231 MainSet = object 302 MainSet = object
232 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] 303 renderSettings: GPUValue[RenderSettings, UniformBufferMapped]
233 material: array[2, GPUValue[Material, UniformBuffer]] 304 material: array[2, GPUValue[Material, UniformBuffer]]
234 texture1: array[2, Image[Gray]] 305 texture1: array[2, Image[Gray]]
306
235 OtherSet = object 307 OtherSet = object
236 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped] 308 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped]
237 309
238 QuadShader = object 310 QuadShader = object
239 position {.VertexAttribute.}: Vec3f 311 position {.VertexAttribute.}: Vec3f
242 outColor {.ShaderOutput.}: Vec4f 314 outColor {.ShaderOutput.}: Vec4f
243 descriptorSets0 {.DescriptorSet: 0.}: ConstSet 315 descriptorSets0 {.DescriptorSet: 0.}: ConstSet
244 descriptorSets1 {.DescriptorSet: 1.}: MainSet 316 descriptorSets1 {.DescriptorSet: 1.}: MainSet
245 descriptorSets2 {.DescriptorSet: 2.}: OtherSet 317 descriptorSets2 {.DescriptorSet: 2.}: OtherSet
246 # code 318 # code
247 vertexCode: string = """void main() { 319 vertexCode: string =
320 """void main() {
248 fragmentColor = material[objectSettings.materialIndex].baseColor * renderSettings.brigthness; 321 fragmentColor = material[objectSettings.materialIndex].baseColor * renderSettings.brigthness;
249 gl_Position = vec4(position * objectSettings.scale, 1); 322 gl_Position = vec4(position * objectSettings.scale, 1);
250 gl_Position.xy += constants.offset.xy; 323 gl_Position.xy += constants.offset.xy;
251 gl_Position.x += material[objectSettings.materialIndex].baseColor.b - 0.5; 324 gl_Position.x += material[objectSettings.materialIndex].baseColor.b - 0.5;
252 uv = position.xy + 0.5; 325 uv = position.xy + 0.5;
253 }""" 326 }"""
254 fragmentCode: string = """void main() { 327 fragmentCode: string =
328 """void main() {
255 outColor = vec4(fragmentColor * texture(texture1[objectSettings.materialIndex], uv).rrr, 1); 329 outColor = vec4(fragmentColor * texture(texture1[objectSettings.materialIndex], uv).rrr, 1);
256 }""" 330 }"""
331
257 QuadMesh = object 332 QuadMesh = object
258 position: GPUArray[Vec3f, VertexBuffer] 333 position: GPUArray[Vec3f, VertexBuffer]
259 indices: GPUArray[uint16, IndexBuffer] 334 indices: GPUArray[uint16, IndexBuffer]
260 335
261 var quad = QuadMesh( 336 var quad = QuadMesh(
262 position: asGPUArray([vec3(-0.5, -0.5), vec3(-0.5, 0.5), vec3(0.5, 0.5), vec3(0.5, -0.5)], VertexBuffer), 337 position: asGPUArray(
338 [vec3(-0.5, -0.5), vec3(-0.5, 0.5), vec3(0.5, 0.5), vec3(0.5, -0.5)], VertexBuffer
339 ),
263 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 340 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
264 ) 341 )
265 var constset = asDescriptorSetData( 342 var constset = asDescriptorSetData(
266 ConstSet( 343 ConstSet(constants: asGPUValue(Constants(offset: vec2(-0.3, 0.2)), UniformBuffer))
267 constants: asGPUValue(Constants(offset: vec2(-0.3, 0.2)), UniformBuffer),
268 )
269 ) 344 )
270 let G = Gray([50'u8]) 345 let G = Gray([50'u8])
271 let W = Gray([255'u8]) 346 let W = Gray([255'u8])
272 var mainset = asDescriptorSetData( 347 var mainset = asDescriptorSetData(
273 MainSet( 348 MainSet(
274 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), 349 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped),
275 material: [ 350 material: [
276 asGPUValue(Material(baseColor: vec3(1, 1, 0)), UniformBuffer), 351 asGPUValue(Material(baseColor: vec3(1, 1, 0)), UniformBuffer),
277 asGPUValue(Material(baseColor: vec3(1, 0, 1)), UniformBuffer), 352 asGPUValue(Material(baseColor: vec3(1, 0, 1)), UniformBuffer),
278 ], 353 ],
279 texture1: [ 354 texture1: [
280 Image[Gray](width: 2, height: 2, data: @[W, G, G, W], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), 355 Image[Gray](
281 Image[Gray](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], minInterpolation: VK_FILTER_NEAREST, magInterpolation: VK_FILTER_NEAREST), 356 width: 2,
282 ], 357 height: 2,
283 ), 358 data: @[W, G, G, W],
359 minInterpolation: VK_FILTER_NEAREST,
360 magInterpolation: VK_FILTER_NEAREST,
361 ),
362 Image[Gray](
363 width: 3,
364 height: 3,
365 data: @[W, G, W, G, W, G, W, G, W],
366 minInterpolation: VK_FILTER_NEAREST,
367 magInterpolation: VK_FILTER_NEAREST,
368 ),
369 ],
370 )
284 ) 371 )
285 var otherset1 = asDescriptorSetData( 372 var otherset1 = asDescriptorSetData(
286 OtherSet( 373 OtherSet(
287 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped), 374 objectSettings:
375 asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 0), UniformBufferMapped)
288 ) 376 )
289 ) 377 )
290 var otherset2 = asDescriptorSetData( 378 var otherset2 = asDescriptorSetData(
291 OtherSet( 379 OtherSet(
292 objectSettings: asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped), 380 objectSettings:
381 asGPUValue(ObjectSettings(scale: 1.0, materialIndex: 1), UniformBufferMapped)
293 ) 382 )
294 ) 383 )
295 384
296 assignBuffers(renderdata, quad) 385 assignBuffers(renderdata, quad)
297 assignBuffers(renderdata, constset) 386 assignBuffers(renderdata, constset)
308 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) 397 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1)
309 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) 398 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2)
310 399
311 var start = getMonoTime() 400 var start = getMonoTime()
312 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 401 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
313
314 withNextFrame(framebuffer, commandbuffer): 402 withNextFrame(framebuffer, commandbuffer):
315 bindDescriptorSet(commandbuffer, constset, 0, pipeline) 403 bindDescriptorSet(commandbuffer, constset, 0, pipeline)
316 bindDescriptorSet(commandbuffer, mainset, 1, pipeline) 404 bindDescriptorSet(commandbuffer, mainset, 1, pipeline)
317 405
318 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 406 withRenderPass(
319 407 vulkan.swapchain.renderPass,
408 framebuffer,
409 commandbuffer,
410 vulkan.swapchain.width,
411 vulkan.swapchain.height,
412 vec4(0, 0, 0, 0),
413 ):
320 withPipeline(commandbuffer, pipeline): 414 withPipeline(commandbuffer, pipeline):
321
322 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline) 415 bindDescriptorSet(commandbuffer, otherset1, 2, pipeline)
323 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 416 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
324 417
325 bindDescriptorSet(commandbuffer, otherset2, 2, pipeline) 418 bindDescriptorSet(commandbuffer, otherset2, 2, pipeline)
326 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) 419 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad)
327 420
328 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time 421 mainset.data.renderSettings.data.brigthness =
329 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time 422 ((getMonoTime() - start).inMilliseconds().int / 1000) / time
423 otherset1.data.objectSettings.data.scale =
424 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time
330 updateGPUBuffer(mainset.data.renderSettings) 425 updateGPUBuffer(mainset.data.renderSettings)
331 updateGPUBuffer(otherset1.data.objectSettings) 426 updateGPUBuffer(otherset1.data.objectSettings)
332 renderdata.flushAllMemory() 427 renderdata.flushAllMemory()
333 428
334 # cleanup 429 # cleanup
336 destroyPipeline(pipeline) 431 destroyPipeline(pipeline)
337 destroyRenderData(renderdata) 432 destroyRenderData(renderdata)
338 433
339 proc test_05_cube(time: float32) = 434 proc test_05_cube(time: float32) =
340 type 435 type
341
342 UniformData = object 436 UniformData = object
343 mvp: Mat4 437 mvp: Mat4
438
344 Uniforms = object 439 Uniforms = object
345 data: GPUValue[UniformData, UniformBufferMapped] 440 data: GPUValue[UniformData, UniformBufferMapped]
441
346 CubeShader = object 442 CubeShader = object
347 position {.VertexAttribute.}: Vec3f 443 position {.VertexAttribute.}: Vec3f
348 color {.VertexAttribute.}: Vec4f 444 color {.VertexAttribute.}: Vec4f
349 fragmentColor {.Pass.}: Vec4f 445 fragmentColor {.Pass.}: Vec4f
350 outColor {.ShaderOutput.}: Vec4f 446 outColor {.ShaderOutput.}: Vec4f
351 descriptorSets {.DescriptorSet: 0.}: Uniforms 447 descriptorSets {.DescriptorSet: 0.}: Uniforms
352 # code 448 # code
353 vertexCode = """void main() { 449 vertexCode =
450 """void main() {
354 fragmentColor = color; 451 fragmentColor = color;
355 gl_Position = vec4(position, 1) * data.mvp; 452 gl_Position = vec4(position, 1) * data.mvp;
356 }""" 453 }"""
357 fragmentCode = """void main() { 454 fragmentCode =
455 """void main() {
358 outColor = fragmentColor; 456 outColor = fragmentColor;
359 }""" 457 }"""
458
360 Mesh = object 459 Mesh = object
361 position: GPUArray[Vec3f, VertexBuffer] 460 position: GPUArray[Vec3f, VertexBuffer]
362 normals: GPUArray[Vec3f, VertexBuffer] 461 normals: GPUArray[Vec3f, VertexBuffer]
363 color: GPUArray[Vec4f, VertexBuffer] 462 color: GPUArray[Vec4f, VertexBuffer]
364 463
365 let quad = @[ 464 let quad =
366 vec3(-0.5, -0.5), vec3(-0.5, +0.5), vec3(+0.5, +0.5), 465 @[
367 vec3(+0.5, +0.5), vec3(+0.5, -0.5), vec3(-0.5, -0.5), 466 vec3(-0.5, -0.5),
368 ] 467 vec3(-0.5, +0.5),
468 vec3(+0.5, +0.5),
469 vec3(+0.5, +0.5),
470 vec3(+0.5, -0.5),
471 vec3(-0.5, -0.5),
472 ]
369 proc transf(data: seq[Vec3f], mat: Mat4): seq[Vec3f] = 473 proc transf(data: seq[Vec3f], mat: Mat4): seq[Vec3f] =
370 for v in data: 474 for v in data:
371 result.add mat * v 475 result.add mat * v
372 476
373 var 477 var
413 normals: asGPUArray(normals, VertexBuffer), 517 normals: asGPUArray(normals, VertexBuffer),
414 ) 518 )
415 assignBuffers(renderdata, mesh) 519 assignBuffers(renderdata, mesh)
416 520
417 var floor = Mesh( 521 var floor = Mesh(
418 position: asGPUArray(quad.transf(scale(10, 10, 10) * rotate(-PI / 2, X) * translate(0, 0, 0.05)), VertexBuffer), 522 position: asGPUArray(
523 quad.transf(scale(10, 10, 10) * rotate(-PI / 2, X) * translate(0, 0, 0.05)),
524 VertexBuffer,
525 ),
419 color: asGPUArray(newSeqWith(6, vec4(0.1, 0.1, 0.1, 1)), VertexBuffer), 526 color: asGPUArray(newSeqWith(6, vec4(0.1, 0.1, 0.1, 1)), VertexBuffer),
420 normals: asGPUArray(newSeqWith(6, Y), VertexBuffer), 527 normals: asGPUArray(newSeqWith(6, Y), VertexBuffer),
421 ) 528 )
422 assignBuffers(renderdata, floor) 529 assignBuffers(renderdata, floor)
423 530
424 var uniforms1 = asDescriptorSetData( 531 var uniforms1 = asDescriptorSetData(
425 Uniforms( 532 Uniforms(data: asGPUValue(UniformData(mvp: Unit4), UniformBufferMapped))
426 data: asGPUValue(UniformData(mvp: Unit4), UniformBufferMapped)
427 )
428 ) 533 )
429 assignBuffers(renderdata, uniforms1) 534 assignBuffers(renderdata, uniforms1)
430 535
431 renderdata.flushAllMemory() 536 renderdata.flushAllMemory()
432 537
439 var start = getMonoTime() 544 var start = getMonoTime()
440 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 545 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
441 let tStartLoop = getMonoTime() - tStart 546 let tStartLoop = getMonoTime() - tStart
442 547
443 uniforms1.data.data.data.mvp = ( 548 uniforms1.data.data.data.mvp = (
444 projection(-PI / 2, getAspectRatio(), 0.01, 100) * 549 projection(-PI / 2, getAspectRatio(), 0.01, 100) * translate(0, 0, 2) *
445 translate(0, 0, 2) * 550 rotate(PI / 4, X) * rotate(
446 rotate(PI / 4, X) * 551 PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y
447 rotate(PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y) 552 )
448 ) 553 )
449 updateGPUBuffer(uniforms1.data.data, flush = true) 554 updateGPUBuffer(uniforms1.data.data, flush = true)
450 555
451 withNextFrame(framebuffer, commandbuffer): 556 withNextFrame(framebuffer, commandbuffer):
452 557 withRenderPass(
453 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 558 vulkan.swapchain.renderPass,
559 framebuffer,
560 commandbuffer,
561 vulkan.swapchain.width,
562 vulkan.swapchain.height,
563 vec4(0, 0, 0, 0),
564 ):
454 withPipeline(commandbuffer, pipeline): 565 withPipeline(commandbuffer, pipeline):
455
456 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) 566 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline)
457 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) 567 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh)
458 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) 568 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor)
459 569
460 let tEndLoop = getMonoTime() - tStart 570 let tEndLoop = getMonoTime() - tStart
476 position {.VertexAttribute.}: Vec3f 586 position {.VertexAttribute.}: Vec3f
477 color {.VertexAttribute.}: Vec3f 587 color {.VertexAttribute.}: Vec3f
478 fragmentColor {.Pass.}: Vec3f 588 fragmentColor {.Pass.}: Vec3f
479 outColor {.ShaderOutput.}: Vec4f 589 outColor {.ShaderOutput.}: Vec4f
480 # code 590 # code
481 vertexCode: string = """void main() { 591 vertexCode: string =
592 """void main() {
482 gl_PointSize = 100; 593 gl_PointSize = 100;
483 fragmentColor = color; 594 fragmentColor = color;
484 gl_Position = vec4(position, 1);}""" 595 gl_Position = vec4(position, 1);}"""
485 fragmentCode: string = """void main() { 596 fragmentCode: string =
597 """void main() {
486 outColor = vec4(fragmentColor, 1);}""" 598 outColor = vec4(fragmentColor, 1);}"""
599
487 TriangleMesh = object 600 TriangleMesh = object
488 position: GPUArray[Vec3f, VertexBuffer] 601 position: GPUArray[Vec3f, VertexBuffer]
489 color: GPUArray[Vec3f, VertexBuffer] 602 color: GPUArray[Vec3f, VertexBuffer]
603
490 var triangle = TriangleMesh( 604 var triangle = TriangleMesh(
491 position: asGPUArray([vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer), 605 position: asGPUArray(
606 [vec3(-0.5, -0.5, 0), vec3(0, 0.5, 0), vec3(0.5, -0.5, 0)], VertexBuffer
607 ),
492 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), 608 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
493 ) 609 )
494 var lines = TriangleMesh( 610 var lines = TriangleMesh(
495 position: asGPUArray([vec3(-0.9, 0, 0), vec3(-0.05, -0.9, 0), vec3(0.05, -0.9, 0), vec3(0.9, 0, 0)], VertexBuffer), 611 position: asGPUArray(
496 color: asGPUArray([vec3(1, 1, 0), vec3(1, 1, 0), vec3(0, 1, 0), vec3(0, 1, 0)], VertexBuffer), 612 [vec3(-0.9, 0, 0), vec3(-0.05, -0.9, 0), vec3(0.05, -0.9, 0), vec3(0.9, 0, 0)],
613 VertexBuffer,
614 ),
615 color: asGPUArray(
616 [vec3(1, 1, 0), vec3(1, 1, 0), vec3(0, 1, 0), vec3(0, 1, 0)], VertexBuffer
617 ),
497 ) 618 )
498 assignBuffers(renderdata, triangle) 619 assignBuffers(renderdata, triangle)
499 assignBuffers(renderdata, lines) 620 assignBuffers(renderdata, lines)
500 renderdata.flushAllMemory() 621 renderdata.flushAllMemory()
501 622
502 var pipeline1 = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass, polygonMode = VK_POLYGON_MODE_LINE, lineWidth = 20'f32) 623 var pipeline1 = createPipeline[Shader](
503 var pipeline2 = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass, polygonMode = VK_POLYGON_MODE_POINT) 624 renderPass = vulkan.swapchain.renderPass,
504 var pipeline3 = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass, topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST, lineWidth = 5) 625 polygonMode = VK_POLYGON_MODE_LINE,
505 var pipeline4 = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass, topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST) 626 lineWidth = 20'f32,
627 )
628 var pipeline2 = createPipeline[Shader](
629 renderPass = vulkan.swapchain.renderPass, polygonMode = VK_POLYGON_MODE_POINT
630 )
631 var pipeline3 = createPipeline[Shader](
632 renderPass = vulkan.swapchain.renderPass,
633 topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
634 lineWidth = 5,
635 )
636 var pipeline4 = createPipeline[Shader](
637 renderPass = vulkan.swapchain.renderPass,
638 topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
639 )
506 640
507 var start = getMonoTime() 641 var start = getMonoTime()
508 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 642 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
509 withNextFrame(framebuffer, commandbuffer): 643 withNextFrame(framebuffer, commandbuffer):
510 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 644 withRenderPass(
645 vulkan.swapchain.renderPass,
646 framebuffer,
647 commandbuffer,
648 vulkan.swapchain.width,
649 vulkan.swapchain.height,
650 vec4(0, 0, 0, 0),
651 ):
511 withPipeline(commandbuffer, pipeline1): 652 withPipeline(commandbuffer, pipeline1):
512 render(commandbuffer = commandbuffer, pipeline = pipeline1, mesh = triangle) 653 render(commandbuffer = commandbuffer, pipeline = pipeline1, mesh = triangle)
513 withPipeline(commandbuffer, pipeline2): 654 withPipeline(commandbuffer, pipeline2):
514 render(commandbuffer = commandbuffer, pipeline = pipeline2, mesh = triangle) 655 render(commandbuffer = commandbuffer, pipeline = pipeline2, mesh = triangle)
515 withPipeline(commandbuffer, pipeline3): 656 withPipeline(commandbuffer, pipeline3):
529 var renderdata = initRenderData() 670 var renderdata = initRenderData()
530 671
531 type 672 type
532 Uniforms = object 673 Uniforms = object
533 texture1: Image[BGRA] 674 texture1: Image[BGRA]
675
534 Shader = object 676 Shader = object
535 position {.VertexAttribute.}: Vec3f 677 position {.VertexAttribute.}: Vec3f
536 uv {.VertexAttribute.}: Vec2f 678 uv {.VertexAttribute.}: Vec2f
537 fragmentUv {.Pass.}: Vec2f 679 fragmentUv {.Pass.}: Vec2f
538 outColor {.ShaderOutput.}: Vec4f 680 outColor {.ShaderOutput.}: Vec4f
539 descriptorSets {.DescriptorSet: 0.}: Uniforms 681 descriptorSets {.DescriptorSet: 0.}: Uniforms
540 # code 682 # code
541 vertexCode: string = """ 683 vertexCode: string =
684 """
542 void main() { 685 void main() {
543 fragmentUv = uv; 686 fragmentUv = uv;
544 gl_Position = vec4(position, 1); 687 gl_Position = vec4(position, 1);
545 }""" 688 }"""
546 fragmentCode: string = """ 689 fragmentCode: string =
690 """
547 void main() { 691 void main() {
548 outColor = texture(texture1, fragmentUv); 692 outColor = texture(texture1, fragmentUv);
549 }""" 693 }"""
694
550 Quad = object 695 Quad = object
551 position: GPUArray[Vec3f, VertexBuffer] 696 position: GPUArray[Vec3f, VertexBuffer]
552 uv: GPUArray[Vec2f, VertexBuffer] 697 uv: GPUArray[Vec2f, VertexBuffer]
698
553 var mesh = Quad( 699 var mesh = Quad(
554 position: asGPUArray([ 700 position: asGPUArray(
555 vec3(-0.8, -0.5), vec3(-0.8, 0.5), vec3(0.8, 0.5), 701 [
556 vec3(0.8, 0.5), vec3(0.8, -0.5), vec3(-0.8, -0.5), 702 vec3(-0.8, -0.5),
557 ], VertexBuffer), 703 vec3(-0.8, 0.5),
558 uv: asGPUArray([ 704 vec3(0.8, 0.5),
559 vec2(0, 1), vec2(0, 0), vec2(1, 0), 705 vec3(0.8, 0.5),
560 vec2(1, 0), vec2(1, 1), vec2(0, 1), 706 vec3(0.8, -0.5),
561 ], VertexBuffer), 707 vec3(-0.8, -0.5),
708 ],
709 VertexBuffer,
710 ),
711 uv: asGPUArray(
712 [vec2(0, 1), vec2(0, 0), vec2(1, 0), vec2(1, 0), vec2(1, 1), vec2(0, 1)],
713 VertexBuffer,
714 ),
562 ) 715 )
563 assignBuffers(renderdata, mesh) 716 assignBuffers(renderdata, mesh)
564 renderdata.flushAllMemory() 717 renderdata.flushAllMemory()
565 718
566 var pipeline = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass) 719 var pipeline = createPipeline[Shader](renderPass = vulkan.swapchain.renderPass)
567 var uniforms1 = asDescriptorSetData( 720 var uniforms1 = asDescriptorSetData(Uniforms(texture1: loadImage[BGRA]("art.png")))
568 Uniforms(
569 texture1: loadImage[BGRA]("art.png"),
570 )
571 )
572 uploadImages(renderdata, uniforms1) 721 uploadImages(renderdata, uniforms1)
573 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) 722 initDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1)
574 723
575 var start = getMonoTime() 724 var start = getMonoTime()
576 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 725 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
577
578 withNextFrame(framebuffer, commandbuffer): 726 withNextFrame(framebuffer, commandbuffer):
579 727 withRenderPass(
580 withRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 728 vulkan.swapchain.renderPass,
581 729 framebuffer,
730 commandbuffer,
731 vulkan.swapchain.width,
732 vulkan.swapchain.height,
733 vec4(0, 0, 0, 0),
734 ):
582 withPipeline(commandbuffer, pipeline): 735 withPipeline(commandbuffer, pipeline):
583
584 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline) 736 bindDescriptorSet(commandbuffer, uniforms1, 0, pipeline)
585 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) 737 render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh)
586 738
587 # cleanup 739 # cleanup
588 checkVkResult vkDeviceWaitIdle(vulkan.device) 740 checkVkResult vkDeviceWaitIdle(vulkan.device)
589 destroyPipeline(pipeline) 741 destroyPipeline(pipeline)
590 destroyRenderData(renderdata) 742 destroyRenderData(renderdata)
591 743
592 proc test_08_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = 744 proc test_08_triangle_2pass(
593 var (offscreenRP, presentRP) = createIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) 745 time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits
746 ) =
747 var (offscreenRP, presentRP) =
748 createIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
594 749
595 setupSwapchain(renderpass = presentRP) 750 setupSwapchain(renderpass = presentRP)
596 751
597 var renderdata = initRenderData() 752 var renderdata = initRenderData()
598 753
599 type 754 type
600 Uniforms = object 755 Uniforms = object
601 frameTexture: Image[BGRA] 756 frameTexture: Image[BGRA]
757
602 TriangleShader = object 758 TriangleShader = object
603 position {.VertexAttribute.}: Vec3f 759 position {.VertexAttribute.}: Vec3f
604 color {.VertexAttribute.}: Vec3f 760 color {.VertexAttribute.}: Vec3f
605 fragmentColor {.Pass.}: Vec3f 761 fragmentColor {.Pass.}: Vec3f
606 outColor {.ShaderOutput.}: Vec4f 762 outColor {.ShaderOutput.}: Vec4f
607 # code 763 # code
608 vertexCode: string = """void main() { 764 vertexCode: string =
765 """void main() {
609 fragmentColor = color; 766 fragmentColor = color;
610 gl_Position = vec4(position, 1);}""" 767 gl_Position = vec4(position, 1);}"""
611 fragmentCode: string = """void main() { 768 fragmentCode: string =
769 """void main() {
612 outColor = vec4(fragmentColor, 1);}""" 770 outColor = vec4(fragmentColor, 1);}"""
771
613 PresentShader = object 772 PresentShader = object
614 position {.VertexAttribute.}: Vec2f 773 position {.VertexAttribute.}: Vec2f
615 uv {.Pass.}: Vec2f 774 uv {.Pass.}: Vec2f
616 outColor {.ShaderOutput.}: Vec4f 775 outColor {.ShaderOutput.}: Vec4f
617 descriptorSets {.DescriptorSet: 0.}: Uniforms 776 descriptorSets {.DescriptorSet: 0.}: Uniforms
618 # code 777 # code
619 vertexCode: string = """void main() { 778 vertexCode: string =
779 """void main() {
620 uv = ((position + 1) * 0.5) * vec2(1, -1); 780 uv = ((position + 1) * 0.5) * vec2(1, -1);
621 gl_Position = vec4(position, 0, 1);}""" 781 gl_Position = vec4(position, 0, 1);}"""
622 fragmentCode: string = """void main() { 782 fragmentCode: string =
783 """void main() {
623 vec2 uv1 = uv + vec2(0.001, 0.001); 784 vec2 uv1 = uv + vec2(0.001, 0.001);
624 vec2 uv2 = uv + vec2(0.001, -0.001); 785 vec2 uv2 = uv + vec2(0.001, -0.001);
625 vec2 uv3 = uv + vec2(-0.001, 0.001); 786 vec2 uv3 = uv + vec2(-0.001, 0.001);
626 vec2 uv4 = uv + vec2(-0.001, -0.001); 787 vec2 uv4 = uv + vec2(-0.001, -0.001);
627 outColor = ( 788 outColor = (
629 texture(frameTexture, uv2) + 790 texture(frameTexture, uv2) +
630 texture(frameTexture, uv3) + 791 texture(frameTexture, uv3) +
631 texture(frameTexture, uv4) 792 texture(frameTexture, uv4)
632 ) / 4; 793 ) / 4;
633 }""" 794 }"""
795
634 TriangleMesh = object 796 TriangleMesh = object
635 position: GPUArray[Vec3f, VertexBuffer] 797 position: GPUArray[Vec3f, VertexBuffer]
636 color: GPUArray[Vec3f, VertexBuffer] 798 color: GPUArray[Vec3f, VertexBuffer]
799
637 QuadMesh = object 800 QuadMesh = object
638 position: GPUArray[Vec2f, VertexBuffer] 801 position: GPUArray[Vec2f, VertexBuffer]
639 indices: GPUArray[uint16, IndexBuffer] 802 indices: GPUArray[uint16, IndexBuffer]
803
640 var mesh = TriangleMesh( 804 var mesh = TriangleMesh(
641 position: asGPUArray([vec3(-0.5, -0.5), vec3(0, 0.5), vec3(0.5, -0.5)], VertexBuffer), 805 position:
806 asGPUArray([vec3(-0.5, -0.5), vec3(0, 0.5), vec3(0.5, -0.5)], VertexBuffer),
642 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer), 807 color: asGPUArray([vec3(0, 0, 1), vec3(0, 1, 0), vec3(1, 0, 0)], VertexBuffer),
643 ) 808 )
644 var quad = QuadMesh( 809 var quad = QuadMesh(
645 position: asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer), 810 position:
811 asGPUArray([vec2(-1, -1), vec2(-1, 1), vec2(1, 1), vec2(1, -1)], VertexBuffer),
646 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), 812 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer),
647 ) 813 )
648 var uniforms1 = asDescriptorSetData( 814 var uniforms1 = asDescriptorSetData(
649 Uniforms( 815 Uniforms(
650 frameTexture: Image[BGRA](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true), 816 frameTexture: Image[BGRA](
817 width: vulkan.swapchain.width,
818 height: vulkan.swapchain.height,
819 isRenderTarget: true,
820 )
651 ) 821 )
652 ) 822 )
653 assignBuffers(renderdata, mesh) 823 assignBuffers(renderdata, mesh)
654 assignBuffers(renderdata, quad) 824 assignBuffers(renderdata, quad)
655 uploadImages(renderdata, uniforms1) 825 uploadImages(renderdata, uniforms1)
674 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT], 844 usage = [VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT],
675 samples = offscreenRP.samples, 845 samples = offscreenRP.samples,
676 ) 846 )
677 let requirements = svkGetImageMemoryRequirements(depthImage) 847 let requirements = svkGetImageMemoryRequirements(depthImage)
678 depthMemory = svkAllocateMemory( 848 depthMemory = svkAllocateMemory(
679 requirements.size, 849 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)
680 bestMemory(mappable = false, filter = requirements.memoryTypes) 850 )
681 ) 851 checkVkResult vkBindImageMemory(vulkan.device, depthImage, depthMemory, 0)
682 checkVkResult vkBindImageMemory(
683 vulkan.device,
684 depthImage,
685 depthMemory,
686 0,
687 )
688 depthImageView = svkCreate2DImageView( 852 depthImageView = svkCreate2DImageView(
689 image = depthImage, 853 image = depthImage, format = DEPTH_FORMAT, aspect = VK_IMAGE_ASPECT_DEPTH_BIT
690 format = DEPTH_FORMAT,
691 aspect = VK_IMAGE_ASPECT_DEPTH_BIT
692 ) 854 )
693 855
694 # create msaa images (will not use the one in the swapchain 856 # create msaa images (will not use the one in the swapchain
695 var 857 var
696 msaaImage: VkImage 858 msaaImage: VkImage
704 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT], 866 usage = [VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT],
705 samples = offscreenRP.samples, 867 samples = offscreenRP.samples,
706 ) 868 )
707 let requirements = svkGetImageMemoryRequirements(msaaImage) 869 let requirements = svkGetImageMemoryRequirements(msaaImage)
708 msaaMemory = svkAllocateMemory( 870 msaaMemory = svkAllocateMemory(
709 requirements.size, 871 requirements.size, bestMemory(mappable = false, filter = requirements.memoryTypes)
710 bestMemory(mappable = false, filter = requirements.memoryTypes) 872 )
711 ) 873 checkVkResult vkBindImageMemory(vulkan.device, msaaImage, msaaMemory, 0)
712 checkVkResult vkBindImageMemory(
713 vulkan.device,
714 msaaImage,
715 msaaMemory,
716 0,
717 )
718 msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT) 874 msaaImageView = svkCreate2DImageView(image = msaaImage, format = SURFACE_FORMAT)
719 875
720 var attachments: seq[VkImageView] 876 var attachments: seq[VkImageView]
721 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT: 877 if offscreenRP.samples == VK_SAMPLE_COUNT_1_BIT:
722 if offscreenRP.depthBuffer: 878 if offscreenRP.depthBuffer:
723 attachments = @[uniforms1.data.frameTexture.imageview, depthImageView] 879 attachments = @[uniforms1.data.frameTexture.imageview, depthImageView]
724 else: 880 else:
725 attachments = @[uniforms1.data.frameTexture.imageview] 881 attachments = @[uniforms1.data.frameTexture.imageview]
726 else: 882 else:
727 if offscreenRP.depthBuffer: 883 if offscreenRP.depthBuffer:
728 attachments = @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview] 884 attachments =
885 @[msaaImageView, depthImageView, uniforms1.data.frameTexture.imageview]
729 else: 886 else:
730 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview] 887 attachments = @[msaaImageView, uniforms1.data.frameTexture.imageview]
731 var offscreenFB = svkCreateFramebuffer( 888 var offscreenFB = svkCreateFramebuffer(
732 offscreenRP.vk, 889 offscreenRP.vk, vulkan.swapchain.width, vulkan.swapchain.height, attachments
733 vulkan.swapchain.width,
734 vulkan.swapchain.height,
735 attachments
736 ) 890 )
737 891
738 var start = getMonoTime() 892 var start = getMonoTime()
739 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 893 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
740
741 withNextFrame(framebuffer, commandbuffer): 894 withNextFrame(framebuffer, commandbuffer):
742 895 withRenderPass(
743 withRenderPass(offscreenRP, offscreenFB, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 896 offscreenRP,
897 offscreenFB,
898 commandbuffer,
899 vulkan.swapchain.width,
900 vulkan.swapchain.height,
901 vec4(0, 0, 0, 0),
902 ):
744 withPipeline(commandbuffer, drawPipeline): 903 withPipeline(commandbuffer, drawPipeline):
745 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) 904 render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh)
746 905
747 withRenderPass(presentRP, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, vec4(0, 0, 0, 0)): 906 withRenderPass(
748 907 presentRP,
908 framebuffer,
909 commandbuffer,
910 vulkan.swapchain.width,
911 vulkan.swapchain.height,
912 vec4(0, 0, 0, 0),
913 ):
749 withPipeline(commandbuffer, presentPipeline): 914 withPipeline(commandbuffer, presentPipeline):
750
751 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline) 915 bindDescriptorSet(commandbuffer, uniforms1, 0, presentPipeline)
752 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) 916 render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad)
753 917
754 # cleanup 918 # cleanup
755 checkVkResult vkDeviceWaitIdle(vulkan.device) 919 checkVkResult vkDeviceWaitIdle(vulkan.device)
773 var time = 1'f32 937 var time = 1'f32
774 initVulkan() 938 initVulkan()
775 939
776 var mainRenderpass: RenderPass 940 var mainRenderpass: RenderPass
777 var renderPasses = [ 941 var renderPasses = [
778 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT), 942 (depthBuffer: false, samples: VK_SAMPLE_COUNT_1_BIT),
779 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT), 943 (depthBuffer: false, samples: VK_SAMPLE_COUNT_4_BIT),
780 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT), 944 (depthBuffer: true, samples: VK_SAMPLE_COUNT_1_BIT),
781 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT), 945 (depthBuffer: true, samples: VK_SAMPLE_COUNT_4_BIT),
782 ] 946 ]
783
784 947
785 # test normal 948 # test normal
786 for i, (depthBuffer, samples) in renderPasses: 949 for i, (depthBuffer, samples) in renderPasses:
787 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) 950 var renderpass =
951 createDirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples)
788 setupSwapchain(renderpass = renderpass) 952 setupSwapchain(renderpass = renderpass)
789 953
790 # tests a simple triangle with minimalistic shader and vertex format 954 # tests a simple triangle with minimalistic shader and vertex format
791 test_01_triangle(time) 955 test_01_triangle(time)
792 956