From f14d9bef60d22d478a3eed874a718b23ae509dcc Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 9 Mar 2023 13:17:43 +0000 Subject: [PATCH] Start to move vbo objects to use DSA --- src/Dodge/Render/Shadow.hs | 2 +- src/Preload/Render.hs | 26 +++++++++++++------------- src/Shader/Bind.hs | 5 +++-- src/Shader/Compile.hs | 8 +++++--- src/Shader/Data.hs | 4 ++-- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Dodge/Render/Shadow.hs b/src/Dodge/Render/Shadow.hs index 28eb1c64c..c59bcdc47 100644 --- a/src/Dodge/Render/Shadow.hs +++ b/src/Dodge/Render/Shadow.hs @@ -23,7 +23,7 @@ drawCPUShadows pdata s pos rad = do let theshad = pdata ^. positionalBlankShader theptr = _vboPtr $ _vaoVBO $ _shadVAO' theshad i <- VFSM.foldlM' (pokeShapeShad pos rad theptr) 0 $ VFSM.fromList s - bindBuffer ArrayBuffer $= (theshad ^? shadVAO' . vaoVBO . vbo) + glBindBuffer GL_ARRAY_BUFFER (theshad ^. shadVAO' . vaoVBO . vboName) bufferSubData ArrayBuffer WriteToBuffer diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 2e0738c8e..d70431e9a 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -32,20 +32,20 @@ preloadRender = do bufferData UniformBuffer $= (64, nullPtr, StreamDraw) bindBufferBase IndexedUniformBuffer 0 $= Just theUBO -- setup wall points VBO, VAOs and shaders - wpVBOname <- genObjectName + wpVBOname <- mglCreateSingle glCreateBuffers wpVBOptr <- mallocArray (8 * numDrawableWalls) - bindBuffer ArrayBuffer $= Just wpVBOname + glBindBuffer GL_ARRAY_BUFFER wpVBOname bufferData ArrayBuffer $= ( fromIntegral $ floatSize * numDrawableWalls * 8 , nullPtr , StreamDraw ) - let wpVBO = VBO{_vbo = wpVBOname, _vboPtr = wpVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} + let wpVBO = VBO{_vboName = wpVBOname, _vboPtr = wpVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} -- wpVAOname <- genObjectName -- bindVertexArrayObject $= Just wpVAOname wpVAOname <- mglCreateSingle glCreateVertexArrays glBindVertexArray wpVAOname - bindBuffer ArrayBuffer $= Just wpVBOname + glBindBuffer GL_ARRAY_BUFFER wpVBOname setupVertexAttribPointer 0 4 8 0 --wpColVAOname <- genObjectName --bindVertexArrayObject $= Just wpColVAOname @@ -56,15 +56,15 @@ preloadRender = do let wpVAO = VAO{_vaoName = wpVAOname, _vaoVBO = wpVBO} wpColVAO = VAO{_vaoName = wpColVAOname, _vaoVBO = wpVBO} -- setup window points VBO, VAOs and shaders - winVBOname <- genObjectName + winVBOname <- mglCreateSingle glCreateBuffers winVBOptr <- mallocArray (8 * numDrawableWalls) - bindBuffer ArrayBuffer $= Just winVBOname + glBindBuffer GL_ARRAY_BUFFER winVBOname bufferData ArrayBuffer $= ( fromIntegral $ floatSize * numDrawableWalls * 8 , nullPtr , StreamDraw ) - let winVBO = VBO{_vbo = winVBOname, _vboPtr = winVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} + let winVBO = VBO{_vboName = winVBOname, _vboPtr = winVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} --winColVAOname <- genObjectName --bindVertexArrayObject $= Just winColVAOname winColVAOname <- mglCreateSingle glCreateVertexArrays @@ -88,20 +88,20 @@ preloadRender = do nullPtr GL_STREAM_DRAW let shEBO = EBO{_eboName = shEBOname, _eboPtr = shEBOptr} - shVBOname <- genObjectName + shVBOname <- mglCreateSingle glCreateBuffers shVBOptr <- mallocArray (7 * numDrawableElements) - bindBuffer ArrayBuffer $= Just shVBOname + glBindBuffer GL_ARRAY_BUFFER shVBOname bufferData ArrayBuffer $= ( fromIntegral $ floatSize * numDrawableElements * 7 , nullPtr , StreamDraw ) - let shVBO = VBO{_vbo = shVBOname, _vboPtr = shVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} + let shVBO = VBO{_vboName = shVBOname, _vboPtr = shVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} --shPosColVAOname <- genObjectName --bindVertexArrayObject $= Just shPosColVAOname shPosColVAOname <- mglCreateSingle glCreateVertexArrays glBindVertexArray shPosColVAOname - bindBuffer ArrayBuffer $= Just shVBOname + glBindBuffer GL_ARRAY_BUFFER shVBOname setupVertexAttribPointer 0 3 7 0 setupVertexAttribPointer 1 4 7 3 --bindBuffer ElementArrayBuffer $= Just shEBOname @@ -110,7 +110,7 @@ preloadRender = do --bindVertexArrayObject $= Just shPosVAOname shPosVAOname <- mglCreateSingle glCreateVertexArrays glBindVertexArray shPosVAOname - bindBuffer ArrayBuffer $= Just shVBOname + glBindBuffer GL_ARRAY_BUFFER shVBOname setupVertexAttribPointer 0 3 7 0 --bindBuffer ElementArrayBuffer $= Just shEBOname glBindBuffer GL_ELEMENT_ARRAY_BUFFER shEBOname @@ -121,7 +121,7 @@ preloadRender = do --bindVertexArrayObject $= Just shEdgeVAOname shEdgeVAOname <- mglCreateSingle glCreateVertexArrays glBindVertexArray shEdgeVAOname - bindBuffer ArrayBuffer $= Just shVBOname + glBindBuffer GL_ARRAY_BUFFER shVBOname setupVertexAttribPointer 0 3 7 0 --setup ebo for silhouette edges silEBOname <- mglCreateSingle glCreateBuffers diff --git a/src/Shader/Bind.hs b/src/Shader/Bind.hs index 846c7ba17..be9fdf264 100644 --- a/src/Shader/Bind.hs +++ b/src/Shader/Bind.hs @@ -14,11 +14,12 @@ import qualified Data.Vector.Mutable as MV import qualified Data.Vector.Fusion.Stream.Monadic as VFSM import Control.Monad.Primitive import Control.Monad +import Graphics.GL.Core45 bindArrayBuffers :: Int -> VBO -> IO () {-# INLINABLE bindArrayBuffers #-} bindArrayBuffers numVs theVBO = do - bindBuffer ArrayBuffer $= Just (_vbo theVBO) + glBindBuffer GL_ARRAY_BUFFER (_vboName theVBO) bufferSubData ArrayBuffer WriteToBuffer @@ -32,7 +33,7 @@ bindShaderLayers shads counts = MV.imapM_ f shads f i shad = do let theVBO = _vaoVBO $ _shadVAO' shad stride = sum $ _vboAttribSizes theVBO - bindBuffer ArrayBuffer $= (Just . _vbo $ theVBO) + glBindBuffer GL_ARRAY_BUFFER (_vboName $ theVBO) VFSM.mapM_ (g stride theVBO) $ VFSM.enumFromStepN 0 1 6 -- [0..5] --S.mapM_ (g stride theVBO) $ S.each [0..5] diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index be7b72b29..0326d0fd9 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -141,8 +141,10 @@ setupVAOSized ndraw sizes = do setupVBOSized :: Int -> [Int] -> IO VBO setupVBOSized ndraw sizes = do - vboName <- genObjectName - bindBuffer ArrayBuffer $= Just vboName + --vboName <- genObjectName + --bindBuffer ArrayBuffer $= Just vboName + vboname <- mglCreateSingle glCreateBuffers + glBindBuffer GL_ARRAY_BUFFER vboname forM_ (zip3 [0 ..] sizes offs) $ \(loc, siz, off) -> do setupVertexAttribPointer loc siz strd off thePtr <- mallocArray (strd * ndraw) @@ -154,7 +156,7 @@ setupVBOSized ndraw sizes = do ) return $ VBO - { _vbo = vboName + { _vboName = vboname , _vboPtr = thePtr , _vboAttribSizes = sizes , _vboStride = sum sizes diff --git a/src/Shader/Data.hs b/src/Shader/Data.hs index a2beff2dd..6a23d6ffd 100644 --- a/src/Shader/Data.hs +++ b/src/Shader/Data.hs @@ -12,7 +12,7 @@ module Shader.Data -- | Lens functions , vaoName , vaoVBO - , vbo + , vboName , vboPtr , vboAttribSizes , vboStride @@ -53,7 +53,7 @@ a pointer to a location with space that can be written to the buffer, and a list of attribute pointer sizes. Vertex attributes are interleaved within the vbo. -} data VBO = VBO - { _vbo :: BufferObject + { _vboName :: GLuint , _vboPtr :: Ptr Float , _vboAttribSizes :: [Int] -- ^ It is not clear to me if this is necessary to store or not , _vboStride :: Int