module Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects (
shaderCompiler,
ShaderType(..), Shader, createShader,
shaderSourceBS, shaderSource, compileShader, releaseShaderCompiler,
shaderType, shaderDeleteStatus, compileStatus, shaderInfoLog,
PrecisionType, shaderPrecisionFormat,
packUtf8, unpackUtf8
) where
import Control.Monad
import Data.StateVar
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Marshal.Utils
import Foreign.Storable
import Graphics.Rendering.OpenGL.GL.ByteString
import Graphics.Rendering.OpenGL.GL.GLboolean
import Graphics.Rendering.OpenGL.GL.PeekPoke
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Shaders.Shader
import Graphics.GL
shaderCompiler :: GettableStateVar Bool
shaderCompiler =
makeGettableStateVar (getBoolean1 unmarshalGLboolean GetShaderCompiler)
data ShaderType =
VertexShader
| TessControlShader
| TessEvaluationShader
| GeometryShader
| FragmentShader
| ComputeShader
deriving ( Eq, Ord, Show )
marshalShaderType :: ShaderType -> GLenum
marshalShaderType x = case x of
VertexShader -> GL_VERTEX_SHADER
TessControlShader -> GL_TESS_CONTROL_SHADER
TessEvaluationShader -> GL_TESS_EVALUATION_SHADER
GeometryShader -> GL_GEOMETRY_SHADER
FragmentShader -> GL_FRAGMENT_SHADER
ComputeShader -> GL_COMPUTE_SHADER
unmarshalShaderType :: GLenum -> ShaderType
unmarshalShaderType x
| x == GL_VERTEX_SHADER = VertexShader
| x == GL_TESS_CONTROL_SHADER = TessControlShader
| x == GL_TESS_EVALUATION_SHADER = TessEvaluationShader
| x == GL_GEOMETRY_SHADER = GeometryShader
| x == GL_FRAGMENT_SHADER = FragmentShader
| x == GL_COMPUTE_SHADER = ComputeShader
| otherwise = error ("unmarshalShaderType: illegal value " ++ show x)
createShader :: ShaderType -> IO Shader
createShader = fmap Shader . glCreateShader . marshalShaderType
shaderSourceBS :: Shader -> StateVar ByteString
shaderSourceBS shader =
makeStateVar (getShaderSource shader) (setShaderSource shader)
getShaderSource :: Shader -> IO ByteString
getShaderSource = stringQuery shaderSourceLength (glGetShaderSource . shaderID)
shaderSourceLength :: Shader -> GettableStateVar GLsizei
shaderSourceLength = shaderVar fromIntegral ShaderSourceLength
setShaderSource :: Shader -> ByteString -> IO ()
setShaderSource shader src =
withByteString src $ \srcPtr srcLength ->
with srcPtr $ \srcPtrBuf ->
with srcLength $ \srcLengthBuf ->
glShaderSource (shaderID shader)1 ring.OpenGL.GL.cal-6989586621679166508">messageIDsame="line-95">shader yass="hs-number">1 ring.OpenGL.GL.cal-6989586621679166508">shaderID-- * Byte> ring.Opespan> ring.OpenGL.GL.cal-698959232">ring.OpenGL.GL.cal-6989586621679166508"> shaderID-- * Byte> shaderID-- * Byte> ring.Opespan> ring.OpenGL.GL.cal-6989592354>ring.OpenGL.GL.cal-6989586621679172836"> shaderIDshaderID-- * Byte> shaderID-- * Byte> ass="hs-identifilass="hs-special">, shadess="hs-spectype">GLfloinaries.html#bind4th">bind4th8/a> x x shaderIDuhaderIDTriangleStripTriangleStripshadess="hs-spectype"sp.Primitivg">ass="hs-identifilass="hs-special">/span>ass="hs-number">1 bind4th8/a> TriangleS"hs-identifier">x shaderIDuhaderID shaderIDshaderID-- * Bytef="#loc"10pass="hs-identifier">messageIDsame="line-95">shader ring.OpenGL.GL.cal-6989586621679166508">shaderID-- * Byte> ar">getSizei1 id shaderID$ format