annotate src/semicongine/vulkan/drawable.nim @ 617:f7e7af33e9ee

did: refactor memory selection
author Sam <sam@basx.dev>
date Sat, 29 Apr 2023 16:50:43 +0700
parents 5eadc1e1d6d8
children 041a114db1dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
588
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
1 import std/tables
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
2 import std/strformat
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
3 import std/logging
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
4
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
5 import ./api
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
6 import ./utils
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
7 import ./buffer
617
f7e7af33e9ee did: refactor memory selection
Sam <sam@basx.dev>
parents: 599
diff changeset
8 import ./memory
588
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
9
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
10 import ../gpu_data
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
11
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
12 type
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
13 Drawable* = object
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
14 elementCount*: uint32 # number of vertices or indices
617
f7e7af33e9ee did: refactor memory selection
Sam <sam@basx.dev>
parents: 599
diff changeset
15 bufferOffsets*: seq[(MemoryPerformanceHint, uint64)] # list of buffers and list of offset for each attribute in that buffer
588
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
16 instanceCount*: uint32 # number of instance
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
17 case indexed*: bool
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
18 of true:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
19 indexType*: VkIndexType
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
20 indexBufferOffset*: uint64
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
21 of false:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
22 discard
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
23
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
24 func `$`*(drawable: Drawable): string =
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
25 if drawable.indexed:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
26 &"Drawable(elementCount: {drawable.elementCount}, instanceCount: {drawable.instanceCount}, bufferOffsets: {drawable.bufferOffsets}, indexType: {drawable.indexType}, indexBufferOffset: {drawable.indexBufferOffset})"
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
27 else:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
28 &"Drawable(elementCount: {drawable.elementCount}, instanceCount: {drawable.instanceCount}, bufferOffsets: {drawable.bufferOffsets})"
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
29
617
f7e7af33e9ee did: refactor memory selection
Sam <sam@basx.dev>
parents: 599
diff changeset
30 proc draw*(commandBuffer: VkCommandBuffer, drawable: Drawable, vertexBuffers: Table[MemoryPerformanceHint, Buffer], indexBuffer: BUffer) =
588
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
31 debug "Draw ", drawable
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
32
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
33 var buffers: seq[VkBuffer]
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
34 var offsets: seq[VkDeviceSize]
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
35
617
f7e7af33e9ee did: refactor memory selection
Sam <sam@basx.dev>
parents: 599
diff changeset
36 for (performanceHint, offset) in drawable.bufferOffsets:
f7e7af33e9ee did: refactor memory selection
Sam <sam@basx.dev>
parents: 599
diff changeset
37 buffers.add vertexBuffers[performanceHint].vk
599
5eadc1e1d6d8 fix: mixing memory location types is not working
Sam <sam@basx.dev>
parents: 588
diff changeset
38 offsets.add VkDeviceSize(offset)
588
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
39
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
40 commandBuffer.vkCmdBindVertexBuffers(
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
41 firstBinding=0'u32,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
42 bindingCount=uint32(buffers.len),
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
43 pBuffers=buffers.toCPointer(),
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
44 pOffsets=offsets.toCPointer()
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
45 )
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
46 if drawable.indexed:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
47 commandBuffer.vkCmdBindIndexBuffer(indexBuffer.vk, VkDeviceSize(drawable.indexBufferOffset), drawable.indexType)
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
48 commandBuffer.vkCmdDrawIndexed(
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
49 indexCount=drawable.elementCount,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
50 instanceCount=drawable.instanceCount,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
51 firstIndex=0,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
52 vertexOffset=0,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
53 firstInstance=0
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
54 )
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
55 else:
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
56 commandBuffer.vkCmdDraw(
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
57 vertexCount=drawable.elementCount,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
58 instanceCount=drawable.instanceCount,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
59 firstVertex=0,
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
60 firstInstance=0
008592db0442 did: big refactoring
Sam <sam@basx.dev>
parents:
diff changeset
61 )