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
|
Vk.BUFFER_USAGE_STORAGE_BUFFER_BIT
|
||||||
VMA.MEMORY_USAGE_CPU_TO_GPU
|
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
|
let allocationInfo = Vk.zero
|
||||||
{ Vk.descriptorPool = descriptorPool
|
{ Vk.descriptorPool = descriptorPool
|
||||||
, Vk.setLayouts = V.singleton setLayout
|
, Vk.setLayouts = V.singleton setLayout
|
||||||
|
@ -162,6 +168,7 @@ createFrames
|
||||||
, frameCameraBuffer = cameraBuffer
|
, frameCameraBuffer = cameraBuffer
|
||||||
, frameSceneBuffer = sceneBuffer
|
, frameSceneBuffer = sceneBuffer
|
||||||
, frameObjectBuffer = objectBuffer
|
, frameObjectBuffer = objectBuffer
|
||||||
|
, frameIndirectBuffer = indirectBuffer
|
||||||
, frameGlobalDescriptor = V.head globalDescriptor
|
, frameGlobalDescriptor = V.head globalDescriptor
|
||||||
, frameObjectDescriptor = V.head objectDescriptor
|
, frameObjectDescriptor = V.head objectDescriptor
|
||||||
}
|
}
|
||||||
|
@ -226,6 +233,71 @@ recordCommandBuffer
|
||||||
|
|
||||||
let draws = compactDraws meshMap materialMap renderObjects
|
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_
|
V.mapM_
|
||||||
(\(IndirectBatch mesh material first count) -> do
|
(\(IndirectBatch mesh material first count) -> do
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ data FrameData = FrameData
|
||||||
, frameCameraBuffer :: AllocatedBuffer
|
, frameCameraBuffer :: AllocatedBuffer
|
||||||
, frameSceneBuffer :: AllocatedBuffer
|
, frameSceneBuffer :: AllocatedBuffer
|
||||||
, frameObjectBuffer :: AllocatedBuffer
|
, frameObjectBuffer :: AllocatedBuffer
|
||||||
|
, frameIndirectBuffer :: AllocatedBuffer
|
||||||
, frameGlobalDescriptor :: Vk.DescriptorSet
|
, frameGlobalDescriptor :: Vk.DescriptorSet
|
||||||
, frameObjectDescriptor :: Vk.DescriptorSet
|
, frameObjectDescriptor :: Vk.DescriptorSet
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue