annotate semiconginev2/old/renderer.nim @ 1220:59e683c4728f compiletime-tests

del: outdated examples
author sam <sam@basx.dev>
date Wed, 17 Jul 2024 21:04:09 +0700
parents 56781cc0fc7c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
1 import std/options
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
2 import std/tables
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
3 import std/strformat
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
4 import std/sequtils
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
5 import std/strutils
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
6 import std/logging
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
7
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
8 import ./core
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
9 import ./vulkan/commandbuffer
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
10 import ./vulkan/buffer
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
11 import ./vulkan/device
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
12 import ./vulkan/drawable
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
13 import ./vulkan/physicaldevice
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
14 import ./vulkan/pipeline
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
15 import ./vulkan/renderpass
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
16 import ./vulkan/swapchain
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
17 import ./vulkan/shader
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
18 import ./vulkan/descriptor
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
19 import ./vulkan/image
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
20
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
21 import ./scene
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
22 import ./mesh
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
23 import ./material
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
24
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
25 const VERTEX_ATTRIB_ALIGNMENT = 4 # used for buffer alignment
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
26
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
27 type
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
28 ShaderData = ref object
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
29 descriptorPool: DescriptorPool
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
30 descriptorSets: seq[DescriptorSet] # len = n swapchain images
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
31 uniformBuffers: seq[Buffer]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
32 textures: Table[string, seq[VulkanTexture]]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
33
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
34 SceneData = ref object
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
35 drawables: seq[tuple[drawable: Drawable, mesh: Mesh]]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
36 vertexBuffers: Table[MemoryPerformanceHint, Buffer]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
37 indexBuffer: Buffer
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
38 attributeLocation: Table[string, MemoryPerformanceHint]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
39 vertexBufferOffsets: Table[(Mesh, string), uint64]
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
40 materials: Table[MaterialType, seq[MaterialData]]
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
41 shaderData: Table[VkPipeline, ShaderData]
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
42 Renderer* = object
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
43 device: Device
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
44 renderPass: RenderPass
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
45 swapchain: Swapchain
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
46 scenedata: Table[Scene, SceneData]
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
47 emptyTexture: VulkanTexture
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
48 queue: Queue
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
49 commandBufferPool: CommandBufferPool
951
c6213a794ab0 fix: bad syncing mechanism, much better now (I think)
sam <sam@basx.dev>
parents: 950
diff changeset
50 nextFrameReady: bool = false
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
51
948
125f808f8fea did: some renaming
sam <sam@basx.dev>
parents: 946
diff changeset
52 proc currentFrameCommandBuffer(renderer: Renderer): VkCommandBuffer =
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
53 renderer.commandBufferPool.buffers[renderer.swapchain.currentInFlight]
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
54
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
55 proc HasScene*(renderer: Renderer, scene: Scene): bool =
1009
8b0a91fa2210 add: better error messages
sam <sam@basx.dev>
parents: 1008
diff changeset
56 scene in renderer.scenedata
8b0a91fa2210 add: better error messages
sam <sam@basx.dev>
parents: 1008
diff changeset
57
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
58 proc InitRenderer*(
949
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
59 device: Device,
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
60 shaders: openArray[(MaterialType, ShaderConfiguration)],
1136
71315636ba82 did: refactor naming in tons of places
sam <sam@basx.dev>
parents: 1026
diff changeset
61 clearColor = NewVec4f(0, 0, 0, 0),
949
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
62 backFaceCulling = true,
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
63 vSync = false,
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
64 inFlightFrames = 2,
1167
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
65 samples = VK_SAMPLE_COUNT_1_BIT,
949
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
66 ): Renderer =
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
67 assert device.vk.Valid
882
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
68
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
69 result.device = device
1167
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
70 result.renderPass = device.CreateRenderPass(
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
71 shaders,
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
72 clearColor = clearColor,
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
73 backFaceCulling = backFaceCulling,
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
74 samples = samples
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
75 )
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
76 let swapchain = device.CreateSwapchain(
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
77 result.renderPass.vk,
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
78 device.physicalDevice.GetSurfaceFormats().FilterSurfaceFormat(),
949
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
79 vSync = vSync,
0cf68e7336e8 add: a few more exposed parameters to the render API
sam <sam@basx.dev>
parents: 948
diff changeset
80 inFlightFrames = inFlightFrames,
1167
cdf7ec8d04d2 add: MSAA, yipieee
sam <sam@basx.dev>
parents: 1158
diff changeset
81 samples = samples,
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
82 )
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
83 if not swapchain.isSome:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
84 raise newException(Exception, "Unable to create swapchain")
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
85
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
86 result.queue = device.FirstGraphicsQueue().get()
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
87 result.commandBufferPool = device.CreateCommandBufferPool(result.queue.family, swapchain.get().inFlightFrames)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
88 result.swapchain = swapchain.get()
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
89 result.emptyTexture = device.UploadTexture(result.queue, EMPTY_TEXTURE)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
90
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
91 func shadersForScene(renderer: Renderer, scene: Scene): seq[(MaterialType, ShaderPipeline)] =
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
92 for (materialType, shaderPipeline) in renderer.renderPass.shaderPipelines:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
93 if scene.UsesMaterial(materialType):
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
94 result.add (materialType, shaderPipeline)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
95
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
96 func vertexInputsForScene(renderer: Renderer, scene: Scene): seq[ShaderAttribute] =
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
97 var found: Table[string, ShaderAttribute]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
98 for (materialType, shaderPipeline) in renderer.shadersForScene(scene):
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
99 for input in shaderPipeline.Inputs:
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
100 if found.contains(input.name):
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
101 assert input.name == found[input.name].name, &"{input.name}: {input.name} != {found[input.name].name}"
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
102 assert input.theType == found[input.name].theType, &"{input.name}: {input.theType} != {found[input.name].theType}"
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
103 assert input.arrayCount == found[input.name].arrayCount, &"{input.name}: {input.arrayCount} != {found[input.name].arrayCount}"
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
104 assert input.memoryPerformanceHint == found[input.name].memoryPerformanceHint, &"{input.name}: {input.memoryPerformanceHint} != {found[input.name].memoryPerformanceHint}"
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
105 else:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
106 result.add input
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
107 found[input.name] = input
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
108
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
109 proc SetupDrawableBuffers*(renderer: var Renderer, scene: var Scene) =
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
110 assert not (scene in renderer.scenedata)
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
111
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
112 var scenedata = SceneData()
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
113
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
114 # find all material data and group it by material type
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
115 for mesh in scene.meshes:
1008
443e8090614c fix: some mesh attributes will be handled automatically, ignore them when doing mesh-material-shader compatability-check
sam <sam@basx.dev>
parents: 961
diff changeset
116 assert mesh.material != nil, "Mesh {mesh} has no material assigned"
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
117 if not scenedata.materials.contains(mesh.material.theType):
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
118 scenedata.materials[mesh.material.theType] = @[]
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
119 if not scenedata.materials[mesh.material.theType].contains(mesh.material):
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
120 scenedata.materials[mesh.material.theType].add mesh.material
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
121
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
122 # automatically populate material and tranform attributes
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
123 for mesh in scene.meshes:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
124 if not (TRANSFORM_ATTRIB in mesh[].Attributes):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
125 mesh[].InitInstanceAttribute(TRANSFORM_ATTRIB, Unit4)
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
126 if not (MATERIALINDEX_ATTRIBUTE in mesh[].Attributes):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
127 mesh[].InitInstanceAttribute(MATERIALINDEX_ATTRIBUTE, uint16(scenedata.materials[mesh.material.theType].find(mesh.material)))
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
128
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
129 # create index buffer if necessary
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
130 var indicesBufferSize = 0'u64
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
131 for mesh in scene.meshes:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
132 if mesh[].indexType != MeshIndexType.None:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
133 let indexAlignment = case mesh[].indexType
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
134 of MeshIndexType.None: 0'u64
1172
sam <sam@basx.dev>
parents: 1171
diff changeset
135 of Tiny: 1'u64
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
136 of Small: 2'u64
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
137 of Big: 4'u64
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
138 # index value alignment required by Vulkan
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
139 if indicesBufferSize mod indexAlignment != 0:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
140 indicesBufferSize += indexAlignment - (indicesBufferSize mod indexAlignment)
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
141 indicesBufferSize += mesh[].IndexSize
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
142 if indicesBufferSize > 0:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
143 scenedata.indexBuffer = renderer.device.CreateBuffer(
882
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
144 size = indicesBufferSize,
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
145 usage = [VK_BUFFER_USAGE_INDEX_BUFFER_BIT],
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
146 requireMappable = false,
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
147 preferVRAM = true,
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
148 )
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
149
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
150 # calculcate offsets for attributes in vertex buffers
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
151 # trying to use one buffer per memory type
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
152 var perLocationSizes: Table[MemoryPerformanceHint, uint64]
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
153 for hint in MemoryPerformanceHint:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
154 perLocationSizes[hint] = 0
899
ad961543994b did: refactor and improve packaging API
Sam <sam@basx.dev>
parents: 897
diff changeset
155
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
156 let sceneVertexInputs = renderer.vertexInputsForScene(scene)
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
157 let sceneShaders = renderer.shadersForScene(scene)
899
ad961543994b did: refactor and improve packaging API
Sam <sam@basx.dev>
parents: 897
diff changeset
158
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
159 for (materialType, shaderPipeline) in sceneShaders:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
160 scenedata.shaderData[shaderPipeline.vk] = ShaderData()
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
161
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
162 for vertexAttribute in sceneVertexInputs:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
163 scenedata.attributeLocation[vertexAttribute.name] = vertexAttribute.memoryPerformanceHint
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
164 # setup one buffer per vertexAttribute-location-type
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
165 for mesh in scene.meshes:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
166 # align size to VERTEX_ATTRIB_ALIGNMENT bytes (the important thing is the correct alignment of the offsets, but
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
167 # we need to expand the buffer size as well, therefore considering alignment already here as well
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
168 if perLocationSizes[vertexAttribute.memoryPerformanceHint] mod VERTEX_ATTRIB_ALIGNMENT != 0:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
169 perLocationSizes[vertexAttribute.memoryPerformanceHint] += VERTEX_ATTRIB_ALIGNMENT - (perLocationSizes[vertexAttribute.memoryPerformanceHint] mod VERTEX_ATTRIB_ALIGNMENT)
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
170 perLocationSizes[vertexAttribute.memoryPerformanceHint] += mesh[].AttributeSize(vertexAttribute.name)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
171
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
172 # create vertex buffers
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
173 for memoryPerformanceHint, bufferSize in perLocationSizes.pairs:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
174 if bufferSize > 0:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
175 scenedata.vertexBuffers[memoryPerformanceHint] = renderer.device.CreateBuffer(
882
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
176 size = bufferSize,
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
177 usage = [VK_BUFFER_USAGE_VERTEX_BUFFER_BIT],
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
178 requireMappable = memoryPerformanceHint == PreferFastWrite,
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
179 preferVRAM = true,
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
180 )
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
181
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
182 # calculate offset of each attribute for all meshes
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
183 var perLocationOffsets: Table[MemoryPerformanceHint, uint64]
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
184 var indexBufferOffset = 0'u64
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
185 for hint in MemoryPerformanceHint:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
186 perLocationOffsets[hint] = 0
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
187
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
188 for mesh in scene.meshes:
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
189 for attribute in sceneVertexInputs:
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
190 scenedata.vertexBufferOffsets[(mesh, attribute.name)] = perLocationOffsets[attribute.memoryPerformanceHint]
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
191 if mesh[].Attributes.contains(attribute.name):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
192 perLocationOffsets[attribute.memoryPerformanceHint] += mesh[].AttributeSize(attribute.name)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
193 if perLocationOffsets[attribute.memoryPerformanceHint] mod VERTEX_ATTRIB_ALIGNMENT != 0:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
194 perLocationOffsets[attribute.memoryPerformanceHint] += VERTEX_ATTRIB_ALIGNMENT - (perLocationOffsets[attribute.memoryPerformanceHint] mod VERTEX_ATTRIB_ALIGNMENT)
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
195
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
196 # fill offsets per shaderPipeline (as sequence corresponds to shader input binding)
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
197 var offsets: Table[VkPipeline, seq[(string, MemoryPerformanceHint, uint64)]]
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
198 for (materialType, shaderPipeline) in sceneShaders:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
199 offsets[shaderPipeline.vk] = newSeq[(string, MemoryPerformanceHint, uint64)]()
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
200 for attribute in shaderPipeline.Inputs:
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
201 offsets[shaderPipeline.vk].add (attribute.name, attribute.memoryPerformanceHint, scenedata.vertexBufferOffsets[(mesh, attribute.name)])
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
202
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
203 # create drawables
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
204 let indexed = mesh.indexType != MeshIndexType.None
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
205 var drawable = Drawable(
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
206 name: mesh.name,
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
207 elementCount: if indexed: mesh[].IndicesCount else: mesh[].vertexCount,
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
208 bufferOffsets: offsets,
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
209 instanceCount: mesh[].InstanceCount,
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
210 indexed: indexed,
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
211 )
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
212 if indexed:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
213 let indexAlignment = case mesh.indexType
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
214 of MeshIndexType.None: 0'u64
1172
sam <sam@basx.dev>
parents: 1171
diff changeset
215 of Tiny: 1'u64
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
216 of Small: 2'u64
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
217 of Big: 4'u64
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
218 # index value alignment required by Vulkan
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
219 if indexBufferOffset mod indexAlignment != 0:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
220 indexBufferOffset += indexAlignment - (indexBufferOffset mod indexAlignment)
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
221 drawable.indexBufferOffset = indexBufferOffset
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
222 drawable.indexType = mesh.indexType
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
223 var (pdata, size) = mesh[].GetRawIndexData()
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
224 scenedata.indexBuffer.SetData(renderer.queue, pdata, size, indexBufferOffset)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
225 indexBufferOffset += size
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
226 scenedata.drawables.add (drawable, mesh)
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
227
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
228 # setup uniforms and textures (anything descriptor)
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
229 var uploadedTextures: Table[Texture, VulkanTexture]
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
230 for (materialType, shaderPipeline) in sceneShaders:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
231 # gather textures
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
232 for textureAttribute in shaderPipeline.Samplers:
1026
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
233 scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name] = newSeq[VulkanTexture]()
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
234 if scene.shaderGlobals.contains(textureAttribute.name):
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
235 for textureValue in scene.shaderGlobals[textureAttribute.name][Texture][]:
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
236 if not uploadedTextures.contains(textureValue):
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
237 uploadedTextures[textureValue] = renderer.device.UploadTexture(renderer.queue, textureValue)
1026
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
238 scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].add uploadedTextures[textureValue]
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
239 else:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
240 var foundTexture = false
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
241 for material in scene.GetMaterials(materialType):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
242 if material.HasMatchingAttribute(textureAttribute):
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
243 foundTexture = true
1026
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
244 let value = material[textureAttribute.name, Texture][]
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
245 assert value.len == 1, &"Mesh material attribute '{textureAttribute.name}' has texture-array, but only single textures are allowed"
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
246 if not uploadedTextures.contains(value[0]):
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
247 uploadedTextures[value[0]] = renderer.device.UploadTexture(renderer.queue, value[0])
1026
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
248 scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].add uploadedTextures[value[0]]
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
249 assert foundTexture, &"No texture found in shaderGlobals or materials for '{textureAttribute.name}'"
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
250 let nTextures = scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].len.uint32
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
251 assert (textureAttribute.arrayCount == 0 and nTextures == 1) or textureAttribute.arrayCount >= nTextures, &"Shader assigned to render '{materialType}' expected {textureAttribute.arrayCount} textures for '{textureAttribute.name}' but got {nTextures}"
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
252 if textureAttribute.arrayCount < nTextures:
f7802c5069ce did: some trivial renaming
sam <sam@basx.dev>
parents: 1024
diff changeset
253 warn &"Shader assigned to render '{materialType}' expected {textureAttribute.arrayCount} textures for '{textureAttribute.name}' but got {nTextures}"
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
254
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
255 # gather uniform sizes
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
256 var uniformBufferSize = 0'u64
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
257 for uniform in shaderPipeline.Uniforms:
1137
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
258 uniformBufferSize += uniform.Size
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
259 if uniformBufferSize > 0:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
260 for frame_i in 0 ..< renderer.swapchain.inFlightFrames:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
261 scenedata.shaderData[shaderPipeline.vk].uniformBuffers.add renderer.device.CreateBuffer(
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
262 size = uniformBufferSize,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
263 usage = [VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT],
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
264 requireMappable = true,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
265 preferVRAM = true,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
266 )
882
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
267
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
268 # TODO: rework the whole descriptor/pool/layout stuff, a bit unclear
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
269 var poolsizes = @[(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, renderer.swapchain.inFlightFrames.uint32)]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
270 var nTextures = 0'u32
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
271 for descriptor in shaderPipeline.descriptorSetLayout.descriptors:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
272 if descriptor.thetype == ImageSampler:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
273 nTextures += descriptor.count
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
274 if nTextures > 0:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
275 poolsizes.add (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, nTextures * renderer.swapchain.inFlightFrames.uint32)
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
276 scenedata.shaderData[shaderPipeline.vk].descriptorPool = renderer.device.CreateDescriptorSetPool(poolsizes)
882
5392cbd9db41 fix: material handlinge, did: formatting, add: support for multi-material texts
Sam <sam@basx.dev>
parents: 876
diff changeset
277
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
278 scenedata.shaderData[shaderPipeline.vk].descriptorSets = shaderPipeline.SetupDescriptors(
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
279 scenedata.shaderData[shaderPipeline.vk].descriptorPool,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
280 scenedata.shaderData[shaderPipeline.vk].uniformBuffers,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
281 scenedata.shaderData[shaderPipeline.vk].textures,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
282 inFlightFrames = renderer.swapchain.inFlightFrames,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
283 emptyTexture = renderer.emptyTexture,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
284 )
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
285 for frame_i in 0 ..< renderer.swapchain.inFlightFrames:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
286 scenedata.shaderData[shaderPipeline.vk].descriptorSets[frame_i].WriteDescriptorSet()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
287
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
288 renderer.scenedata[scene] = scenedata
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
289
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
290 proc UpdateMeshData*(renderer: var Renderer, scene: var Scene, forceAll = false) =
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
291 assert scene in renderer.scenedata
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
292
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
293 var addedBarrier = false;
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
294 for (drawable, mesh) in renderer.scenedata[scene].drawables.mitems:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
295 if mesh[].Attributes.contains(TRANSFORM_ATTRIB):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
296 mesh[].UpdateInstanceTransforms(TRANSFORM_ATTRIB)
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
297 let attrs = (if forceAll: mesh[].Attributes else: mesh[].DirtyAttributes)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
298 for attribute in attrs:
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
299 # ignore attributes that are not used in this scene
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
300 if attribute in renderer.scenedata[scene].attributeLocation:
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
301 debug &"Update mesh attribute {attribute}"
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
302 let memoryPerformanceHint = renderer.scenedata[scene].attributeLocation[attribute]
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
303 # if we have to do a vkCmdCopyBuffer (not buffer.canMap), then we want to added a barrier to
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
304 # not infer with the current frame that is being renderer (relevant when we have multiple frames in flight)
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
305 # (remark: ...I think..., I am pretty new to this sync stuff)
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
306 if not renderer.scenedata[scene].vertexBuffers[memoryPerformanceHint].CanMap and not addedBarrier:
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
307 WithSingleUseCommandBuffer(renderer.device, renderer.queue, commandBuffer):
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
308 let barrier = VkMemoryBarrier(
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
309 sType: VK_STRUCTURE_TYPE_MEMORY_BARRIER,
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
310 srcAccessMask: [VK_ACCESS_MEMORY_READ_BIT].toBits,
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
311 dstAccessMask: [VK_ACCESS_MEMORY_WRITE_BIT].toBits,
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
312 )
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
313 commandBuffer.PipelineBarrier(
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
314 srcStages = [VK_PIPELINE_STAGE_VERTEX_INPUT_BIT],
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
315 dstStages = [VK_PIPELINE_STAGE_TRANSFER_BIT],
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
316 memoryBarriers = [barrier]
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
317 )
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
318 addedBarrier = true
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
319 renderer.scenedata[scene].vertexBuffers[memoryPerformanceHint].SetData(
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
320 renderer.queue,
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
321 mesh[].GetPointer(attribute),
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
322 mesh[].AttributeSize(attribute),
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
323 renderer.scenedata[scene].vertexBufferOffsets[(mesh, attribute)]
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
324 )
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
325 mesh[].ClearDirtyAttributes()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
326
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
327 proc UpdateUniformData*(renderer: var Renderer, scene: var Scene, forceAll = false) =
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
328 assert scene in renderer.scenedata
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
329
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
330 let dirty = scene.DirtyShaderGlobals
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
331
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
332 if forceAll:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
333 debug "Update uniforms because 'forceAll' was given"
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
334 elif dirty.len > 0:
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
335 debug &"Update uniforms because of dirty scene globals: {dirty}"
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
336
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
337 # loop over all used shaders/pipelines
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
338 for (materialType, shaderPipeline) in renderer.shadersForScene(scene):
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
339 if renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers.len > 0:
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
340 var dirtyMaterialAttribs: seq[string]
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
341 for material in renderer.scenedata[scene].materials[materialType].mitems:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
342 dirtyMaterialAttribs.add material.DirtyAttributes
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
343 material.ClearDirtyAttributes()
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
344 assert renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers[renderer.swapchain.currentInFlight].vk.Valid
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
345 if forceAll:
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
346 for buffer in renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers:
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
347 assert buffer.vk.Valid
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
348
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
349 var offset = 0'u64
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
350 # loop over all uniforms of the shader-shaderPipeline
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
351 for uniform in shaderPipeline.Uniforms:
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
352 if dirty.contains(uniform.name) or dirtyMaterialAttribs.contains(uniform.name) or forceAll: # only update uniforms if necessary
1137
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
353 var value = InitDataList(uniform.theType)
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
354 if scene.shaderGlobals.hasKey(uniform.name):
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
355 assert scene.shaderGlobals[uniform.name].thetype == uniform.thetype
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
356 value = scene.shaderGlobals[uniform.name]
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
357 else:
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
358 var foundValue = false
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
359 for material in renderer.scenedata[scene].materials[materialType]:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
360 if material.HasMatchingAttribute(uniform):
1137
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
361 value.AppendValues(material[uniform.name])
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
362 foundValue = true
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
363 assert foundValue, &"Uniform '{uniform.name}' not found in scene shaderGlobals or materials"
959
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
364 assert (uniform.arrayCount == 0 and value.len == 1) or value.len.uint <= uniform.arrayCount, &"Uniform '{uniform.name}' found has wrong length (shader declares {uniform.arrayCount} but shaderGlobals and materials provide {value.len})"
c104dbf5bbb8 did: adjust integer sizes to match vulkan API (more) directly
sam <sam@basx.dev>
parents: 956
diff changeset
365 if value.len.uint <= uniform.arrayCount:
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
366 debug &"Uniform '{uniform.name}' found has short length (shader declares {uniform.arrayCount} but shaderGlobals and materials provide {value.len})"
1137
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
367 assert value.Size <= uniform.Size, &"During uniform update: gathered value has size {value.Size} but uniform expects size {uniform.Size}"
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
368 if value.Size < uniform.Size:
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
369 debug &"During uniform update: gathered value has size {value.Size} but uniform expects size {uniform.Size}"
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
370 debug &" update uniform '{uniform.name}' with value: {value}"
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
371 # TODO: technically we would only need to update the uniform buffer of the current
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
372 # frameInFlight (I think), but we don't track for which frame the shaderglobals are no longer dirty
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
373 # therefore we have to update the uniform values in all buffers, of all inFlightframes (usually 2)
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
374 for buffer in renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
375 buffer.SetData(renderer.queue, value.GetPointer(), value.Size, offset)
1137
a4aa9f374d44 did: more renaming
sam <sam@basx.dev>
parents: 1136
diff changeset
376 offset += uniform.Size
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
377 scene.ClearDirtyShaderGlobals()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
378
1157
dd757eb5ca86 fix: minimizing window on windows breaks everything, also: do not try to acquire next frame for inifinity
sam@sambook-windows.localdomain
parents: 1139
diff changeset
379 proc StartNewFrame*(renderer: var Renderer): bool =
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
380 # first, we need to await the next free frame from the swapchain
1157
dd757eb5ca86 fix: minimizing window on windows breaks everything, also: do not try to acquire next frame for inifinity
sam@sambook-windows.localdomain
parents: 1139
diff changeset
381 if not renderer.swapchain.AcquireNextFrame():
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
382 # so, there was a problem while acquiring the frame
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
383 # lets first take a break (not sure if this helps anything)
953
a540a64b6990 fix: swapchain recreating had a bug
sam <sam@basx.dev>
parents: 951
diff changeset
384 checkVkResult renderer.device.vk.vkDeviceWaitIdle()
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
385 # now, first thing is, we recreate the swapchain, because a invalid swapchain
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
386 # is a common reason for the inability to acquire the next frame
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
387 let res = renderer.swapchain.Recreate()
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
388 if res.isSome:
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
389 # okay, swapchain recreation worked
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
390 # Now we can swap old and new swapchain
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
391 # the vkDeviceWaitIdle makes the resizing of windows not super smooth,
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
392 # but things seem to be more stable this way
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
393 var oldSwapchain = renderer.swapchain
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
394 renderer.swapchain = res.get()
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
395 checkVkResult renderer.device.vk.vkDeviceWaitIdle()
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
396 oldSwapchain.Destroy()
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
397 # NOW, we still have to acquire that next frame with the NEW swapchain
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
398 # if that fails, I don't know what to smart to do...
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
399 if not renderer.swapchain.AcquireNextFrame():
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
400 return false
1157
dd757eb5ca86 fix: minimizing window on windows breaks everything, also: do not try to acquire next frame for inifinity
sam@sambook-windows.localdomain
parents: 1139
diff changeset
401 else:
1158
f32359ffd882 fix: now something wrong with swapchain on linux XD
sam <sam@basx.dev>
parents: 1157
diff changeset
402 # dang, swapchain could not be recreated. Some bigger issues is at hand...
1157
dd757eb5ca86 fix: minimizing window on windows breaks everything, also: do not try to acquire next frame for inifinity
sam@sambook-windows.localdomain
parents: 1139
diff changeset
403 return false
951
c6213a794ab0 fix: bad syncing mechanism, much better now (I think)
sam <sam@basx.dev>
parents: 950
diff changeset
404 renderer.nextFrameReady = true
1157
dd757eb5ca86 fix: minimizing window on windows breaks everything, also: do not try to acquire next frame for inifinity
sam@sambook-windows.localdomain
parents: 1139
diff changeset
405 return true
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
406
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
407 proc Render*(renderer: var Renderer, scene: Scene) =
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
408 assert scene in renderer.scenedata
951
c6213a794ab0 fix: bad syncing mechanism, much better now (I think)
sam <sam@basx.dev>
parents: 950
diff changeset
409 assert renderer.nextFrameReady, "startNewFrame() must be called before calling render()"
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
410
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
411 # preparation
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
412 renderer.currentFrameCommandBuffer.BeginRenderCommands(renderer.renderPass, renderer.swapchain.CurrentFramebuffer(), oneTimeSubmit = true)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
413
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
414 # debug output
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
415 debug "Scene buffers:"
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
416 for (location, buffer) in renderer.scenedata[scene].vertexBuffers.pairs:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
417 debug " ", location, ": ", buffer
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
418 debug " Index buffer: ", renderer.scenedata[scene].indexBuffer
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
419
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
420 # draw all meshes
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
421 for (materialType, shaderPipeline) in renderer.renderPass.shaderPipelines:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
422 if scene.UsesMaterial(materialType):
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
423 debug &"Start shaderPipeline for '{materialType}'"
948
125f808f8fea did: some renaming
sam <sam@basx.dev>
parents: 946
diff changeset
424 renderer.currentFrameCommandBuffer.vkCmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, shaderPipeline.vk)
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
425 renderer.currentFrameCommandBuffer.vkCmdBindDescriptorSets(
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
426 VK_PIPELINE_BIND_POINT_GRAPHICS,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
427 shaderPipeline.layout,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
428 0,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
429 1,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
430 addr(renderer.scenedata[scene].shaderData[shaderPipeline.vk].descriptorSets[renderer.swapchain.currentInFlight].vk),
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
431 0,
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
432 nil
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
433 )
943
925197a1ec95 add: some sync (not finished), simplify renderpass af
sam <sam@basx.dev>
parents: 937
diff changeset
434 for (drawable, mesh) in renderer.scenedata[scene].drawables.filterIt(it[1].visible and it[1].material.theType == materialType):
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
435 drawable.Draw(renderer.currentFrameCommandBuffer, vertexBuffers = renderer.scenedata[scene].vertexBuffers, indexBuffer = renderer.scenedata[scene].indexBuffer, shaderPipeline.vk)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
436
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
437 # done rendering
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
438 renderer.currentFrameCommandBuffer.EndRenderCommands()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
439
950
fe48b091e83f did: tons of small improvments, on the way to make GPU sync (more) correct I guess
sam <sam@basx.dev>
parents: 949
diff changeset
440 # swap framebuffer
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
441 if not renderer.swapchain.Swap(renderer.queue, renderer.currentFrameCommandBuffer):
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
442 let res = renderer.swapchain.Recreate()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
443 if res.isSome:
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
444 var oldSwapchain = renderer.swapchain
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
445 renderer.swapchain = res.get()
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
446 checkVkResult renderer.device.vk.vkDeviceWaitIdle()
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
447 oldSwapchain.Destroy()
956
cca6f1a675db fix: again, I think, I have now a correct syncing of vertex buffers updates and drawing of multiple frames in flight XD
sam <sam@basx.dev>
parents: 953
diff changeset
448 renderer.swapchain.currentInFlight = (renderer.swapchain.currentInFlight + 1) mod renderer.swapchain.inFlightFrames
951
c6213a794ab0 fix: bad syncing mechanism, much better now (I think)
sam <sam@basx.dev>
parents: 950
diff changeset
449 renderer.nextFrameReady = false
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
450
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
451 func Valid*(renderer: Renderer): bool =
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
452 renderer.device.vk.Valid
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
453
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
454 proc Destroy*(renderer: var Renderer, scene: Scene) =
910
c62f7947d371 fix: error in descriptors, wait for gpu before cleaning up
Sam <sam@basx.dev>
parents: 904
diff changeset
455 checkVkResult renderer.device.vk.vkDeviceWaitIdle()
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
456 var scenedata = renderer.scenedata[scene]
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
457
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
458 for buffer in scenedata.vertexBuffers.mvalues:
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
459 assert buffer.vk.Valid
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
460 buffer.Destroy()
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
461
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
462 if scenedata.indexBuffer.vk.Valid:
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
463 assert scenedata.indexBuffer.vk.Valid
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
464 scenedata.indexBuffer.Destroy()
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
465
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
466 var destroyedTextures: seq[VkImage]
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
467
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
468 for (vkPipeline, shaderData) in scenedata.shaderData.mpairs:
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
469
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
470 for buffer in shaderData.uniformBuffers.mitems:
1139
114f395b9144 did: finish refactoring and updated all tests accordingly
sam <sam@basx.dev>
parents: 1138
diff changeset
471 assert buffer.vk.Valid
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
472 buffer.Destroy()
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
473
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
474 for textures in shaderData.textures.mvalues:
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
475 for texture in textures.mitems:
845
19b5051d6eb7 fix: cleanup when multiple textures use same vulkan image
Sam <sam@basx.dev>
parents: 840
diff changeset
476 if not destroyedTextures.contains(texture.image.vk):
19b5051d6eb7 fix: cleanup when multiple textures use same vulkan image
Sam <sam@basx.dev>
parents: 840
diff changeset
477 destroyedTextures.add texture.image.vk
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
478 texture.Destroy()
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
479
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
480 shaderData.descriptorPool.Destroy()
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
481
845
19b5051d6eb7 fix: cleanup when multiple textures use same vulkan image
Sam <sam@basx.dev>
parents: 840
diff changeset
482 renderer.scenedata.del(scene)
840
44ec744fbedc did: package restructuring according to nimble recommendation for libraries
Sam <sam@basx.dev>
parents:
diff changeset
483
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
484 proc Destroy*(renderer: var Renderer) =
845
19b5051d6eb7 fix: cleanup when multiple textures use same vulkan image
Sam <sam@basx.dev>
parents: 840
diff changeset
485 for scene in renderer.scenedata.keys.toSeq:
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
486 renderer.Destroy(scene)
1024
0edb6e38dcd5 did: refactor renderer a bit
sam <sam@basx.dev>
parents: 1009
diff changeset
487 assert renderer.scenedata.len == 0
1138
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
488 renderer.emptyTexture.Destroy()
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
489 renderer.renderPass.Destroy()
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
490 renderer.commandBufferPool.Destroy()
02e1d2658ff5 did: more renaming
sam <sam@basx.dev>
parents: 1137
diff changeset
491 renderer.swapchain.Destroy()