using indirect draw, not working yet
This commit is contained in:
parent
02501ce1a1
commit
302f7a6d83
2 changed files with 73 additions and 0 deletions
|
@ -101,6 +101,12 @@ createFrames
|
|||
Vk.BUFFER_USAGE_STORAGE_BUFFER_BIT
|
||||
VMA.MEMORY_USAGE_CPU_TO_GPU
|
||||
|
||||
indirectBuffer <- createAllocatedBuffer
|
||||
allocator
|
||||
(sizeOf maxObjects)
|
||||
Vk.BUFFER_USAGE_STORAGE_BUFFER_BIT
|
||||
VMA.MEMORY_USAGE_CPU_TO_GPU
|
||||
|
||||
let allocationInfo = Vk.zero
|
||||
{ Vk.descriptorPool = descriptorPool
|
||||
, Vk.setLayouts = V.singleton setLayout
|
||||
|
@ -162,6 +168,7 @@ createFrames
|
|||
, frameCameraBuffer = cameraBuffer
|
||||
, frameSceneBuffer = sceneBuffer
|
||||
, frameObjectBuffer = objectBuffer
|
||||
, frameIndirectBuffer = indirectBuffer
|
||||
, frameGlobalDescriptor = V.head globalDescriptor
|
||||
, frameObjectDescriptor = V.head objectDescriptor
|
||||
}
|
||||
|
@ -226,6 +233,71 @@ recordCommandBuffer
|
|||
|
||||
let draws = compactDraws meshMap materialMap renderObjects
|
||||
|
||||
let drawCommands = V.map
|
||||
(\(i, RenderObject mesh matrix material) ->
|
||||
Vk.DrawIndirectCommand
|
||||
{ vertexCount = fromIntegral (V.length $ meshVertices $ meshMap M.! mesh)
|
||||
, firstVertex = 0
|
||||
, instanceCount = 1
|
||||
, firstInstance = i
|
||||
}
|
||||
)
|
||||
(V.zip
|
||||
(V.fromList [0..])
|
||||
renderObjects
|
||||
)
|
||||
|
||||
V.mapM_
|
||||
(\(IndirectBatch mesh material first count) -> do
|
||||
|
||||
when
|
||||
(materialTextureSet material /= Vk.NULL_HANDLE)
|
||||
(Vk.cmdBindDescriptorSets
|
||||
commandBuffer
|
||||
Vk.PIPELINE_BIND_POINT_GRAPHICS
|
||||
(materialPipelineLayout material)
|
||||
2
|
||||
(V.singleton $ materialTextureSet material)
|
||||
V.empty
|
||||
)
|
||||
|
||||
Vk.cmdBindPipeline commandBuffer Vk.PIPELINE_BIND_POINT_GRAPHICS (materialPipeline material)
|
||||
|
||||
Vk.cmdBindDescriptorSets
|
||||
commandBuffer
|
||||
Vk.PIPELINE_BIND_POINT_GRAPHICS
|
||||
(materialPipelineLayout material)
|
||||
0
|
||||
(V.singleton $ frameGlobalDescriptor frame)
|
||||
V.empty
|
||||
|
||||
Vk.cmdBindDescriptorSets
|
||||
commandBuffer
|
||||
Vk.PIPELINE_BIND_POINT_GRAPHICS
|
||||
(materialPipelineLayout material)
|
||||
1
|
||||
(V.singleton $ frameObjectDescriptor frame)
|
||||
V.empty
|
||||
|
||||
Vk.cmdBindVertexBuffers
|
||||
commandBuffer
|
||||
0
|
||||
(V.fromList [ allocatedBuffer $ meshBuffer mesh ])
|
||||
(V.fromList [ 0 ])
|
||||
|
||||
let indirectOffset = fromIntegral $
|
||||
first * fromIntegral ( sizeOf (undefined :: Vk.DrawIndirectCommand))
|
||||
drawStride = fromIntegral $ sizeOf (undefined :: Vk.DrawIndirectCommand)
|
||||
|
||||
Vk.cmdDrawIndirect
|
||||
commandBuffer
|
||||
(allocatedBuffer $ frameIndirectBuffer frame)
|
||||
indirectOffset
|
||||
(fromIntegral $ V.length draws)
|
||||
drawStride
|
||||
)
|
||||
draws
|
||||
|
||||
V.mapM_
|
||||
(\(IndirectBatch mesh material first count) -> do
|
||||
|
||||
|
|
|
@ -227,6 +227,7 @@ data FrameData = FrameData
|
|||
, frameCameraBuffer :: AllocatedBuffer
|
||||
, frameSceneBuffer :: AllocatedBuffer
|
||||
, frameObjectBuffer :: AllocatedBuffer
|
||||
, frameIndirectBuffer :: AllocatedBuffer
|
||||
, frameGlobalDescriptor :: Vk.DescriptorSet
|
||||
, frameObjectDescriptor :: Vk.DescriptorSet
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue