Try to add compute shaders
This commit is contained in:
+78
-38
@@ -6,20 +6,20 @@ module Preload.Render (
|
||||
) where
|
||||
|
||||
import Control.Concurrent
|
||||
import Shader.AuxAddition
|
||||
import Shape.Data
|
||||
import GLHelp
|
||||
import Control.Lens
|
||||
import Control.Monad
|
||||
import Data.Preload.Render
|
||||
import qualified Data.Vector.Mutable as MV
|
||||
import Foreign
|
||||
import Framebuffer.Setup
|
||||
import GLHelp
|
||||
import Graphics.GL.Core45
|
||||
import Shader
|
||||
import Shader.AuxAddition
|
||||
import Shader.Compile
|
||||
import Shader.Data
|
||||
import Shader.Parameters
|
||||
import Graphics.GL.Core45
|
||||
import Shape.Data
|
||||
|
||||
{- BINDING LIST:
|
||||
0 base
|
||||
@@ -30,24 +30,46 @@ import Graphics.GL.Core45
|
||||
|
||||
preloadRender :: IO RenderData
|
||||
preloadRender = do
|
||||
putStrLn "Number cores available:"
|
||||
getNumCapabilities >>= print
|
||||
|
||||
forM_ [0, 1, 2] $ \i -> do
|
||||
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_COUNT " ++ show i
|
||||
alloca $ \ptr -> do
|
||||
glGetIntegeri_v GL_MAX_COMPUTE_WORK_GROUP_COUNT i ptr
|
||||
x <- peek ptr
|
||||
putStrLn $ show x
|
||||
|
||||
forM_ [0, 1, 2] $ \i -> do
|
||||
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_SIZE " ++ show i
|
||||
alloca $ \ptr -> do
|
||||
glGetIntegeri_v GL_MAX_COMPUTE_WORK_GROUP_SIZE i ptr
|
||||
x <- peek ptr
|
||||
putStrLn $ show x
|
||||
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"
|
||||
alloca $ \ptr -> do
|
||||
glGetIntegerv GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS ptr
|
||||
x <- peek ptr
|
||||
putStrLn $ show x
|
||||
|
||||
-- set up uniform buffer object
|
||||
putStrLn "Setup UBO"
|
||||
theUBO <- mglCreate glCreateBuffers
|
||||
glNamedBufferData theUBO 64 nullPtr GL_STREAM_DRAW
|
||||
glBindBufferBase GL_UNIFORM_BUFFER 0 theUBO
|
||||
|
||||
getNumCapabilities >>= print
|
||||
|
||||
-- orthonormalUBO <- mglCreate glCreateBuffers
|
||||
-- withArray idMat $ \ptr ->
|
||||
-- glNamedBufferStorage orthonormalUBO 64 ptr 0
|
||||
-- orthonormalUBO <- mglCreate glCreateBuffers
|
||||
-- withArray idMat $ \ptr ->
|
||||
-- glNamedBufferStorage orthonormalUBO 64 ptr 0
|
||||
|
||||
lightsubo <- mglCreate glCreateBuffers
|
||||
glNamedBufferData lightsubo 640 nullPtr GL_STREAM_DRAW
|
||||
glBindBufferBase GL_UNIFORM_BUFFER 1 lightsubo
|
||||
|
||||
-- setup shape geometry/cap VBO and two VAOs
|
||||
putStrLn "Setup shape VBO, VAO, EBO"
|
||||
shVBO <- setupVBO nShapeVerxComp
|
||||
shPosVAO <- setupVAOUsingVBO [4] shVBO
|
||||
shPosVAO <- setupVAOUsingVBO [4] shVBO
|
||||
shEBO <- setupEBO shPosVAO
|
||||
-- note the shape shader vao is distinct from the position vao, but they
|
||||
-- share an EBO
|
||||
@@ -55,41 +77,52 @@ preloadRender = do
|
||||
glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. eboName)
|
||||
|
||||
--setup silhouette edge VAO
|
||||
shedgevao <- setupVAOUsingVBO [4] shVBO
|
||||
putStrLn "Setup silhouette VAO, EBO"
|
||||
shedgevao <- setupVAOUsingVBO [4] shVBO
|
||||
shedgeebo <- setupEBO shedgevao
|
||||
|
||||
putStrLn "Setup wall/windows VBO, VAO, EBO, shader"
|
||||
let wallverxstrd = 8
|
||||
wallvbo <- setupVBO wallverxstrd
|
||||
winvbo <- setupVBO 8
|
||||
windowshader <- makeShaderUsingVBO "wall/blank" [vert, geom, frag] [4, 4] pmPoints winvbo
|
||||
wallshader <- makeShaderUsingVBO "wall/basic" [vert, geom, frag] [4, 4] pmPoints wallvbo
|
||||
putStrLn "Setup lighting shaders"
|
||||
lightingWallShadShad <-
|
||||
makeShaderUsingVBO "lighting/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
||||
lightingCapShad <-
|
||||
makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO
|
||||
lightingLineShadowShad <-
|
||||
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
|
||||
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
|
||||
shadowedgeshader <-
|
||||
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shedgevao
|
||||
shadowcapshader <-
|
||||
makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO
|
||||
shadowwallshader <-
|
||||
makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
||||
shadowlightshader <- makeShaderSized "shadow/light" [vert, geom, frag]
|
||||
[1] 1
|
||||
pmPoints
|
||||
shadowcombineshader <- makeShaderSized "shadow/combine" [vert,geom,frag] [1] 1 pmPoints
|
||||
shadowlightshader <-
|
||||
makeShaderSized
|
||||
"shadow/light"
|
||||
[vert, geom, frag]
|
||||
[1]
|
||||
1
|
||||
pmPoints
|
||||
shadowcombineshader <- makeShaderSized "shadow/combine" [vert, geom, frag] [1] 1 pmPoints
|
||||
poke (shadVBOptr shadowlightshader) 1
|
||||
|
||||
-- 2D draw shaders
|
||||
putStrLn "Setup 2D shaders"
|
||||
bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles
|
||||
aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles
|
||||
eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles
|
||||
cslist <-
|
||||
makeShaderVBO "picture/charArray" [vert, frag] [3, 4, 4] pmTriangles
|
||||
-- initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_NEAREST_MIPMAP_LINEAR GL_LINEAR
|
||||
-- initTexture2DArray 50 "data/texture/charMapVert16Block.png" 2 16 32 95 GL_NEAREST GL_NEAREST
|
||||
initTexture2DArray 50 "data/texture/charMapVert8Block.png" 2 8 16 95 GL_NEAREST GL_NEAREST
|
||||
-- initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_NEAREST_MIPMAP_LINEAR GL_LINEAR
|
||||
initTexture2DArray 50 "data/texture/charMapVert16Block.png" 2 16 32 95 GL_NEAREST GL_NEAREST
|
||||
--initTexture2DArray 50 "data/texture/charMapVert8Block.png" 2 8 16 95 GL_NEAREST GL_NEAREST
|
||||
--initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR
|
||||
--initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_LINEAR_MIPMAP_NEAREST GL_LINEAR
|
||||
|
||||
putStrLn "Setup full screen shaders"
|
||||
screentexturevbo <- mglCreate glCreateBuffers
|
||||
withArray (concat cornerList) $ \ptr ->
|
||||
glNamedBufferStorage
|
||||
@@ -97,8 +130,8 @@ preloadRender = do
|
||||
(fromIntegral $ floatSize * length (concat cornerList))
|
||||
ptr
|
||||
0
|
||||
screentexturevao <- setupVAOvbo' [2,2] 4 screentexturevbo
|
||||
alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert,frag] pmTriangleStrip screentexturevao
|
||||
screentexturevao <- setupVAOvbo' [2, 2] 4 screentexturevbo
|
||||
alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao
|
||||
fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] pmTriangleStrip screentexturevao
|
||||
bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] pmTriangleStrip screentexturevao
|
||||
colorBlurShad <- makeShaderUsingVAO "texture/colorBlur" [vert, frag] pmTriangleStrip screentexturevao
|
||||
@@ -107,24 +140,24 @@ preloadRender = do
|
||||
makeShaderUsingVAO "lighting/texture" [vert, frag] pmTriangleStrip screentexturevao
|
||||
barrelShad <- makeShaderVBO "texture/barrel" [vert, geom, frag] [2, 2, 2, 1] pmPoints
|
||||
-- blank wallShader
|
||||
winvbo <- setupVBO 8
|
||||
windowshader <- makeShaderUsingVBO "wall/blank" [vert, geom, frag] [4,4] pmPoints winvbo
|
||||
wallshader <- makeShaderUsingVBO "wall/basic" [vert,geom,frag] [4,4] pmPoints wallvbo
|
||||
putStrLn "Setup floor VBO, shader"
|
||||
let floorverxstrd = 8
|
||||
floorvbo <- setupVBOStatic floorverxstrd
|
||||
floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] [4,4] pmTriangles floorvbo
|
||||
floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] [4, 4] pmTriangles floorvbo
|
||||
initTexture2DArraySquare 40 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/diffuseArray.png"
|
||||
initTexture2DArraySquare 41 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/normalArray.png"
|
||||
|
||||
let cloudverxsizes = [4,4,4,4]
|
||||
putStrLn "Setup cloud VBO, shader"
|
||||
let cloudverxsizes = [4, 4, 4, 4]
|
||||
cloudvbo <- setupVBO (sum cloudverxsizes)
|
||||
(cloudshader, cloudebo)
|
||||
<- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo
|
||||
(cloudshader, cloudebo) <-
|
||||
makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo
|
||||
framebuf2 <- newTextureFramebuffer
|
||||
framebuf3 <- newTextureFramebuffer
|
||||
|
||||
putStrLn "Setup framebuffers"
|
||||
rboBaseBloomName <- mglCreate glCreateRenderbuffers
|
||||
glNamedRenderbufferStorage
|
||||
glNamedRenderbufferStorage
|
||||
rboBaseBloomName
|
||||
GL_DEPTH24_STENCIL8
|
||||
800
|
||||
@@ -156,10 +189,16 @@ preloadRender = do
|
||||
, aslist
|
||||
, eslist
|
||||
]
|
||||
|
||||
-- setup compute shader
|
||||
computeshadowshader <- makeSourcedShader "compute/shadow" [GL_COMPUTE_SHADER]
|
||||
|
||||
initializeGLState
|
||||
putStrLn "Return preload"
|
||||
return $
|
||||
RenderData
|
||||
{ _pictureShaders = shadV
|
||||
{ _computeShadowShader = computeshadowshader
|
||||
, _pictureShaders = shadV
|
||||
, _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO
|
||||
, _shapeEBO = shEBO
|
||||
, _silhouetteEBO = shedgeebo
|
||||
@@ -193,8 +232,8 @@ preloadRender = do
|
||||
, _fboOverlay = fbooverlay
|
||||
, _rboBaseBloom = rboBaseBloomName
|
||||
, _matUBO = theUBO
|
||||
-- , _orthonormalMatUBO = orthonormalUBO
|
||||
, _lightsUBO = lightsubo
|
||||
, -- , _orthonormalMatUBO = orthonormalUBO
|
||||
_lightsUBO = lightsubo
|
||||
, _vboWindows = winvbo
|
||||
, _vboShapes = shVBO
|
||||
, _floorVBO = floorvbo
|
||||
@@ -215,6 +254,7 @@ cornerList =
|
||||
, [1, 1, 1, 1]
|
||||
, [1, -1, 1, 0]
|
||||
]
|
||||
|
||||
--cornerListForTriangles :: [[Float]]
|
||||
--cornerListForTriangles =
|
||||
-- [ [-1, 1, 0, 1]
|
||||
@@ -229,11 +269,11 @@ initializeGLState :: IO ()
|
||||
initializeGLState = do
|
||||
glEnable GL_DEPTH_TEST
|
||||
|
||||
|
||||
cleanUpRenderPreload :: RenderData -> IO ()
|
||||
cleanUpRenderPreload _ = return ()
|
||||
|
||||
--cleanUpRenderPreload pd = do
|
||||
-- TODO fix this
|
||||
--mapM_ freeShaderPointers $ _pictureShaders pd
|
||||
--freeShaderPointers' $ _lightingWallShadShader pd
|
||||
--freeShaderPointers' $ _fullscreenShader pd
|
||||
-- TODO fix this
|
||||
--mapM_ freeShaderPointers $ _pictureShaders pd
|
||||
--freeShaderPointers' $ _lightingWallShadShader pd
|
||||
--freeShaderPointers' $ _fullscreenShader pd
|
||||
|
||||
Reference in New Issue
Block a user