Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1242:e8b3dc80e48e
add: PNG loading and tests for it
| author | sam <sam@basx.dev> |
|---|---|
| date | Mon, 22 Jul 2024 15:53:32 +0700 |
| parents | 42eeb59f3a43 |
| children | 01e9f41d35b1 |
comparison
equal
deleted
inserted
replaced
| 1241:a0ed1a918fda | 1242:e8b3dc80e48e |
|---|---|
| 9 | 9 |
| 10 proc test_01_triangle(time: float32) = | 10 proc test_01_triangle(time: float32) = |
| 11 var renderdata = InitRenderData() | 11 var renderdata = InitRenderData() |
| 12 | 12 |
| 13 type | 13 type |
| 14 TrianglShader = object | 14 Shader = object |
| 15 position {.VertexAttribute.}: Vec3f | 15 position {.VertexAttribute.}: Vec3f |
| 16 color {.VertexAttribute.}: Vec3f | 16 color {.VertexAttribute.}: Vec3f |
| 17 fragmentColor {.Pass.}: Vec3f | 17 fragmentColor {.Pass.}: Vec3f |
| 18 outColor {.ShaderOutput.}: Vec4f | 18 outColor {.ShaderOutput.}: Vec4f |
| 19 # code | 19 # code |
| 30 color: asGPUArray([NewVec3f(0, 0, 1), NewVec3f(0, 1, 0), NewVec3f(1, 0, 0)], VertexBuffer), | 30 color: asGPUArray([NewVec3f(0, 0, 1), NewVec3f(0, 1, 0), NewVec3f(1, 0, 0)], VertexBuffer), |
| 31 ) | 31 ) |
| 32 AssignBuffers(renderdata, mesh) | 32 AssignBuffers(renderdata, mesh) |
| 33 renderdata.FlushAllMemory() | 33 renderdata.FlushAllMemory() |
| 34 | 34 |
| 35 var | 35 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass) |
| 36 pipeline = CreatePipeline[TrianglShader](renderPass = vulkan.swapchain.renderPass) | |
| 37 | 36 |
| 38 var start = getMonoTime() | 37 var start = getMonoTime() |
| 39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 38 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 39 | |
| 40 WithNextFrame(framebuffer, commandbuffer): | 40 WithNextFrame(framebuffer, commandbuffer): |
| 41 | |
| 41 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 42 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 43 | |
| 42 WithPipeline(commandbuffer, pipeline): | 44 WithPipeline(commandbuffer, pipeline): |
| 45 | |
| 43 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 46 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
| 44 | 47 |
| 45 # cleanup | 48 # cleanup |
| 46 checkVkResult vkDeviceWaitIdle(vulkan.device) | 49 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 47 DestroyPipeline(pipeline) | 50 DestroyPipeline(pipeline) |
| 102 | 105 |
| 103 var pipeline = CreatePipeline[SomeShader](renderPass = vulkan.swapchain.renderPass) | 106 var pipeline = CreatePipeline[SomeShader](renderPass = vulkan.swapchain.renderPass) |
| 104 | 107 |
| 105 var start = getMonoTime() | 108 var start = getMonoTime() |
| 106 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 109 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 110 | |
| 107 WithNextFrame(framebuffer, commandbuffer): | 111 WithNextFrame(framebuffer, commandbuffer): |
| 112 | |
| 108 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 113 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 114 | |
| 109 WithPipeline(commandbuffer, pipeline): | 115 WithPipeline(commandbuffer, pipeline): |
| 116 | |
| 110 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) | 117 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesA) |
| 111 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) | 118 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad, instances = instancesB) |
| 112 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) | 119 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesA) |
| 113 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) | 120 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = tri, instances = instancesB) |
| 114 | 121 |
| 124 Material = object | 131 Material = object |
| 125 baseColor: Vec3f | 132 baseColor: Vec3f |
| 126 | 133 |
| 127 Uniforms = object | 134 Uniforms = object |
| 128 material: GPUValue[Material, UniformBuffer] | 135 material: GPUValue[Material, UniformBuffer] |
| 129 texture1: Image[TVec4[uint8]] | 136 texture1: Image[RGBA] |
| 130 | 137 |
| 131 QuadShader = object | 138 QuadShader = object |
| 132 position {.VertexAttribute.}: Vec3f | 139 position {.VertexAttribute.}: Vec3f |
| 133 fragmentColor {.Pass.}: Vec3f | 140 fragmentColor {.Pass.}: Vec3f |
| 134 uv {.Pass.}: Vec2f | 141 uv {.Pass.}: Vec2f |
| 145 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" | 152 outColor = vec4(fragmentColor, 1) * texture(texture1, uv);}""" |
| 146 QuadMesh = object | 153 QuadMesh = object |
| 147 position: GPUArray[Vec3f, VertexBuffer] | 154 position: GPUArray[Vec3f, VertexBuffer] |
| 148 indices: GPUArray[uint16, IndexBuffer] | 155 indices: GPUArray[uint16, IndexBuffer] |
| 149 | 156 |
| 150 let R = TVec4[uint8]([255'u8, 0'u8, 0'u8, 255'u8]) | 157 let R = RGBA([255'u8, 0'u8, 0'u8, 255'u8]) |
| 151 let G = TVec4[uint8]([0'u8, 255'u8, 0'u8, 255'u8]) | 158 let G = RGBA([0'u8, 255'u8, 0'u8, 255'u8]) |
| 152 let B = TVec4[uint8]([0'u8, 0'u8, 255'u8, 255'u8]) | 159 let B = RGBA([0'u8, 0'u8, 255'u8, 255'u8]) |
| 153 let W = TVec4[uint8]([255'u8, 255'u8, 255'u8, 255'u8]) | 160 let W = RGBA([255'u8, 255'u8, 255'u8, 255'u8]) |
| 154 var | 161 var |
| 155 quad = QuadMesh( | 162 quad = QuadMesh( |
| 156 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), | 163 position: asGPUArray([NewVec3f(-0.5, -0.5), NewVec3f(-0.5, 0.5), NewVec3f(0.5, 0.5), NewVec3f(0.5, -0.5)], VertexBuffer), |
| 157 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 164 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
| 158 ) | 165 ) |
| 159 uniforms1 = asDescriptorSet( | 166 uniforms1 = asDescriptorSet( |
| 160 Uniforms( | 167 Uniforms( |
| 161 material: asGPUValue(Material(baseColor: NewVec3f(1, 1, 1)), UniformBuffer), | 168 material: asGPUValue(Material(baseColor: NewVec3f(1, 1, 1)), UniformBuffer), |
| 162 texture1: Image[TVec4[uint8]](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], interpolation: VK_FILTER_NEAREST), | 169 texture1: Image[RGBA](width: 3, height: 3, data: @[R, G, B, G, B, R, B, R, G], interpolation: VK_FILTER_NEAREST), |
| 163 ) | 170 ) |
| 164 ) | 171 ) |
| 165 uniforms2 = asDescriptorSet( | 172 uniforms2 = asDescriptorSet( |
| 166 Uniforms( | 173 Uniforms( |
| 167 material: asGPUValue(Material(baseColor: NewVec3f(0.5, 0.5, 0.5)), UniformBuffer), | 174 material: asGPUValue(Material(baseColor: NewVec3f(0.5, 0.5, 0.5)), UniformBuffer), |
| 168 texture1: Image[TVec4[uint8]](width: 2, height: 2, data: @[R, G, B, W]), | 175 texture1: Image[RGBA](width: 2, height: 2, data: @[R, G, B, W]), |
| 169 ) | 176 ) |
| 170 ) | 177 ) |
| 171 | 178 |
| 172 AssignBuffers(renderdata, quad) | 179 AssignBuffers(renderdata, quad) |
| 173 AssignBuffers(renderdata, uniforms1) | 180 AssignBuffers(renderdata, uniforms1) |
| 181 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 188 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 182 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) | 189 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms2) |
| 183 | 190 |
| 184 var start = getMonoTime() | 191 var start = getMonoTime() |
| 185 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 192 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 193 | |
| 186 WithNextFrame(framebuffer, commandbuffer): | 194 WithNextFrame(framebuffer, commandbuffer): |
| 195 | |
| 187 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 196 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 197 | |
| 188 WithPipeline(commandbuffer, pipeline): | 198 WithPipeline(commandbuffer, pipeline): |
| 199 | |
| 189 WithBind(commandbuffer, (uniforms1, ), pipeline): | 200 WithBind(commandbuffer, (uniforms1, ), pipeline): |
| 190 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 201 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 202 | |
| 191 WithBind(commandbuffer, (uniforms2, ), pipeline): | 203 WithBind(commandbuffer, (uniforms2, ), pipeline): |
| 192 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 204 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) |
| 193 | 205 |
| 194 # cleanup | 206 # cleanup |
| 195 checkVkResult vkDeviceWaitIdle(vulkan.device) | 207 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 213 ConstSet = object | 225 ConstSet = object |
| 214 constants: GPUValue[Constants, UniformBuffer] | 226 constants: GPUValue[Constants, UniformBuffer] |
| 215 MainSet = object | 227 MainSet = object |
| 216 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] | 228 renderSettings: GPUValue[RenderSettings, UniformBufferMapped] |
| 217 material: array[2, GPUValue[Material, UniformBuffer]] | 229 material: array[2, GPUValue[Material, UniformBuffer]] |
| 218 texture1: array[2, Image[TVec1[uint8]]] | 230 texture1: array[2, Image[Gray]] |
| 219 OtherSet = object | 231 OtherSet = object |
| 220 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped] | 232 objectSettings: GPUValue[ObjectSettings, UniformBufferMapped] |
| 221 | 233 |
| 222 QuadShader = object | 234 QuadShader = object |
| 223 position {.VertexAttribute.}: Vec3f | 235 position {.VertexAttribute.}: Vec3f |
| 247 var constset = asDescriptorSet( | 259 var constset = asDescriptorSet( |
| 248 ConstSet( | 260 ConstSet( |
| 249 constants: asGPUValue(Constants(offset: NewVec2f(-0.3, 0.2)), UniformBuffer), | 261 constants: asGPUValue(Constants(offset: NewVec2f(-0.3, 0.2)), UniformBuffer), |
| 250 ) | 262 ) |
| 251 ) | 263 ) |
| 252 let G = TVec1[uint8]([50'u8]) | 264 let G = Gray([50'u8]) |
| 253 let W = TVec1[uint8]([255'u8]) | 265 let W = Gray([255'u8]) |
| 254 var mainset = asDescriptorSet( | 266 var mainset = asDescriptorSet( |
| 255 MainSet( | 267 MainSet( |
| 256 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), | 268 renderSettings: asGPUValue(RenderSettings(brigthness: 0), UniformBufferMapped), |
| 257 material: [ | 269 material: [ |
| 258 asGPUValue(Material(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), | 270 asGPUValue(Material(baseColor: NewVec3f(1, 1, 0)), UniformBuffer), |
| 259 asGPUValue(Material(baseColor: NewVec3f(1, 0, 1)), UniformBuffer), | 271 asGPUValue(Material(baseColor: NewVec3f(1, 0, 1)), UniformBuffer), |
| 260 ], | 272 ], |
| 261 texture1: [ | 273 texture1: [ |
| 262 Image[TVec1[uint8]](width: 2, height: 2, data: @[W, G, G, W], interpolation: VK_FILTER_NEAREST), | 274 Image[Gray](width: 2, height: 2, data: @[W, G, G, W], interpolation: VK_FILTER_NEAREST), |
| 263 Image[TVec1[uint8]](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], interpolation: VK_FILTER_NEAREST), | 275 Image[Gray](width: 3, height: 3, data: @[W, G, W, G, W, G, W, G, W], interpolation: VK_FILTER_NEAREST), |
| 264 ], | 276 ], |
| 265 ), | 277 ), |
| 266 ) | 278 ) |
| 267 var otherset1 = asDescriptorSet( | 279 var otherset1 = asDescriptorSet( |
| 268 OtherSet( | 280 OtherSet( |
| 290 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) | 302 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset1) |
| 291 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) | 303 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[2], otherset2) |
| 292 | 304 |
| 293 var start = getMonoTime() | 305 var start = getMonoTime() |
| 294 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 306 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 295 TimeAndLog: | 307 |
| 296 WithNextFrame(framebuffer, commandbuffer): | 308 WithNextFrame(framebuffer, commandbuffer): |
| 297 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 309 |
| 298 WithPipeline(commandbuffer, pipeline): | 310 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 299 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline): | 311 |
| 300 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 312 WithPipeline(commandbuffer, pipeline): |
| 301 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline): | 313 |
| 302 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | 314 WithBind(commandbuffer, (constset, mainset, otherset1), pipeline): |
| 315 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | |
| 316 | |
| 317 WithBind(commandbuffer, (constset, mainset, otherset2), pipeline): | |
| 318 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = quad) | |
| 319 | |
| 303 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time | 320 mainset.data.renderSettings.data.brigthness = ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
| 304 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time | 321 otherset1.data.objectSettings.data.scale = 0.5 + ((getMonoTime() - start).inMilliseconds().int / 1000) / time |
| 305 UpdateGPUBuffer(mainset.data.renderSettings) | 322 UpdateGPUBuffer(mainset.data.renderSettings) |
| 306 UpdateGPUBuffer(otherset1.data.objectSettings) | 323 UpdateGPUBuffer(otherset1.data.objectSettings) |
| 307 renderdata.FlushAllMemory() | 324 renderdata.FlushAllMemory() |
| 420 Translate(0, 0, 2) * | 437 Translate(0, 0, 2) * |
| 421 Rotate(PI / 4, X) * | 438 Rotate(PI / 4, X) * |
| 422 Rotate(PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y) | 439 Rotate(PI * 0.1 * (tStartLoop.inMicroseconds() / 1_000_000), Y) |
| 423 ) | 440 ) |
| 424 UpdateGPUBuffer(uniforms1.data.data, flush = true) | 441 UpdateGPUBuffer(uniforms1.data.data, flush = true) |
| 442 | |
| 425 WithNextFrame(framebuffer, commandbuffer): | 443 WithNextFrame(framebuffer, commandbuffer): |
| 444 | |
| 426 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 445 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 427 WithPipeline(commandbuffer, pipeline): | 446 WithPipeline(commandbuffer, pipeline): |
| 447 | |
| 428 WithBind(commandbuffer, (uniforms1, ), pipeline): | 448 WithBind(commandbuffer, (uniforms1, ), pipeline): |
| 429 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | 449 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) |
| 430 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) | 450 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = floor) |
| 431 | 451 |
| 432 let tEndLoop = getMonoTime() - tStart | 452 let tEndLoop = getMonoTime() - tStart |
| 495 DestroyPipeline(pipeline2) | 515 DestroyPipeline(pipeline2) |
| 496 DestroyPipeline(pipeline3) | 516 DestroyPipeline(pipeline3) |
| 497 DestroyPipeline(pipeline4) | 517 DestroyPipeline(pipeline4) |
| 498 DestroyRenderData(renderdata) | 518 DestroyRenderData(renderdata) |
| 499 | 519 |
| 500 proc test_07_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = | 520 proc test_07_png_texture(time: float32) = |
| 501 var (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | |
| 502 | |
| 503 SetupSwapchain(renderpass = presentRP) | |
| 504 | |
| 505 var renderdata = InitRenderData() | 521 var renderdata = InitRenderData() |
| 506 | 522 |
| 507 type | 523 type |
| 508 Uniforms = object | 524 Uniforms = object |
| 509 frameTexture: Image[TVec4[uint8]] | 525 texture1: Image[RGBA] |
| 526 Shader = object | |
| 527 position {.VertexAttribute.}: Vec3f | |
| 528 uv {.VertexAttribute.}: Vec2f | |
| 529 fragmentUv {.Pass.}: Vec2f | |
| 530 outColor {.ShaderOutput.}: Vec4f | |
| 531 descriptorSets {.DescriptorSets.}: (Uniforms, ) | |
| 532 # code | |
| 533 vertexCode: string = """ | |
| 534 void main() { | |
| 535 fragmentUv = uv; | |
| 536 gl_Position = vec4(position, 1); | |
| 537 }""" | |
| 538 fragmentCode: string = """ | |
| 539 void main() { | |
| 540 outColor = texture(texture1, fragmentUv); | |
| 541 }""" | |
| 542 Quad = object | |
| 543 position: GPUArray[Vec3f, VertexBuffer] | |
| 544 uv: GPUArray[Vec2f, VertexBuffer] | |
| 545 var mesh = Quad( | |
| 546 position: asGPUArray([ | |
| 547 NewVec3f(-0.8, -0.5), NewVec3f(-0.8, 0.5), NewVec3f(0.8, 0.5), | |
| 548 NewVec3f(0.8, 0.5), NewVec3f(0.8, -0.5), NewVec3f(-0.8, -0.5), | |
| 549 ], VertexBuffer), | |
| 550 uv: asGPUArray([ | |
| 551 NewVec2f(0, 1), NewVec2f(0, 0), NewVec2f(1, 0), | |
| 552 NewVec2f(1, 0), NewVec2f(1, 1), NewVec2f(0, 1), | |
| 553 ], VertexBuffer), | |
| 554 ) | |
| 555 AssignBuffers(renderdata, mesh) | |
| 556 renderdata.FlushAllMemory() | |
| 557 | |
| 558 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass) | |
| 559 var uniforms1 = asDescriptorSet( | |
| 560 Uniforms( | |
| 561 texture1: LoadImage[RGBA]("art.png"), | |
| 562 ) | |
| 563 ) | |
| 564 UploadImages(renderdata, uniforms1) | |
| 565 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | |
| 566 | |
| 567 var start = getMonoTime() | |
| 568 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | |
| 569 | |
| 570 WithNextFrame(framebuffer, commandbuffer): | |
| 571 | |
| 572 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | |
| 573 | |
| 574 WithPipeline(commandbuffer, pipeline): | |
| 575 | |
| 576 WithBind(commandbuffer, (uniforms1, ), pipeline): | |
| 577 Render(commandbuffer = commandbuffer, pipeline = pipeline, mesh = mesh) | |
| 578 | |
| 579 # cleanup | |
| 580 checkVkResult vkDeviceWaitIdle(vulkan.device) | |
| 581 DestroyPipeline(pipeline) | |
| 582 DestroyRenderData(renderdata) | |
| 583 | |
| 584 proc test_08_triangle_2pass(time: float32, depthBuffer: bool, samples: VkSampleCountFlagBits) = | |
| 585 var (offscreenRP, presentRP) = CreateIndirectPresentationRenderPass(depthBuffer = depthBuffer, samples = samples) | |
| 586 | |
| 587 SetupSwapchain(renderpass = presentRP) | |
| 588 | |
| 589 var renderdata = InitRenderData() | |
| 590 | |
| 591 type | |
| 592 Uniforms = object | |
| 593 frameTexture: Image[RGBA] | |
| 510 TriangleShader = object | 594 TriangleShader = object |
| 511 position {.VertexAttribute.}: Vec3f | 595 position {.VertexAttribute.}: Vec3f |
| 512 color {.VertexAttribute.}: Vec3f | 596 color {.VertexAttribute.}: Vec3f |
| 513 fragmentColor {.Pass.}: Vec3f | 597 fragmentColor {.Pass.}: Vec3f |
| 514 outColor {.ShaderOutput.}: Vec4f | 598 outColor {.ShaderOutput.}: Vec4f |
| 553 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer), | 637 position: asGPUArray([NewVec2f(-1, -1), NewVec2f(-1, 1), NewVec2f(1, 1), NewVec2f(1, -1)], VertexBuffer), |
| 554 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), | 638 indices: asGPUArray([0'u16, 1'u16, 2'u16, 2'u16, 3'u16, 0'u16], IndexBuffer), |
| 555 ) | 639 ) |
| 556 var uniforms1 = asDescriptorSet( | 640 var uniforms1 = asDescriptorSet( |
| 557 Uniforms( | 641 Uniforms( |
| 558 frameTexture: Image[TVec4[uint8]](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true), | 642 frameTexture: Image[RGBA](width: vulkan.swapchain.width, height: vulkan.swapchain.height, isRenderTarget: true), |
| 559 ) | 643 ) |
| 560 ) | 644 ) |
| 561 AssignBuffers(renderdata, mesh) | 645 AssignBuffers(renderdata, mesh) |
| 562 AssignBuffers(renderdata, quad) | 646 AssignBuffers(renderdata, quad) |
| 563 UploadImages(renderdata, uniforms1) | 647 UploadImages(renderdata, uniforms1) |
| 644 ) | 728 ) |
| 645 | 729 |
| 646 var start = getMonoTime() | 730 var start = getMonoTime() |
| 647 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 731 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
| 648 | 732 |
| 649 TimeAndLog: | 733 WithNextFrame(framebuffer, commandbuffer): |
| 650 WithNextFrame(framebuffer, commandbuffer): | 734 |
| 651 | 735 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 652 WithRenderPass(offscreenRP, offscreenFB, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 736 WithPipeline(commandbuffer, drawPipeline): |
| 653 WithPipeline(commandbuffer, drawPipeline): | 737 Render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) |
| 654 Render(commandbuffer = commandbuffer, pipeline = drawPipeline, mesh = mesh) | 738 |
| 655 | 739 WithRenderPass(presentRP, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 656 WithRenderPass(presentRP, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)): | 740 |
| 657 WithPipeline(commandbuffer, presentPipeline): | 741 WithPipeline(commandbuffer, presentPipeline): |
| 658 WithBind(commandbuffer, (uniforms1, ), presentPipeline): | 742 |
| 659 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) | 743 WithBind(commandbuffer, (uniforms1, ), presentPipeline): |
| 744 Render(commandbuffer = commandbuffer, pipeline = presentPipeline, mesh = quad) | |
| 660 | 745 |
| 661 # cleanup | 746 # cleanup |
| 662 checkVkResult vkDeviceWaitIdle(vulkan.device) | 747 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 663 DestroyPipeline(presentPipeline) | 748 DestroyPipeline(presentPipeline) |
| 664 DestroyPipeline(drawPipeline) | 749 DestroyPipeline(drawPipeline) |
| 710 test_05_cube(time) | 795 test_05_cube(time) |
| 711 | 796 |
| 712 # different draw modes (lines, points, and topologies) | 797 # different draw modes (lines, points, and topologies) |
| 713 test_06_different_draw_modes(time) | 798 test_06_different_draw_modes(time) |
| 714 | 799 |
| 800 # load PNG texture | |
| 801 test_07_png_texture(time) | |
| 802 | |
| 715 checkVkResult vkDeviceWaitIdle(vulkan.device) | 803 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 716 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | 804 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) |
| 717 ClearSwapchain() | 805 ClearSwapchain() |
| 718 | 806 |
| 719 # test multiple render passes | 807 # test multiple render passes |
| 720 for i, (depthBuffer, samples) in renderPasses: | 808 for i, (depthBuffer, samples) in renderPasses: |
| 721 test_07_triangle_2pass(time, depthBuffer, samples) | 809 test_08_triangle_2pass(time, depthBuffer, samples) |
| 722 | 810 |
| 723 DestroyVulkan() | 811 DestroyVulkan() |
