comparison semiconginev2/old/vulkan/drawable.nim @ 1218:56781cc0fc7c compiletime-tests

did: renamge main package
author sam <sam@basx.dev>
date Wed, 17 Jul 2024 21:01:37 +0700
parents semicongine/old/vulkan/drawable.nim@a3eb305bcac2
children
comparison
equal deleted inserted replaced
1217:f819a874058f 1218:56781cc0fc7c
1 import std/tables
2 import std/strformat
3 import std/logging
4
5 import ../core
6 import ./buffer
7
8 type
9 Drawable* = object
10 name*: string
11 elementCount*: int # number of vertices or indices
12 bufferOffsets*: Table[VkPipeline, seq[(string, MemoryPerformanceHint, uint64)]] # list of buffers and list of offset for each attribute in that buffer
13 instanceCount*: int # number of instance
14 case indexed*: bool
15 of true:
16 indexType*: VkIndexType
17 indexBufferOffset*: uint64
18 of false:
19 discard
20
21 func `$`*(drawable: Drawable): string =
22 if drawable.indexed:
23 &"Drawable({drawable.name}, elementCount: {drawable.elementCount}, instanceCount: {drawable.instanceCount}, bufferOffsets: {drawable.bufferOffsets}, indexType: {drawable.indexType}, indexBufferOffset: {drawable.indexBufferOffset})"
24 else:
25 &"Drawable({drawable.name}, elementCount: {drawable.elementCount}, instanceCount: {drawable.instanceCount}, bufferOffsets: {drawable.bufferOffsets})"
26
27 proc Draw*(drawable: Drawable, commandBuffer: VkCommandBuffer, vertexBuffers: Table[MemoryPerformanceHint, Buffer], indexBuffer: Buffer, pipeline: VkPipeline) =
28 debug &"Draw {drawable} with pipeline {pipeline}"
29
30 var buffers: seq[VkBuffer]
31 var offsets: seq[VkDeviceSize]
32
33 for (name, performanceHint, offset) in drawable.bufferOffsets[pipeline]:
34 assert vertexBuffers[performanceHint].vk.Valid
35 buffers.add vertexBuffers[performanceHint].vk
36 offsets.add VkDeviceSize(offset)
37
38 debug "Binding buffers: ", buffers
39 debug "with offsets ", offsets
40 commandBuffer.vkCmdBindVertexBuffers(
41 firstBinding = 0'u32,
42 bindingCount = uint32(buffers.len),
43 pBuffers = buffers.ToCPointer(),
44 pOffsets = offsets.ToCPointer()
45 )
46 if drawable.indexed:
47 assert indexBuffer.vk.Valid
48 commandBuffer.vkCmdBindIndexBuffer(indexBuffer.vk, VkDeviceSize(drawable.indexBufferOffset), drawable.indexType)
49 commandBuffer.vkCmdDrawIndexed(
50 indexCount = uint32(drawable.elementCount),
51 instanceCount = uint32(drawable.instanceCount),
52 firstIndex = 0,
53 vertexOffset = 0,
54 firstInstance = 0
55 )
56 else:
57 commandBuffer.vkCmdDraw(
58 vertexCount = uint32(drawable.elementCount),
59 instanceCount = uint32(drawable.instanceCount),
60 firstVertex = 0,
61 firstInstance = 0
62 )