diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/LambdaCube/GL/Backend.hs | 15 | ||||
-rw-r--r-- | src/LambdaCube/GL/Type.hs | 1 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/LambdaCube/GL/Backend.hs b/src/LambdaCube/GL/Backend.hs index 619ea76..84e5b04 100644 --- a/src/LambdaCube/GL/Backend.hs +++ b/src/LambdaCube/GL/Backend.hs | |||
@@ -506,6 +506,7 @@ allocRenderer p = do | |||
506 | forceSetup <- newIORef True | 506 | forceSetup <- newIORef True |
507 | vertexBufferRef <- newIORef 0 | 507 | vertexBufferRef <- newIORef 0 |
508 | indexBufferRef <- newIORef 0 | 508 | indexBufferRef <- newIORef 0 |
509 | drawCallCounterRef <- newIORef 0 | ||
509 | return $ GLRenderer | 510 | return $ GLRenderer |
510 | { glPrograms = prgs | 511 | { glPrograms = prgs |
511 | , glTextures = texs | 512 | , glTextures = texs |
@@ -522,6 +523,7 @@ allocRenderer p = do | |||
522 | , glForceSetup = forceSetup | 523 | , glForceSetup = forceSetup |
523 | , glVertexBufferRef = vertexBufferRef | 524 | , glVertexBufferRef = vertexBufferRef |
524 | , glIndexBufferRef = indexBufferRef | 525 | , glIndexBufferRef = indexBufferRef |
526 | , glDrawCallCounterRef = drawCallCounterRef | ||
525 | } | 527 | } |
526 | 528 | ||
527 | disposeRenderer :: GLRenderer -> IO () | 529 | disposeRenderer :: GLRenderer -> IO () |
@@ -692,8 +694,8 @@ setStorage' p@GLRenderer{..} input' = do | |||
692 | buffer binding on various targets: GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER | 694 | buffer binding on various targets: GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER |
693 | glEnable/DisableVertexAttribArray | 695 | glEnable/DisableVertexAttribArray |
694 | -} | 696 | -} |
695 | renderSlot :: IORef GLuint -> IORef GLuint -> [GLObjectCommand] -> IO () | 697 | renderSlot :: IORef Int -> IORef GLuint -> IORef GLuint -> [GLObjectCommand] -> IO () |
696 | renderSlot glVertexBufferRef glIndexBufferRef cmds = forM_ cmds $ \cmd -> do | 698 | renderSlot glDrawCallCounterRef glVertexBufferRef glIndexBufferRef cmds = forM_ cmds $ \cmd -> do |
697 | let setup ref v m = do | 699 | let setup ref v m = do |
698 | old <- readIORef ref | 700 | old <- readIORef ref |
699 | unless (old == v) $ do | 701 | unless (old == v) $ do |
@@ -709,10 +711,11 @@ renderSlot glVertexBufferRef glIndexBufferRef cmds = forM_ cmds $ \cmd -> do | |||
709 | setup glVertexBufferRef buf $ glBindBuffer GL_ARRAY_BUFFER buf | 711 | setup glVertexBufferRef buf $ glBindBuffer GL_ARRAY_BUFFER buf |
710 | glEnableVertexAttribArray idx | 712 | glEnableVertexAttribArray idx |
711 | glVertexAttribIPointer idx size typ 0 ptr | 713 | glVertexAttribIPointer idx size typ 0 ptr |
712 | GLDrawArrays mode first count -> glDrawArrays mode first count | 714 | GLDrawArrays mode first count -> glDrawArrays mode first count >> modifyIORef glDrawCallCounterRef succ |
713 | GLDrawElements mode count typ buf indicesPtr -> do | 715 | GLDrawElements mode count typ buf indicesPtr -> do |
714 | setup glIndexBufferRef buf $ glBindBuffer GL_ELEMENT_ARRAY_BUFFER buf | 716 | setup glIndexBufferRef buf $ glBindBuffer GL_ELEMENT_ARRAY_BUFFER buf |
715 | glDrawElements mode count typ indicesPtr | 717 | glDrawElements mode count typ indicesPtr |
718 | modifyIORef glDrawCallCounterRef succ | ||
716 | GLSetUniform idx (GLUniform ty ref) -> setUniform idx ty ref | 719 | GLSetUniform idx (GLUniform ty ref) -> setUniform idx ty ref |
717 | GLBindTexture txTarget tuRef (GLUniform _ ref) -> do | 720 | GLBindTexture txTarget tuRef (GLUniform _ ref) -> do |
718 | txObjVal <- readIORef ref | 721 | txObjVal <- readIORef ref |
@@ -781,6 +784,7 @@ renderFrame GLRenderer{..} = do | |||
781 | writeIORef glForceSetup True | 784 | writeIORef glForceSetup True |
782 | writeIORef glVertexBufferRef 0 | 785 | writeIORef glVertexBufferRef 0 |
783 | writeIORef glIndexBufferRef 0 | 786 | writeIORef glIndexBufferRef 0 |
787 | writeIORef glDrawCallCounterRef 0 | ||
784 | glBindVertexArray glVAO | 788 | glBindVertexArray glVAO |
785 | forM_ glCommands $ \cmd -> do | 789 | forM_ glCommands $ \cmd -> do |
786 | case cmd of | 790 | case cmd of |
@@ -792,7 +796,7 @@ renderFrame GLRenderer{..} = do | |||
792 | GLRenderStream ctx streamIdx progIdx -> do | 796 | GLRenderStream ctx streamIdx progIdx -> do |
793 | setupDrawContext glForceSetup glDrawContextRef glInput ctx | 797 | setupDrawContext glForceSetup glDrawContextRef glInput ctx |
794 | drawcmd <- readIORef (glStreamCommands $ glStreams ! streamIdx) | 798 | drawcmd <- readIORef (glStreamCommands $ glStreams ! streamIdx) |
795 | renderSlot glVertexBufferRef glIndexBufferRef drawcmd | 799 | renderSlot glDrawCallCounterRef glVertexBufferRef glIndexBufferRef drawcmd |
796 | 800 | ||
797 | GLRenderSlot ctx slotIdx progIdx -> do | 801 | GLRenderSlot ctx slotIdx progIdx -> do |
798 | input <- readIORef glInput | 802 | input <- readIORef glInput |
@@ -805,7 +809,7 @@ renderFrame GLRenderer{..} = do | |||
805 | unless setupDone $ setupDrawContext glForceSetup glDrawContextRef glInput ctx | 809 | unless setupDone $ setupDrawContext glForceSetup glDrawContextRef glInput ctx |
806 | drawcmd <- readIORef $ objCommands obj | 810 | drawcmd <- readIORef $ objCommands obj |
807 | --putStrLn "Render object" | 811 | --putStrLn "Render object" |
808 | renderSlot glVertexBufferRef glIndexBufferRef ((drawcmd ! icId ic) ! progIdx) | 812 | renderSlot glDrawCallCounterRef glVertexBufferRef glIndexBufferRef ((drawcmd ! icId ic) ! progIdx) |
809 | return True | 813 | return True |
810 | --putStrLn $ "Rendering " ++ show (V.length objs) ++ " objects" | 814 | --putStrLn $ "Rendering " ++ show (V.length objs) ++ " objects" |
811 | readIORef (slotVector (icInput ic) ! (icSlotMapPipelineToInput ic ! slotIdx)) >>= \case | 815 | readIORef (slotVector (icInput ic) ! (icSlotMapPipelineToInput ic ! slotIdx)) >>= \case |
@@ -814,6 +818,7 @@ renderFrame GLRenderer{..} = do | |||
814 | 818 | ||
815 | --isOk <- checkGL | 819 | --isOk <- checkGL |
816 | --putStrLn $ isOk ++ " - " ++ show cmd | 820 | --putStrLn $ isOk ++ " - " ++ show cmd |
821 | --readIORef glDrawCallCounterRef >>= \n -> putStrLn (show n ++ " draw calls") | ||
817 | 822 | ||
818 | data CGState | 823 | data CGState |
819 | = CGState | 824 | = CGState |
diff --git a/src/LambdaCube/GL/Type.hs b/src/LambdaCube/GL/Type.hs index 9769603..b406fa6 100644 --- a/src/LambdaCube/GL/Type.hs +++ b/src/LambdaCube/GL/Type.hs | |||
@@ -163,6 +163,7 @@ data GLRenderer | |||
163 | , glForceSetup :: IORef Bool | 163 | , glForceSetup :: IORef Bool |
164 | , glVertexBufferRef :: IORef GLuint | 164 | , glVertexBufferRef :: IORef GLuint |
165 | , glIndexBufferRef :: IORef GLuint | 165 | , glIndexBufferRef :: IORef GLuint |
166 | , glDrawCallCounterRef :: IORef Int | ||
166 | } | 167 | } |
167 | 168 | ||
168 | data GLSampler | 169 | data GLSampler |