module Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries (
ShaderBinaryFormat(..), shaderBinaryFormats,
ShaderBinary(..), shaderBinary,
) where
import Data.StateVar
import Foreign.Marshal.Array
import Graphics.Rendering.OpenGL.GL.ByteString
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Shaders.Shader
import Graphics.GL
newtype ShaderBinaryFormat = ShaderBinaryFormat GLenum
deriving ( ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
(ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> Eq ShaderBinaryFormat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c/= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
== :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c== :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
Eq, Eq ShaderBinaryFormat
Eq ShaderBinaryFormat =>
(ShaderBinaryFormat -> ShaderBinaryFormat -> Ordering)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> Bool)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat)
-> (ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat)
-> Ord ShaderBinaryFormat
ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
ShaderBinaryFormat -> ShaderBinaryFormat -> Ordering
ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat
$cmin :: ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat
max :: ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat
$cmax :: ShaderBinaryFormat -> ShaderBinaryFormat -> ShaderBinaryFormat
>= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c>= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
> :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c> :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
<= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c<= :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
< :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
$c< :: ShaderBinaryFormat -> ShaderBinaryFormat -> Bool
compare :: ShaderBinaryFormat -> ShaderBinaryFormat -> Ordering
$ccompare :: ShaderBinaryFormat -> ShaderBinaryFormat -> Ordering
$cp1Ord :: Eq ShaderBinaryFormat
Ord, Int -> ShaderBinaryFormat -> ShowS
[ShaderBinaryFormat] -> ShowS
ShaderBinaryFormat -> String
(Int -> ShaderBinaryFormat -> ShowS)
-> (ShaderBinaryFormat -> String)
-> ([ShaderBinaryFormat] -> ShowS)
-> Show ShaderBinaryFormat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ShaderBinaryFormat] -> ShowS
$cshowList :: [ShaderBinaryFormat] -> ShowS
show :: ShaderBinaryFormat -> String
$cshow :: ShaderBinaryFormat -> String
showsPrec :: Int -> ShaderBinaryFormat -> ShowS
$cshowsPrec :: Int -> ShaderBinaryFormat -> ShowS
Show )
shaderBinaryFormats :: GettableStateVar [ShaderBinaryFormat]
shaderBinaryFormats :: GettableStateVar [ShaderBinaryFormat]
shaderBinaryFormats =
GettableStateVar [ShaderBinaryFormat]
-> GettableStateVar [ShaderBinaryFormat]
forall a. IO a -> IO a
makeGettableStateVar (GettableStateVar [ShaderBinaryFormat]
-> GettableStateVar [ShaderBinaryFormat])
-> GettableStateVar [ShaderBinaryFormat]
-> GettableStateVar [ShaderBinaryFormat]
forall a b. (a -> b) -> a -> b
$ do
Int
n <- (GLint -> Int) -> PName1I -> IO Int
forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral PName1I
GetNumShaderBinaryFormats
(GLenum -> ShaderBinaryFormat)
-> PNameNI -> Int -> GettableStateVar [ShaderBinaryFormat]
forall p a. GetPNameNI p => (GLenum -> a) -> p -> Int -> IO [a]
getEnumN GLenum -> ShaderBinaryFormat
ShaderBinaryFormat PNameNI
GetShaderBinaryFormats Int
n
data ShaderBinary = ShaderBinary ShaderBinaryFormat ByteString
deriving ( ShaderBinary -> ShaderBinary -> Bool
(ShaderBinary -> ShaderBinary -> Bool)
-> (ShaderBinary -> ShaderBinary -> Bool) -> Eq ShaderBinary
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ShaderBinary -> ShaderBinary -> Bool
$c/= :: ShaderBinary -> ShaderBinary -> Bool
== :: ShaderBinary -> ShaderBinary -> Bool
$c== :: ShaderBinary -> ShaderBinary -> Bool
Eq, Eq ShaderBinary
Eq ShaderBinary =>
(ShaderBinary -> ShaderBinary -> Ordering)
-> (ShaderBinary -> ShaderBinary -> Bool)
-> (ShaderBinary -> ShaderBinary -> Bool)
-> (ShaderBinary -> ShaderBinary -> Bool)
-> (ShaderBinary -> ShaderBinary -> Bool)
-> (ShaderBinary -> ShaderBinary -> ShaderBinary)
-> (ShaderBinary -> ShaderBinary -> ShaderBinary)
-> Ord ShaderBinary
ShaderBinary -> ShaderBinary -> Bool
ShaderBinary -> ShaderBinary -> Ordering
ShaderBinary -> ShaderBinary -> ShaderBinary
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ShaderBinary -> ShaderBinary -> ShaderBinary
$cmin :: ShaderBinary -> ShaderBinary -> ShaderBinary
max :: ShaderBinary -> ShaderBinary -> ShaderBinary
$cmax :: ShaderBinary -> ShaderBinary -> ShaderBinary
>= :: ShaderBinary -> ShaderBinary -> Bool
$c>= :: ShaderBinary -> ShaderBinary -> Bool
> :: ShaderBinary -> ShaderBinary -> Bool
$c> :: ShaderBinary -> ShaderBinary -> Bool
<= :: ShaderBinary -> ShaderBinary -> Bool
$c<= :: ShaderBinary -> ShaderBinary -> Bool
< :: ShaderBinary -> ShaderBinary -> Bool
$c< :: ShaderBinary -> ShaderBinary -> Bool
compare :: ShaderBinary -> ShaderBinary -> Ordering
$ccompare :: ShaderBinary -> ShaderBinary -> Ordering
$cp1Ord :: Eq ShaderBinary
Ord, Int -> ShaderBinary -> ShowS
[ShaderBinary] -> ShowS
ShaderBinary -> String
(Int -> ShaderBinary -> ShowS)
-> (ShaderBinary -> String)
-> ([ShaderBinary] -> ShowS)
-> Show ShaderBinary
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ShaderBinary] -> ShowS
$cshowList :: [ShaderBinary] -> ShowS
show :: ShaderBinary -> String
$cshow :: ShaderBinary -> String
showsPrec :: Int -> ShaderBinary -> ShowS
$cshowsPrec :: Int -> ShaderBinary -> ShowS
Show )
shaderBinary :: [Shader] -> SettableStateVar ShaderBinary
shaderBinary :: [Shader] -> SettableStateVar ShaderBinary
shaderBinary shaders :: [Shader]
shaders =
(ShaderBinary -> IO ()) -> SettableStateVar ShaderBinary
forall a. (a -> IO ()) -> SettableStateVar a
makeSettableStateVar ((ShaderBinary -> IO ()) -> SettableStateVar ShaderBinary)
-> (ShaderBinary -> IO ()) -> SettableStateVar ShaderBinary
forall a b. (a -> b) -> a -> b
$ \(ShaderBinary (ShaderBinaryFormat format :: GLenum
format) bs :: ByteString
bs) ->
[GLenum] -> (Int -> Ptr GLenum -> IO ()) -> IO ()
forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen ((Shader -> GLenum) -> [Shader] -> [GLenum]
forall a b. (a -> b) -> [a] -> [b]
map Shader -> GLenum
shaderID [Shader]
shaders) ((Int -> Ptr GLenum -> IO ()) -> IO ())
-> (Int -> Ptr GLenum -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \numShaders :: Int
numShaders shadersBuf :: Ptr GLenum
shadersBuf ->
ByteString -> (Ptr GLchar -> GLint -> IO ()) -> IO ()
forall b. ByteString -> (Ptr GLchar -> GLint -> IO b) -> IO b
withByteString ByteString
bs ((Ptr GLchar -> GLint -> IO ()) -> IO ())
-> (Ptr GLchar -> GLint -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
GLint -> Ptr GLenum -> GLenum -> Ptr GLchar -> GLint -> IO ()
forall (m :: * -> *) a.
MonadIO m =>
GLint -> Ptr GLenum -> GLenum -> Ptr a -> GLint -> m ()
glShaderBinary (Int -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
numShaders) Ptr GLenum
shadersBuf GLenum
format