comparison static_utils.nim @ 1164:7b4d4d85d9f5 compiletime-tests

add: descriptor sets allocation
author sam <sam@basx.dev>
date Sat, 22 Jun 2024 02:26:16 +0700
parents 438d32d8b14f
children 58694b30b9cb
comparison
equal deleted inserted replaced
1163:438d32d8b14f 1164:7b4d4d85d9f5
2 import std/enumerate 2 import std/enumerate
3 import std/hashes 3 import std/hashes
4 import std/macros 4 import std/macros
5 import std/strformat 5 import std/strformat
6 import std/strutils 6 import std/strutils
7 import std/sequtils
7 import std/typetraits as tt 8 import std/typetraits as tt
8 9
9 import semicongine/core/utils 10 import semicongine/core/utils
10 import semicongine/core/imagetypes 11 import semicongine/core/imagetypes
11 import semicongine/core/vector 12 import semicongine/core/vector
204 indexCount: uint32 205 indexCount: uint32
205 indexBufferOffset: VkDeviceSize 206 indexBufferOffset: VkDeviceSize
206 Pipeline[TShader] = object 207 Pipeline[TShader] = object
207 pipeline: VkPipeline 208 pipeline: VkPipeline
208 layout: VkPipelineLayout 209 layout: VkPipelineLayout
209 descriptorSets: array[INFLIGHTFRAMES, seq[VkDescriptorSet]] 210 descriptorSets: array[INFLIGHTFRAMES, VkDescriptorSet]
210 211
211 converter toVkIndexType(indexType: IndexType): VkIndexType = 212 converter toVkIndexType(indexType: IndexType): VkIndexType =
212 case indexType: 213 case indexType:
213 of None: VK_INDEX_TYPE_NONE_KHR 214 of None: VK_INDEX_TYPE_NONE_KHR
214 of UInt8: VK_INDEX_TYPE_UINT8_EXT 215 of UInt8: VK_INDEX_TYPE_UINT8_EXT
366 # assumptions/limitations: 367 # assumptions/limitations:
367 # - we are only using vertex and fragment shaders (2 stages) 368 # - we are only using vertex and fragment shaders (2 stages)
368 # - we only support one subpass 369 # - we only support one subpass
369 # = we only support one Uniform-Block 370 # = we only support one Uniform-Block
370 371
372 # create pipeline
371 var layoutbindings: seq[VkDescriptorSetLayoutBinding] 373 var layoutbindings: seq[VkDescriptorSetLayoutBinding]
372 var descriptorBindingNumber = 0'u32 374 var descriptorBindingNumber = 0'u32
373 ForDescriptorFields(default(TShader), descriptorType, descriptorCount): 375 ForDescriptorFields(default(TShader), descriptorType, descriptorCount):
374 layoutbindings.add VkDescriptorSetLayoutBinding( 376 layoutbindings.add VkDescriptorSetLayoutBinding(
375 binding: descriptorBindingNumber, 377 binding: descriptorBindingNumber,
519 addr(createInfo), 521 addr(createInfo),
520 nil, 522 nil,
521 addr(result.pipeline) 523 addr(result.pipeline)
522 ) 524 )
523 525
526 # create descriptors, one per frame-in-flight
527 let nSamplers = 0'u32
528 let nUniformBuffers = 0'u32
529
530 if nSamplers + nUniformBuffers > 0:
531 var poolSizes: seq[VkDescriptorPoolSize]
532 if nUniformBuffers > 0:
533 poolSizes.add VkDescriptorPoolSize(thetype: VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, descriptorCount: nSamplers * INFLIGHTFRAMES.uint32)
534 if nSamplers > 0:
535 poolSizes.add VkDescriptorPoolSize(thetype: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, descriptorCount: nUniformBuffers * INFLIGHTFRAMES.uint32)
536 var poolInfo = VkDescriptorPoolCreateInfo(
537 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
538 poolSizeCount: uint32(poolSizes.len),
539 pPoolSizes: poolSizes.ToCPointer,
540 maxSets: (nUniformBuffers + nSamplers) * INFLIGHTFRAMES.uint32 * 2, # good formula? no idea...
541 )
542 var pool: VkDescriptorPool
543 checkVkResult vkCreateDescriptorPool(device, addr(poolInfo), nil, addr(pool))
544
545 var layouts = newSeqWith(result.descriptorSets.len, descriptorSetLayout)
546 var allocInfo = VkDescriptorSetAllocateInfo(
547 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
548 descriptorPool: pool,
549 descriptorSetCount: uint32(layouts.len),
550 pSetLayouts: layouts.ToCPointer,
551 )
552 checkVkResult vkAllocateDescriptorSets(device, addr(allocInfo), result.descriptorSets.ToCPointer)
553
524 proc CreateRenderable[TMesh, TInstance]( 554 proc CreateRenderable[TMesh, TInstance](
525 mesh: TMesh, 555 mesh: TMesh,
526 instance: TInstance, 556 instance: TInstance,
527 buffers: RenderBuffers, 557 buffers: RenderBuffers,
528 ): Renderable[TMesh, TInstance] = 558 ): Renderable[TMesh, TInstance] =
529 result.indexType = None 559 result.indexType = None
530 560
531 proc Bind(pipeline: Pipeline, commandBuffer: VkCommandBuffer, currentFrameInFlight: int) = 561 proc Bind(pipeline: Pipeline, commandBuffer: VkCommandBuffer, currentFrameInFlight: int) =
532 commandBuffer.vkCmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline) 562 commandBuffer.vkCmdBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline)
533 commandBuffer.vkCmdBindDescriptorSets( 563 if pipeline.descriptorSets[currentFrameInFlight] != VkDescriptorSet(0):
534 VK_PIPELINE_BIND_POINT_GRAPHICS, 564 commandBuffer.vkCmdBindDescriptorSets(
535 pipeline.layout, 565 VK_PIPELINE_BIND_POINT_GRAPHICS,
536 0, 566 pipeline.layout,
537 pipeline.descriptorSets[currentFrameInFlight].len.uint32, 567 0,
538 pipeline.descriptorSets[currentFrameInFlight].ToCPointer, 568 1,
539 0, 569 addr pipeline.descriptorSets[currentFrameInFlight],
540 nil, 570 0,
541 ) 571 nil,
572 )
542 573
543 proc AssertCompatible(TShader, TMesh, TInstance, TGlobals: typedesc) = 574 proc AssertCompatible(TShader, TMesh, TInstance, TGlobals: typedesc) =
544 # assert seq-fields of TMesh|TInstance == seq-fields of TShader 575 # assert seq-fields of TMesh|TInstance == seq-fields of TShader
545 # assert normal fields of TMesh|Globals == normal fields of TShaderDescriptors 576 # assert normal fields of TMesh|Globals == normal fields of TShaderDescriptors
546 for inputName, inputValue in default(TShader).fieldPairs: 577 for inputName, inputValue in default(TShader).fieldPairs:
592 pipeline: Pipeline[TShader], 623 pipeline: Pipeline[TShader],
593 renderable: Renderable[TMesh, TInstance], 624 renderable: Renderable[TMesh, TInstance],
594 globals: TGlobals, 625 globals: TGlobals,
595 commandBuffer: VkCommandBuffer, 626 commandBuffer: VkCommandBuffer,
596 ) = 627 ) =
597 static: 628 static: AssertCompatible(TShader, TMesh, TInstance, TGlobals)
598 AssertCompatible(TShader, TMesh, TInstance, TGlobals) 629 if renderable.vertexBuffers.len > 0:
599 commandBuffer.vkCmdBindVertexBuffers( 630 commandBuffer.vkCmdBindVertexBuffers(
600 firstBinding = 0'u32, 631 firstBinding = 0'u32,
601 bindingCount = uint32(renderable.vertexBuffers.len), 632 bindingCount = uint32(renderable.vertexBuffers.len),
602 pBuffers = renderable.vertexBuffers.ToCPointer(), 633 pBuffers = renderable.vertexBuffers.ToCPointer(),
603 pOffsets = renderable.bufferOffsets.ToCPointer() 634 pOffsets = renderable.bufferOffsets.ToCPointer()
604 ) 635 )
605 if renderable.indexType != None: 636 if renderable.indexType != None:
606 commandBuffer.vkCmdBindIndexBuffer( 637 commandBuffer.vkCmdBindIndexBuffer(
607 renderable.indexBuffer, 638 renderable.indexBuffer,
608 renderable.indexBufferOffset, 639 renderable.indexBufferOffset,
609 renderable.indexType, 640 renderable.indexType,