lambdacube-engine-0.2.1: Graphics/LambdaCube/RenderSystem/GL/OcclusionQuery.hs
module Graphics.LambdaCube.RenderSystem.GL.OcclusionQuery where
import Foreign
import Graphics.Rendering.OpenGL.Raw.Core31
import Graphics.LambdaCube.HardwareOcclusionQuery
data GLOcclusionQuery
= GLOcclusionQuery
{ gloqQueryObject :: GLuint
}
instance HardwareOcclusionQuery GLOcclusionQuery where
beginOcclusionQuery = glBeginOcclusionQuery
endOcclusionQuery = glEndOcclusionQuery
pullOcclusionQuery = glPullOcclusionQuery
isStillOutstanding = glStillOutstanding
mkGLOcclusionQuery :: IO GLOcclusionQuery
mkGLOcclusionQuery = do
q <- alloca $ \buf -> glGenQueries 1 buf >> peek buf
return $ GLOcclusionQuery q
rmGLOcclusionQuery :: GLOcclusionQuery -> IO ()
rmGLOcclusionQuery o = case gloqQueryObject o of
0 -> return ()
b -> with b $ \buf -> glDeleteQueries 1 buf
glBeginOcclusionQuery :: GLOcclusionQuery -> IO ()
glBeginOcclusionQuery o = glBeginQuery gl_SAMPLES_PASSED $ gloqQueryObject o
glEndOcclusionQuery :: GLOcclusionQuery -> IO ()
glEndOcclusionQuery _ = glEndQuery gl_SAMPLES_PASSED
glPullOcclusionQuery :: GLOcclusionQuery -> IO Int
glPullOcclusionQuery o = do
n <- alloca $ \buf -> glGetQueryObjectuiv (gloqQueryObject o) gl_QUERY_RESULT buf >> peek buf
return $ fromIntegral n
glStillOutstanding :: GLOcclusionQuery -> IO Bool
glStillOutstanding o = do
b <- alloca $ \buf -> glGetQueryObjectuiv (gloqQueryObject o) gl_QUERY_RESULT_AVAILABLE buf >> peek buf
return $ b == fromIntegral gl_FALSE