summaryrefslogtreecommitdiff
path: root/src/LambdaCube/GL/Util.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/LambdaCube/GL/Util.hs')
-rw-r--r--src/LambdaCube/GL/Util.hs67
1 files changed, 52 insertions, 15 deletions
diff --git a/src/LambdaCube/GL/Util.hs b/src/LambdaCube/GL/Util.hs
index c5c6608..ab8350f 100644
--- a/src/LambdaCube/GL/Util.hs
+++ b/src/LambdaCube/GL/Util.hs
@@ -1,3 +1,4 @@
1{-# LANGUAGE RecordWildCards #-}
1module LambdaCube.GL.Util ( 2module LambdaCube.GL.Util (
2 queryUniforms, 3 queryUniforms,
3 queryStreams, 4 queryStreams,
@@ -23,6 +24,7 @@ module LambdaCube.GL.Util (
23 glGetIntegerv1, 24 glGetIntegerv1,
24 setSampler, 25 setSampler,
25 checkFBO, 26 checkFBO,
27 compileSampler,
26 compileTexture, 28 compileTexture,
27 primitiveToFetchPrimitive, 29 primitiveToFetchPrimitive,
28 primitiveToGLType, 30 primitiveToGLType,
@@ -503,21 +505,48 @@ edgeModeToGLType a = case a of
503 ClampToEdge -> GL_CLAMP_TO_EDGE 505 ClampToEdge -> GL_CLAMP_TO_EDGE
504 ClampToBorder -> GL_CLAMP_TO_BORDER 506 ClampToBorder -> GL_CLAMP_TO_BORDER
505 507
508data ParameterSetup
509 = ParameterSetup
510 { setParameteri :: GLenum -> GLint -> IO ()
511 , setParameterfv :: GLenum -> Ptr GLfloat -> IO ()
512 , setParameterIiv :: GLenum -> Ptr GLint -> IO ()
513 , setParameterIuiv :: GLenum -> Ptr GLuint -> IO ()
514 , setParameterf :: GLenum -> GLfloat -> IO ()
515 }
516
506setTextureSamplerParameters :: GLenum -> SamplerDescriptor -> IO () 517setTextureSamplerParameters :: GLenum -> SamplerDescriptor -> IO ()
507setTextureSamplerParameters t s = do 518setTextureSamplerParameters target = setParameters $ ParameterSetup
508 glTexParameteri t GL_TEXTURE_WRAP_S $ fromIntegral $ edgeModeToGLType $ samplerWrapS s 519 { setParameteri = glTexParameteri target
520 , setParameterfv = glTexParameterfv target
521 , setParameterIiv = glTexParameterIiv target
522 , setParameterIuiv = glTexParameterIuiv target
523 , setParameterf = glTexParameterf target
524 }
525
526setSamplerParameters :: GLuint -> SamplerDescriptor -> IO ()
527setSamplerParameters samplerObj = setParameters $ ParameterSetup
528 { setParameteri = glSamplerParameteri samplerObj
529 , setParameterfv = glSamplerParameterfv samplerObj
530 , setParameterIiv = glSamplerParameterIiv samplerObj
531 , setParameterIuiv = glSamplerParameterIuiv samplerObj
532 , setParameterf = glSamplerParameterf samplerObj
533 }
534
535setParameters :: ParameterSetup -> SamplerDescriptor -> IO ()
536setParameters ParameterSetup{..} s = do
537 setParameteri GL_TEXTURE_WRAP_S $ fromIntegral $ edgeModeToGLType $ samplerWrapS s
509 case samplerWrapT s of 538 case samplerWrapT s of
510 Nothing -> return () 539 Nothing -> return ()
511 Just a -> glTexParameteri t GL_TEXTURE_WRAP_T $ fromIntegral $ edgeModeToGLType a 540 Just a -> setParameteri GL_TEXTURE_WRAP_T $ fromIntegral $ edgeModeToGLType a
512 case samplerWrapR s of 541 case samplerWrapR s of
513 Nothing -> return () 542 Nothing -> return ()
514 Just a -> glTexParameteri t GL_TEXTURE_WRAP_R $ fromIntegral $ edgeModeToGLType a 543 Just a -> setParameteri GL_TEXTURE_WRAP_R $ fromIntegral $ edgeModeToGLType a
515 glTexParameteri t GL_TEXTURE_MIN_FILTER $ fromIntegral $ filterToGLType $ samplerMinFilter s 544 setParameteri GL_TEXTURE_MIN_FILTER $ fromIntegral $ filterToGLType $ samplerMinFilter s
516 glTexParameteri t GL_TEXTURE_MAG_FILTER $ fromIntegral $ filterToGLType $ samplerMagFilter s 545 setParameteri GL_TEXTURE_MAG_FILTER $ fromIntegral $ filterToGLType $ samplerMagFilter s
517 546
518 let setBColorV4F a = with a $ \p -> glTexParameterfv t GL_TEXTURE_BORDER_COLOR $ castPtr p 547 let setBColorV4F a = with a $ \p -> setParameterfv GL_TEXTURE_BORDER_COLOR $ castPtr p
519 setBColorV4I a = with a $ \p -> glTexParameterIiv t GL_TEXTURE_BORDER_COLOR $ castPtr p 548 setBColorV4I a = with a $ \p -> setParameterIiv GL_TEXTURE_BORDER_COLOR $ castPtr p
520 setBColorV4U a = with a $ \p -> glTexParameterIuiv t GL_TEXTURE_BORDER_COLOR $ castPtr p 549 setBColorV4U a = with a $ \p -> setParameterIuiv GL_TEXTURE_BORDER_COLOR $ castPtr p
521 case samplerBorderColor s of 550 case samplerBorderColor s of
522 -- float, word, int, red, rg, rgb, rgba 551 -- float, word, int, red, rg, rgb, rgba
523 VFloat a -> setBColorV4F $ V4 a 0 0 0 552 VFloat a -> setBColorV4F $ V4 a 0 0 0
@@ -538,16 +567,24 @@ setTextureSamplerParameters t s = do
538 567
539 case samplerMinLod s of 568 case samplerMinLod s of
540 Nothing -> return () 569 Nothing -> return ()
541 Just a -> glTexParameterf t GL_TEXTURE_MIN_LOD $ realToFrac a 570 Just a -> setParameterf GL_TEXTURE_MIN_LOD $ realToFrac a
542 case samplerMaxLod s of 571 case samplerMaxLod s of
543 Nothing -> return () 572 Nothing -> return ()
544 Just a -> glTexParameterf t GL_TEXTURE_MAX_LOD $ realToFrac a 573 Just a -> setParameterf GL_TEXTURE_MAX_LOD $ realToFrac a
545 glTexParameterf t GL_TEXTURE_LOD_BIAS $ realToFrac $ samplerLodBias s 574 setParameterf GL_TEXTURE_LOD_BIAS $ realToFrac $ samplerLodBias s
546 case samplerCompareFunc s of 575 case samplerCompareFunc s of
547 Nothing -> glTexParameteri t GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_NONE 576 Nothing -> setParameteri GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_NONE
548 Just a -> do 577 Just a -> do
549 glTexParameteri t GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_COMPARE_REF_TO_TEXTURE 578 setParameteri GL_TEXTURE_COMPARE_MODE $ fromIntegral GL_COMPARE_REF_TO_TEXTURE
550 glTexParameteri t GL_TEXTURE_COMPARE_FUNC $ fromIntegral $ comparisonFunctionToGLType a 579 setParameteri GL_TEXTURE_COMPARE_FUNC $ fromIntegral $ comparisonFunctionToGLType a
580
581compileSampler :: SamplerDescriptor -> IO GLSampler
582compileSampler s = do
583 so <- alloca $! \po -> glGenSamplers 1 po >> peek po
584 setSamplerParameters so s
585 return $ GLSampler
586 { glSamplerObject = so
587 }
551 588
552compileTexture :: TextureDescriptor -> IO GLTexture 589compileTexture :: TextureDescriptor -> IO GLTexture
553compileTexture txDescriptor = do 590compileTexture txDescriptor = do