first little optimisation
This commit is contained in:
parent
b3a7670c97
commit
ef135731a4
3 changed files with 59 additions and 32 deletions
|
@ -24,6 +24,7 @@ import Types
|
||||||
import Memory
|
import Memory
|
||||||
import Util
|
import Util
|
||||||
import Data.Maybe (fromMaybe)
|
import Data.Maybe (fromMaybe)
|
||||||
|
import Mesh (compactDraws)
|
||||||
|
|
||||||
frameOverlap :: Int
|
frameOverlap :: Int
|
||||||
frameOverlap = 2
|
frameOverlap = 2
|
||||||
|
@ -221,22 +222,12 @@ recordCommandBuffer
|
||||||
|
|
||||||
renderObjects <- (liftIO . STM.atomically . STM.readTMVar) =<< asks renderables
|
renderObjects <- (liftIO . STM.atomically . STM.readTMVar) =<< asks renderables
|
||||||
meshMap <- (liftIO . STM.atomically . STM.readTMVar) =<< asks meshLibrary
|
meshMap <- (liftIO . STM.atomically . STM.readTMVar) =<< asks meshLibrary
|
||||||
|
|
||||||
V.mapM_
|
|
||||||
(\(index, RenderObject meshID materialID modelMatrix) -> do
|
|
||||||
|
|
||||||
materialMap <- (liftIO . STM.atomically . STM.readTMVar) =<< asks materialLibrary
|
materialMap <- (liftIO . STM.atomically . STM.readTMVar) =<< asks materialLibrary
|
||||||
|
|
||||||
let constants = MeshPushConstants
|
let draws = compactDraws meshMap materialMap renderObjects
|
||||||
{ meshPushData = V4 0 0 0 0
|
|
||||||
, meshRenderMatrix = modelMatrix
|
V.mapM_
|
||||||
}
|
(\(IndirectBatch mesh material first count) -> do
|
||||||
mesh = fromMaybe
|
|
||||||
(error $ "no mesh called " <> meshID <> " present")
|
|
||||||
(meshMap M.!? meshID)
|
|
||||||
material = fromMaybe
|
|
||||||
(error $ "no material called " <> materialID <> " present")
|
|
||||||
(materialMap M.!? materialID)
|
|
||||||
|
|
||||||
when
|
when
|
||||||
(materialTextureSet material /= Vk.NULL_HANDLE)
|
(materialTextureSet material /= Vk.NULL_HANDLE)
|
||||||
|
@ -267,28 +258,19 @@ recordCommandBuffer
|
||||||
(V.singleton $ frameObjectDescriptor frame)
|
(V.singleton $ frameObjectDescriptor frame)
|
||||||
V.empty
|
V.empty
|
||||||
|
|
||||||
dataPointer <- liftIO (castPtr <$> new constants)
|
|
||||||
|
|
||||||
Vk.cmdPushConstants
|
|
||||||
commandBuffer
|
|
||||||
(materialPipelineLayout material)
|
|
||||||
Vk.SHADER_STAGE_VERTEX_BIT
|
|
||||||
0
|
|
||||||
(fromIntegral $ sizeOf constants)
|
|
||||||
dataPointer
|
|
||||||
|
|
||||||
Vk.cmdBindVertexBuffers
|
Vk.cmdBindVertexBuffers
|
||||||
commandBuffer
|
commandBuffer
|
||||||
0
|
0
|
||||||
(V.fromList [ allocatedBuffer $ meshBuffer mesh ])
|
(V.fromList [ allocatedBuffer $ meshBuffer mesh ])
|
||||||
(V.fromList [ 0 ])
|
(V.fromList [ 0 ])
|
||||||
|
|
||||||
|
mapM_
|
||||||
|
(\index ->
|
||||||
Vk.cmdDraw commandBuffer (fromIntegral $ V.length $ meshVertices mesh) 1 0 index
|
Vk.cmdDraw commandBuffer (fromIntegral $ V.length $ meshVertices mesh) 1 0 index
|
||||||
)
|
)
|
||||||
(V.zip
|
([first .. first + count])
|
||||||
(V.fromList [0 ..])
|
|
||||||
renderObjects
|
|
||||||
)
|
)
|
||||||
|
draws
|
||||||
|
|
||||||
prepareRecording
|
prepareRecording
|
||||||
:: V2 CInt
|
:: V2 CInt
|
||||||
|
|
34
src/Mesh.hs
34
src/Mesh.hs
|
@ -190,3 +190,37 @@ loadFromObj filepath vma uploadContext queue device = do
|
||||||
in
|
in
|
||||||
-- flip V coordinate of UVs to fix display
|
-- flip V coordinate of UVs to fix display
|
||||||
V2 r (-s)
|
V2 r (-s)
|
||||||
|
|
||||||
|
compactDraws
|
||||||
|
:: M.Map String Mesh
|
||||||
|
-> M.Map String Material
|
||||||
|
-> V.Vector RenderObject
|
||||||
|
-> V.Vector IndirectBatch
|
||||||
|
compactDraws meshLib materialLib objects =
|
||||||
|
|
||||||
|
V.foldl
|
||||||
|
(\acc (index, RenderObject mesh material _) ->
|
||||||
|
|
||||||
|
let newDraw = IndirectBatch
|
||||||
|
{ batchMesh = meshLib M.! mesh
|
||||||
|
, batchMaterial = materialLib M.! material
|
||||||
|
, batchFirst = index
|
||||||
|
, batchCount = 1
|
||||||
|
}
|
||||||
|
sameMesh = not (V.null acc) && (meshLib M.! mesh == batchMesh (V.last acc))
|
||||||
|
sameMaterial = not (V.null acc) && (materialLib M.! material == batchMaterial (V.last acc))
|
||||||
|
|
||||||
|
in
|
||||||
|
if sameMesh && sameMaterial
|
||||||
|
then
|
||||||
|
V.init acc `V.snoc` ((V.last acc)
|
||||||
|
{ batchCount = batchCount (V.last acc) + 1
|
||||||
|
})
|
||||||
|
else
|
||||||
|
acc `V.snoc` newDraw
|
||||||
|
)
|
||||||
|
V.empty
|
||||||
|
(V.zip
|
||||||
|
(V.fromList [0..])
|
||||||
|
objects
|
||||||
|
)
|
||||||
|
|
17
src/Types.hs
17
src/Types.hs
|
@ -54,13 +54,17 @@ data AllocatedBuffer = AllocatedBuffer
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
|
instance Eq AllocatedBuffer where
|
||||||
|
|
||||||
|
(AllocatedBuffer buf1 _ _) == (AllocatedBuffer buf2 _ _) = buf1 == buf2
|
||||||
|
|
||||||
data Vertex = Vertex
|
data Vertex = Vertex
|
||||||
{ vertexPosition :: V3 Float
|
{ vertexPosition :: V3 Float
|
||||||
, vertexNormal :: V3 Float
|
, vertexNormal :: V3 Float
|
||||||
, vertexColor :: V4 Float
|
, vertexColor :: V4 Float
|
||||||
, vertexUV :: V2 Float
|
, vertexUV :: V2 Float
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
instance Storable Vertex where
|
instance Storable Vertex where
|
||||||
|
|
||||||
|
@ -143,7 +147,7 @@ data Mesh = Mesh
|
||||||
{ meshVertices :: V.Vector Vertex
|
{ meshVertices :: V.Vector Vertex
|
||||||
, meshBuffer :: AllocatedBuffer
|
, meshBuffer :: AllocatedBuffer
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
data MeshPushConstants = MeshPushConstants
|
data MeshPushConstants = MeshPushConstants
|
||||||
{ meshPushData :: V4 Float
|
{ meshPushData :: V4 Float
|
||||||
|
@ -180,7 +184,7 @@ data Material = Material
|
||||||
, materialPipeline :: Vk.Pipeline
|
, materialPipeline :: Vk.Pipeline
|
||||||
, materialPipelineLayout :: Vk.PipelineLayout
|
, materialPipelineLayout :: Vk.PipelineLayout
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
data RenderObject = RenderObject
|
data RenderObject = RenderObject
|
||||||
{ objectMesh :: String
|
{ objectMesh :: String
|
||||||
|
@ -317,3 +321,10 @@ data UploadContext = UploadContext
|
||||||
, uploadCommandBuffer :: Vk.CommandBuffer
|
, uploadCommandBuffer :: Vk.CommandBuffer
|
||||||
}
|
}
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
|
data IndirectBatch = IndirectBatch
|
||||||
|
{ batchMesh :: Mesh
|
||||||
|
, batchMaterial :: Material
|
||||||
|
, batchFirst :: Word32
|
||||||
|
, batchCount :: Word32
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue