comparison static_utils.nim @ 1180:d554f8185815 compiletime-tests

add: tons of work on descriptors
author sam <sam@basx.dev>
date Tue, 02 Jul 2024 06:42:42 +0700
parents e1830f9b8af4
children 6b66e6c837bc
comparison
equal deleted inserted replaced
1179:e1830f9b8af4 1180:d554f8185815
16 template VertexAttribute {.pragma.} 16 template VertexAttribute {.pragma.}
17 template InstanceAttribute {.pragma.} 17 template InstanceAttribute {.pragma.}
18 template Pass {.pragma.} 18 template Pass {.pragma.}
19 template PassFlat {.pragma.} 19 template PassFlat {.pragma.}
20 template ShaderOutput {.pragma.} 20 template ShaderOutput {.pragma.}
21 template VertexIndices{.pragma.} 21 template VertexIndices {.pragma.}
22 template DescriptorSet {.pragma.}
22 23
23 const INFLIGHTFRAMES = 2'u32 24 const INFLIGHTFRAMES = 2'u32
24 const ACTIVE_DESCRIPTORSETS = 2 25 const MAX_DESCRIPTORSETS = 2
25 const MEMORY_ALIGNMENT = 65536'u64 # Align buffers inside memory along this alignment 26 const MEMORY_ALIGNMENT = 65536'u64 # Align buffers inside memory along this alignment
26 const BUFFER_ALIGNMENT = 64'u64 # align offsets inside buffers along this alignment 27 const BUFFER_ALIGNMENT = 64'u64 # align offsets inside buffers along this alignment
27 28
28 # some globals that will (likely?) never change during the life time of the engine 29 # some globals that will (likely?) never change during the life time of the engine
29 type 30 type
144 const `fieldname` {.inject.} = theFieldname 145 const `fieldname` {.inject.} = theFieldname
145 let `valuename` {.inject.} = value 146 let `valuename` {.inject.} = value
146 const `isinstancename` {.inject.} = hasCustomPragma(value, InstanceAttribute) 147 const `isinstancename` {.inject.} = hasCustomPragma(value, InstanceAttribute)
147 body 148 body
148 149
150 template ForDescriptorSets(shader: typed, setNumber, descriptorSet, body: untyped): untyped =
151 var n = 0
152 for theFieldname, value in fieldPairs(shader):
153 when value.hasCustomPragma(DescriptorSet):
154 block:
155 let `setNumber` {.inject.} = n
156 let `descriptorSet` {.inject.} = value
157 body
158 n.inc
159
149 template ForDescriptorFields(shader: typed, fieldname, typename, countname, bindingNumber, body: untyped): untyped = 160 template ForDescriptorFields(shader: typed, fieldname, typename, countname, bindingNumber, body: untyped): untyped =
150 var `bindingNumber` {.inject.} = 1'u32 161 var `bindingNumber` {.inject.} = 1'u32
151 for theFieldname, value in fieldPairs(shader): 162 for theFieldname, value in fieldPairs(shader):
152 const `fieldname` {.inject.} = theFieldname
153 when typeof(value) is Texture: 163 when typeof(value) is Texture:
154 block: 164 block:
165 const `fieldname` {.inject.} = theFieldname
155 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 166 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
156 const `countname` {.inject.} = 1'u32 167 const `countname` {.inject.} = 1'u32
157 body 168 body
158 `bindingNumber`.inc 169 `bindingNumber`.inc
159 elif typeof(value) is object: 170 elif typeof(value) is object:
160 block: 171 block:
172 const `fieldname` {.inject.} = theFieldname
161 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER 173 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
162 const `countname` {.inject.} = 1'u32 174 const `countname` {.inject.} = 1'u32
163 body 175 body
164 `bindingNumber`.inc 176 `bindingNumber`.inc
165 elif typeof(value) is array: 177 elif typeof(value) is array:
166 when elementType(value) is Texture: 178 when elementType(value) is Texture:
167 block: 179 block:
180 const `fieldname` {.inject.} = theFieldname
168 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 181 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
169 const `countname` {.inject.} = uint32(typeof(value).len) 182 const `countname` {.inject.} = uint32(typeof(value).len)
170 body 183 body
171 `bindingNumber`.inc 184 `bindingNumber`.inc
172 elif elementType(value) is object: 185 elif elementType(value) is object:
173 block: 186 block:
187 const `fieldname` {.inject.} = theFieldname
174 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER 188 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
175 const `countname` {.inject.} = uint32(typeof(value).len) 189 const `countname` {.inject.} = uint32(typeof(value).len)
176 body 190 body
177 `bindingNumber`.inc 191 `bindingNumber`.inc
178 192
246 GPUData = GPUArray | GPUValue 260 GPUData = GPUArray | GPUValue
247 261
248 Pipeline[TShader] = object 262 Pipeline[TShader] = object
249 pipeline: VkPipeline 263 pipeline: VkPipeline
250 layout: VkPipelineLayout 264 layout: VkPipelineLayout
251 descriptorSetLayouts: array[ACTIVE_DESCRIPTORSETS, VkDescriptorSetLayout] 265 descriptorSetLayouts: array[MAX_DESCRIPTORSETS, VkDescriptorSetLayout]
252 BufferType = enum 266 BufferType = enum
253 VertexBuffer, IndexBuffer, UniformBuffer 267 VertexBuffer, IndexBuffer, UniformBuffer
254 RenderData = object 268 RenderData = object
255 descriptorPool: VkDescriptorPool 269 descriptorPool: VkDescriptorPool
256 # tuple is memory and offset to next free allocation in that memory 270 # tuple is memory and offset to next free allocation in that memory
449 463
450 proc UpdateAllGPUBuffers[T](value: T) = 464 proc UpdateAllGPUBuffers[T](value: T) =
451 for name, fieldvalue in value.fieldPairs(): 465 for name, fieldvalue in value.fieldPairs():
452 when typeof(fieldvalue) is GPUData: 466 when typeof(fieldvalue) is GPUData:
453 UpdateGPUBuffer(fieldvalue) 467 UpdateGPUBuffer(fieldvalue)
468
469 proc AssertCompatible(TShader, TDescriptorSet: typedesc, DescriptorSetIndex: static int) =
470 ForDescriptorSets(default(TShader), setNumber, descriptorSet):
471 if setNumber == DescriptorSetIndex:
472 assert typeof(descriptorSet) is TDescriptorSet
473
474 proc CreateDescriptorSet[T, TShader](
475 renderData: RenderData,
476 pipeline: Pipeline[TShader],
477 value: T,
478 setNumber: static int
479 ): array[INFLIGHTFRAMES.int, VkDescriptorSet] =
480
481 static: AssertCompatible(TShader, T, setNumber)
482
483 var layouts = newSeqWith(result.len, pipeline.descriptorSetLayouts[setNumber])
484 var allocInfo = VkDescriptorSetAllocateInfo(
485 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
486 descriptorPool: renderData.descriptorPool,
487 descriptorSetCount: uint32(layouts.len),
488 pSetLayouts: layouts.ToCPointer,
489 )
490 checkVkResult vkAllocateDescriptorSets(vulkan.device, addr(allocInfo), result.ToCPointer)
454 491
455 converter toVkIndexType(indexType: IndexType): VkIndexType = 492 converter toVkIndexType(indexType: IndexType): VkIndexType =
456 case indexType: 493 case indexType:
457 of None: VK_INDEX_TYPE_NONE_KHR 494 of None: VK_INDEX_TYPE_NONE_KHR
458 of UInt8: VK_INDEX_TYPE_UINT8_EXT 495 of UInt8: VK_INDEX_TYPE_UINT8_EXT
572 var uniforms: seq[string] 609 var uniforms: seq[string]
573 var samplers: seq[string] 610 var samplers: seq[string]
574 var vsInputLocation = 0'u32 611 var vsInputLocation = 0'u32
575 var passLocation = 0 612 var passLocation = 0
576 var fsOutputLocation = 0 613 var fsOutputLocation = 0
577 var descriptorBinding = 0 614
578 615 var descriptorSetCount = 0
579 for fieldname, value in fieldPairs(shader): 616 for fieldname, value in fieldPairs(shader):
580 # vertex shader inputs 617 # vertex shader inputs
581 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute): 618 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute):
582 assert typeof(value) is SupportedGPUType 619 assert typeof(value) is SupportedGPUType
583 vsInput.add "layout(location = " & $vsInputLocation & ") in " & GlslType(value) & " " & fieldname & ";" 620 vsInput.add "layout(location = " & $vsInputLocation & ") in " & GlslType(value) & " " & fieldname & ";"
584 for j in 0 ..< NumberOfVertexInputAttributeDescriptors(value): 621 for j in 0 ..< NumberOfVertexInputAttributeDescriptors(value):
585 vsInputLocation += NLocationSlots(value) 622 vsInputLocation += NLocationSlots(value)
623
586 # intermediate values, passed between shaders 624 # intermediate values, passed between shaders
587 elif hasCustomPragma(value, Pass) or hasCustomPragma(value, PassFlat): 625 elif hasCustomPragma(value, Pass) or hasCustomPragma(value, PassFlat):
588 let flat = if hasCustomPragma(value, PassFlat): "flat " else: "" 626 let flat = if hasCustomPragma(value, PassFlat): "flat " else: ""
589 vsOutput.add "layout(location = " & $passLocation & ") " & flat & "out " & GlslType(value) & " " & fieldname & ";" 627 vsOutput.add "layout(location = " & $passLocation & ") " & flat & "out " & GlslType(value) & " " & fieldname & ";"
590 fsInput.add "layout(location = " & $passLocation & ") " & flat & "in " & GlslType(value) & " " & fieldname & ";" 628 fsInput.add "layout(location = " & $passLocation & ") " & flat & "in " & GlslType(value) & " " & fieldname & ";"
591 passLocation.inc 629 passLocation.inc
630
631 # fragment shader output
592 elif hasCustomPragma(value, ShaderOutput): 632 elif hasCustomPragma(value, ShaderOutput):
593 fsOutput.add &"layout(location = " & $fsOutputLocation & ") out " & GlslType(value) & " " & fieldname & ";" 633 fsOutput.add &"layout(location = " & $fsOutputLocation & ") out " & GlslType(value) & " " & fieldname & ";"
594 fsOutputLocation.inc 634 fsOutputLocation.inc
595 elif typeof(value) is Texture: 635
596 samplers.add "layout(binding = " & $descriptorBinding & ") uniform " & GlslType(value) & " " & fieldname & ";" 636 # descriptor sets
597 descriptorBinding.inc 637 # need to consider 4 cases: uniform block, texture, uniform block array, texture array
598 elif typeof(value) is object: 638 elif hasCustomPragma(value, DescriptorSet):
599 # TODO 639 assert descriptorSetCount < MAX_DESCRIPTORSETS, &"{tt.name(TShader)}: maximum {MAX_DESCRIPTORSETS} allowed"
600 uniforms.add "" 640
601 descriptorBinding.inc 641 var descriptorBinding = 0
602 elif typeof(value) is array: 642 for descriptorName, descriptorValue in fieldPairs(value):
603 when elementType(value) is Texture: 643
604 let arrayDecl = "[" & $typeof(value).len & "]" 644 when typeof(descriptorValue) is Texture:
605 samplers.add "layout(binding = " & $descriptorBinding & ") uniform " & GlslType(default(elementType(value))) & " " & fieldname & "" & arrayDecl & ";" 645 samplers.add "layout(set=" & $descriptorSetCount & ", binding = " & $descriptorBinding & ") uniform " & GlslType(descriptorValue) & " " & descriptorName & ";"
606 descriptorBinding.inc 646 descriptorBinding.inc
607 elif elementType(value) is object: 647
608 # TODO 648 elif typeof(descriptorValue) is GPUValue:
609 let arrayDecl = "[" & $typeof(value).len & "]" 649 uniforms.add "layout(set=" & $descriptorSetCount & ", binding = " & $descriptorBinding & ") uniform T" & descriptorName & " {"
610 # uniforms.add "layout(binding = " & $descriptorBinding & ") uniform " & GlslType(elementType(value)) & " " & fieldname & "" & arrayDecl & ";" 650 when typeof(descriptorValue.data) is object:
611 descriptorBinding.inc 651 for blockFieldName, blockFieldValue in descriptorValue.data.fieldPairs():
612 else: 652 assert typeof(blockFieldValue) is SupportedGPUType, "uniform block field '" & blockFieldName & "' is not a SupportedGPUType"
613 {.error: "Unsupported shader field " & fieldname.} 653 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
654 uniforms.add "} " & descriptorName & ";"
655 elif typeof(descriptorValue.data) is array:
656 for blockFieldName, blockFieldValue in default(elementType(descriptorValue.data)).fieldPairs():
657 assert typeof(blockFieldValue) is SupportedGPUType, "uniform block field '" & blockFieldName & "' is not a SupportedGPUType"
658 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
659 uniforms.add "} " & descriptorName & "[" & $descriptorValue.data.len & "];"
660 descriptorBinding.inc
661 elif typeof(descriptorValue) is array:
662 when elementType(descriptorValue) is Texture:
663 let arrayDecl = "[" & $typeof(descriptorValue).len & "]"
664 samplers.add "layout(set=" & $descriptorSetCount & ", binding = " & $descriptorBinding & ") uniform " & GlslType(default(elementType(descriptorValue))) & " " & descriptorName & "" & arrayDecl & ";"
665 descriptorBinding.inc
666 else:
667 {.error: "Unsupported shader descriptor field " & descriptorName.}
668 descriptorSetCount.inc
614 elif fieldname in ["vertexCode", "fragmentCode"]: 669 elif fieldname in ["vertexCode", "fragmentCode"]:
615 discard 670 discard
616 else: 671 else:
617 {.error: "Unsupported shader field '" & tt.name(TShader) & "." & fieldname & "' of type " & tt.name(typeof(value)).} 672 {.error: "Unsupported shader field '" & tt.name(TShader) & "." & fieldname & "' of type " & tt.name(typeof(value)).}
618 673
658 cullMode: VkCullModeFlagBits = VK_CULL_MODE_BACK_BIT, 713 cullMode: VkCullModeFlagBits = VK_CULL_MODE_BACK_BIT,
659 frontFace: VkFrontFace = VK_FRONT_FACE_CLOCKWISE, 714 frontFace: VkFrontFace = VK_FRONT_FACE_CLOCKWISE,
660 descriptorPoolLimit = 1024 715 descriptorPoolLimit = 1024
661 ): Pipeline[TShader] = 716 ): Pipeline[TShader] =
662 # create pipeline 717 # create pipeline
663 var layoutbindings: seq[VkDescriptorSetLayoutBinding] 718
664 ForDescriptorFields(default(TShader), fieldName, descriptorType, descriptorCount, descriptorBindingNumber): 719 ForDescriptorSets(default(TShader), setNumber, descriptorSet):
665 layoutbindings.add VkDescriptorSetLayoutBinding( 720 var layoutbindings: seq[VkDescriptorSetLayoutBinding]
666 binding: descriptorBindingNumber, 721 ForDescriptorFields(descriptorSet, fieldName, descriptorType, descriptorCount, descriptorBindingNumber):
667 descriptorType: descriptorType, 722 layoutbindings.add VkDescriptorSetLayoutBinding(
668 descriptorCount: descriptorCount, 723 binding: descriptorBindingNumber,
669 stageFlags: VkShaderStageFlags(VK_SHADER_STAGE_ALL_GRAPHICS), 724 descriptorType: descriptorType,
670 pImmutableSamplers: nil, 725 descriptorCount: descriptorCount,
671 ) 726 stageFlags: VkShaderStageFlags(VK_SHADER_STAGE_ALL_GRAPHICS),
672 var layoutCreateInfo = VkDescriptorSetLayoutCreateInfo( 727 pImmutableSamplers: nil,
673 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 728 )
674 bindingCount: layoutbindings.len.uint32, 729 var layoutCreateInfo = VkDescriptorSetLayoutCreateInfo(
675 pBindings: layoutbindings.ToCPointer 730 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
676 ) 731 bindingCount: layoutbindings.len.uint32,
677 checkVkResult vkCreateDescriptorSetLayout(vulkan.device, addr(layoutCreateInfo), nil, addr(result.descriptorSetLayouts)) 732 pBindings: layoutbindings.ToCPointer
733 )
734 checkVkResult vkCreateDescriptorSetLayout(
735 vulkan.device,
736 addr(layoutCreateInfo),
737 nil,
738 addr(result.descriptorSetLayouts[setNumber])
739 )
678 let pipelineLayoutInfo = VkPipelineLayoutCreateInfo( 740 let pipelineLayoutInfo = VkPipelineLayoutCreateInfo(
679 sType: VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 741 sType: VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
680 setLayoutCount: result.descriptorSetLayouts.len.uint32, 742 setLayoutCount: result.descriptorSetLayouts.len.uint32,
681 pSetLayouts: descriptorSetLayouts.ToCPointer, 743 pSetLayouts: result.descriptorSetLayouts.ToCPointer,
682 # pushConstantRangeCount: uint32(pushConstants.len), 744 # pushConstantRangeCount: uint32(pushConstants.len),
683 # pPushConstantRanges: pushConstants.ToCPointer, 745 # pPushConstantRanges: pushConstants.ToCPointer,
684 ) 746 )
685 checkVkResult vkCreatePipelineLayout(vulkan.device, addr(pipelineLayoutInfo), nil, addr(result.layout)) 747 checkVkResult vkCreatePipelineLayout(vulkan.device, addr(pipelineLayoutInfo), nil, addr(result.layout))
686 748
1075 let `fieldvalue` {.inject.} = value 1137 let `fieldvalue` {.inject.} = value
1076 body 1138 body
1077 1139
1078 proc WriteDescriptors[TShader, TUniforms, TGlobals](renderData: RenderData, uniforms: TUniforms, globals: TGlobals) = 1140 proc WriteDescriptors[TShader, TUniforms, TGlobals](renderData: RenderData, uniforms: TUniforms, globals: TGlobals) =
1079 var descriptorSetWrites: seq[VkWriteDescriptorSet] 1141 var descriptorSetWrites: seq[VkWriteDescriptorSet]
1080 # map (buffer + offset + range) to descriptor
1081 # map (texture) to descriptor
1082 ForDescriptorFields(default(TShader), fieldName, descriptorType, descriptorCount, descriptorBindingNumber): 1142 ForDescriptorFields(default(TShader), fieldName, descriptorType, descriptorCount, descriptorBindingNumber):
1083 static: echo fieldName, " ", descriptorType, " ", descriptorCount
1084 for frameInFlight in 0 ..< renderData.descriptorSets.len: 1143 for frameInFlight in 0 ..< renderData.descriptorSets.len:
1085 when descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: 1144 when descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
1086 when HasGPUValueField[TUniforms](fieldName): 1145 when HasGPUValueField[TUniforms](fieldName):
1087 WithGPUValueField(uniforms, fieldName, gpuValue): 1146 WithGPUValueField(uniforms, fieldName, gpuValue):
1088 let bufferInfo = VkDescriptorBufferInfo( 1147 let bufferInfo = VkDescriptorBufferInfo(
1154 nil, 1213 nil,
1155 ) 1214 )
1156 ]# 1215 ]#
1157 1216
1158 proc AssertCompatible(TShader, TMesh, TInstance, TUniforms, TGlobals: typedesc) = 1217 proc AssertCompatible(TShader, TMesh, TInstance, TUniforms, TGlobals: typedesc) =
1159 # assert seq-fields of TMesh|TInstance == seq-fields of TShader 1218 # TODO: overhaul this
1160 # assert normal fields of TMesh|Globals == normal fields of TShaderDescriptors
1161 for inputName, inputValue in default(TShader).fieldPairs: 1219 for inputName, inputValue in default(TShader).fieldPairs:
1162 var foundField = false 1220 var foundField = false
1163 1221
1164 # Vertex input data 1222 # Vertex input data
1165 when hasCustomPragma(inputValue, VertexAttribute): 1223 when hasCustomPragma(inputValue, VertexAttribute):
1253 uniforms: TUniforms, 1311 uniforms: TUniforms,
1254 globals: TGlobals, 1312 globals: TGlobals,
1255 mesh: TMesh, 1313 mesh: TMesh,
1256 instances: TInstance, 1314 instances: TInstance,
1257 ) = 1315 ) =
1258 static: AssertCompatible(TShader, TMesh, TInstance, TUniforms, TGlobals) 1316 discard
1317 # static: AssertCompatible(TShader, TMesh, TInstance, TUniforms, TGlobals)
1259 #[ 1318 #[
1260 if renderable.vertexBuffers.len > 0: 1319 if renderable.vertexBuffers.len > 0:
1261 commandBuffer.vkCmdBindVertexBuffers( 1320 commandBuffer.vkCmdBindVertexBuffers(
1262 firstBinding = 0'u32, 1321 firstBinding = 0'u32,
1263 bindingCount = uint32(renderable.vertexBuffers.len), 1322 bindingCount = uint32(renderable.vertexBuffers.len),
1302 objPosition: GPUArray[Vec3f, IndirectGPUMemory] 1361 objPosition: GPUArray[Vec3f, IndirectGPUMemory]
1303 MaterialA = object 1362 MaterialA = object
1304 reflection: float32 1363 reflection: float32
1305 baseColor: Vec3f 1364 baseColor: Vec3f
1306 UniformsA = object 1365 UniformsA = object
1366 defaultTexture: Texture
1367 defaultMaterial: GPUValue[MaterialA, IndirectGPUMemory]
1307 materials: GPUValue[array[3, MaterialA], IndirectGPUMemory] 1368 materials: GPUValue[array[3, MaterialA], IndirectGPUMemory]
1308 materialTextures: array[3, Texture] 1369 materialTextures: array[3, Texture]
1309 ShaderSettings = object 1370 ShaderSettings = object
1310 brightness: float32 1371 gamma: float32
1311 GlobalsA = object 1372 GlobalsA = object
1312 fontAtlas: Texture 1373 fontAtlas: Texture
1313 settings: GPUValue[ShaderSettings, IndirectGPUMemory] 1374 settings: GPUValue[ShaderSettings, IndirectGPUMemory]
1314 1375
1315 ShaderA = object 1376 ShaderA = object
1320 # intermediate 1381 # intermediate
1321 test {.Pass.}: float32 1382 test {.Pass.}: float32
1322 test1 {.PassFlat.}: Vec3f 1383 test1 {.PassFlat.}: Vec3f
1323 # output 1384 # output
1324 color {.ShaderOutput.}: Vec4f 1385 color {.ShaderOutput.}: Vec4f
1325 # uniforms 1386 # descriptor sets
1326 materials: array[3, MaterialA] 1387 globals {.DescriptorSet.}: GlobalsA
1327 settings: ShaderSettings 1388 uniforms {.DescriptorSet.}: UniformsA
1328 # textures
1329 fontAtlas: Texture
1330 materialTextures: array[3, Texture]
1331 # code 1389 # code
1332 vertexCode: string = "void main() {}" 1390 vertexCode: string = "void main() {}"
1333 fragmentCode: string = "void main() {}" 1391 fragmentCode: string = "void main() {}"
1334 1392
1335 let w = CreateWindow("test2") 1393 let w = CreateWindow("test2")
1459 UpdateAllGPUBuffers(instances1) 1517 UpdateAllGPUBuffers(instances1)
1460 UpdateAllGPUBuffers(uniforms1) 1518 UpdateAllGPUBuffers(uniforms1)
1461 UpdateAllGPUBuffers(myGlobals) 1519 UpdateAllGPUBuffers(myGlobals)
1462 renderdata.FlushDirectMemory() 1520 renderdata.FlushDirectMemory()
1463 1521
1522 var s1 = CreateDescriptorSet(renderdata, pipeline1, myGlobals, 0)
1523 var s2 = CreateDescriptorSet(renderdata, pipeline1, uniforms1, 1)
1524
1464 # descriptors 1525 # descriptors
1465 WriteDescriptors[ShaderA, UniformsA, GlobalsA](renderdata, uniforms1, myGlobals) 1526 # WriteDescriptors[ShaderA, UniformsA, GlobalsA](renderdata, uniforms1, myGlobals)
1466 1527
1467 # create descriptor sets 1528 # create descriptor sets
1468 #[ 1529 #[
1469 var descriptorSets: array[INFLIGHTFRAMES.int, VkDescriptorSet] 1530 var descriptorSets: array[INFLIGHTFRAMES.int, VkDescriptorSet]
1470 var layouts = newSeqWith(descriptorSets.len, pipeline.descriptorSetLayouts) 1531 var layouts = newSeqWith(descriptorSets.len, pipeline.descriptorSetLayouts)