-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
-- License     :  BSD3
--
-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
-- Stability   :  stable
-- Portability :  portable
--
-----------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects (
   RenderbufferObject,
   noRenderbufferObject,
   RenderbufferTarget(..),
   RenderbufferSize(..), Samples(..),

   bindRenderbuffer,

   renderbufferStorage, renderbufferStorageMultiSample,
) where

import Data.StateVar
import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
import Graphics.GL

-----------------------------------------------------------------------------

noRenderbufferObject :: RenderbufferObject
noRenderbufferObject :: RenderbufferObject
noRenderbufferObject = GLuint -> RenderbufferObject
RenderbufferObject GLuint
0

-----------------------------------------------------------------------------

data RenderbufferSize = RenderbufferSize !GLsizei !GLsizei
   deriving ( RenderbufferSize -> RenderbufferSize -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RenderbufferSize -> RenderbufferSize -> Bool
$c/= :: RenderbufferSize -> RenderbufferSize -> Bool
== :: RenderbufferSize -> RenderbufferSize -> Bool
$c== :: RenderbufferSize -> RenderbufferSize -> Bool
Eq, Eq RenderbufferSize
RenderbufferSize -> RenderbufferSize -> Bool
RenderbufferSize -> RenderbufferSize -> Ordering
RenderbufferSize -> RenderbufferSize -> RenderbufferSize
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 :: RenderbufferSize -> RenderbufferSize -> RenderbufferSize
$cmin :: RenderbufferSize -> RenderbufferSize -> RenderbufferSize
max :: RenderbufferSize -> RenderbufferSize -> RenderbufferSize
$cmax :: RenderbufferSize -> RenderbufferSize -> RenderbufferSize
>= :: RenderbufferSize -> RenderbufferSize -> Bool
$c>= :: RenderbufferSize -> RenderbufferSize -> Bool
> :: RenderbufferSize -> RenderbufferSize -> Bool
$c> :: RenderbufferSize -> RenderbufferSize -> Bool
<= :: RenderbufferSize -> RenderbufferSize -> Bool
$c<= :: RenderbufferSize -> RenderbufferSize -> Bool
< :: RenderbufferSize -> RenderbufferSize -> Bool
$c< :: RenderbufferSize -> RenderbufferSize -> Bool
compare :: RenderbufferSize -> RenderbufferSize -> Ordering
$ccompare :: RenderbufferSize -> RenderbufferSize -> Ordering
Ord, Int -> RenderbufferSize -> ShowS
[RenderbufferSize] -> ShowS
RenderbufferSize -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RenderbufferSize] -> ShowS
$cshowList :: [RenderbufferSize] -> ShowS
show :: RenderbufferSize -> String
$cshow :: RenderbufferSize -> String
showsPrec :: Int -> RenderbufferSize -> ShowS
$cshowsPrec :: Int -> RenderbufferSize -> ShowS
Show )

-----------------------------------------------------------------------------

bindRenderbuffer :: RenderbufferTarget -> StateVar RenderbufferObject
bindRenderbuffer :: RenderbufferTarget -> StateVar RenderbufferObject
bindRenderbuffer RenderbufferTarget
rbt =
    forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar (RenderbufferTarget -> IO RenderbufferObject
getBoundRenderbuffer RenderbufferTarget
rbt) (RenderbufferTarget -> RenderbufferObject -> IO ()
setRenderbuffer RenderbufferTarget
rbt)

marshalRenderbufferTargetBinding :: RenderbufferTarget -> PName1I
marshalRenderbufferTargetBinding :: RenderbufferTarget -> PName1I
marshalRenderbufferTargetBinding RenderbufferTarget
x = case RenderbufferTarget
x of
    RenderbufferTarget
Renderbuffer -> PName1I
GetRenderbufferBinding

getBoundRenderbuffer :: RenderbufferTarget -> IO RenderbufferObject
getBoundRenderbuffer :: RenderbufferTarget -> IO RenderbufferObject
getBoundRenderbuffer =
   forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 (GLuint -> RenderbufferObject
RenderbufferObject forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) forall b c a. (b -> c) -> (a -> b) -> a -> c
. RenderbufferTarget -> PName1I
marshalRenderbufferTargetBinding

setRenderbuffer :: RenderbufferTarget -> RenderbufferObject -> IO ()
setRenderbuffer :: RenderbufferTarget -> RenderbufferObject -> IO ()
setRenderbuffer RenderbufferTarget
rbt = forall (m :: * -> *). MonadIO m => GLuint -> GLuint -> m ()
glBindRenderbuffer (RenderbufferTarget -> GLuint
marshalRenderbufferTarget RenderbufferTarget
rbt)
   forall b c a. (b -> c) -> (a -> b) -> a -> c
. RenderbufferObject -> GLuint
renderbufferID

-----------------------------------------------------------------------------

renderbufferStorageMultiSample :: RenderbufferTarget -> Samples
   -> PixelInternalFormat -> RenderbufferSize -> IO ()
renderbufferStorageMultiSample :: RenderbufferTarget
-> Samples -> PixelInternalFormat -> RenderbufferSize -> IO ()
renderbufferStorageMultiSample RenderbufferTarget
rbt (Samples GLint
s) PixelInternalFormat
pif (RenderbufferSize GLint
w GLint
h) =
   forall (m :: * -> *).
MonadIO m =>
GLuint -> GLint -> GLuint -> GLint -> GLint -> m ()
glRenderbufferStorageMultisample (RenderbufferTarget -> GLuint
marshalRenderbufferTarget RenderbufferTarget
rbt) GLint
s
       (PixelInternalFormat -> GLuint
marshalPixelInternalFormat' PixelInternalFormat
pif) GLint
w GLint
h


renderbufferStorage :: RenderbufferTarget -> PixelInternalFormat
   -> RenderbufferSize -> IO ()
renderbufferStorage :: RenderbufferTarget
-> PixelInternalFormat -> RenderbufferSize -> IO ()
renderbufferStorage RenderbufferTarget
rbt PixelInternalFormat
pif (RenderbufferSize GLint
w GLint
h) =
    forall (m :: * -> *).
MonadIO m =>
GLuint -> GLuint -> GLint -> GLint -> m ()
glRenderbufferStorage (RenderbufferTarget -> GLuint
marshalRenderbufferTarget RenderbufferTarget
rbt)
       (PixelInternalFormat -> GLuint
marshalPixelInternalFormat' PixelInternalFormat
pif) GLint
w GLint
h