module Graphics.GPipe.Internal.Debug where

import           Control.Monad      (when)
import           Data.List          (intercalate)
import           Data.Maybe         (fromMaybe)
import qualified Debug.Trace        as Trace
import           Graphics.GL.Core45
import           Graphics.GL.Types  (GLenum)

traceIt :: Show a => String -> a -> a
traceIt :: String -> a -> a
traceIt String
t a
a = String -> a -> a
forall a. String -> a -> a
Trace.trace (String
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a) a
a

traceList :: Show a => String -> [a] -> [a]
traceList :: String -> [a] -> [a]
traceList String
t [a]
as = String -> [a] -> [a]
forall a. String -> a -> a
Trace.trace (String
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = [\n\t" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n\t" ((a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map a -> String
forall a. Show a => a -> String
show [a]
as) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n]") [a]
as

checkGlError :: String -> IO ()
checkGlError :: String -> IO ()
checkGlError String
title = do
    GLenum
e <- IO GLenum
forall (m :: * -> *). MonadIO m => m GLenum
glGetError
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (GLenum
e GLenum -> GLenum -> Bool
forall a. Eq a => a -> a -> Bool
/= GLenum
forall a. (Eq a, Num a) => a
GL_NO_ERROR) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
        String -> IO ()
forall a. HasCallStack => String -> a
error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
title String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"] GL error -> " String -> String -> String
forall a. [a] -> [a] -> [a]
++ GLenum -> String
getErrorMessage GLenum
e

getErrorMessage :: GLenum -> String
getErrorMessage :: GLenum -> String
getErrorMessage GLenum
errorCode = String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe (String
"Unknown error code " String -> String -> String
forall a. [a] -> [a] -> [a]
++ GLenum -> String
forall a. Show a => a -> String
show GLenum
errorCode) (Maybe String -> String) -> Maybe String -> String
forall a b. (a -> b) -> a -> b
$ GLenum -> [(GLenum, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup GLenum
errorCode
    [ (GLenum
forall a. (Eq a, Num a) => a
GL_NO_ERROR, String
"GL_NO_ERROR")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_INVALID_ENUM, String
"GL_INVALID_ENUM")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_INVALID_VALUE, String
"GL_INVALID_VALUE")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_INVALID_OPERATION, String
"GL_INVALID_OPERATION")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_STACK_OVERFLOW, String
"GL_STACK_OVERFLOW")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_STACK_UNDERFLOW, String
"GL_STACK_UNDERFLOW")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_OUT_OF_MEMORY, String
"GL_OUT_OF_MEMORY")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_INVALID_FRAMEBUFFER_OPERATION, String
"GL_INVALID_FRAMEBUFFER_OPERATION")
    , (GLenum
forall a. (Eq a, Num a) => a
GL_CONTEXT_LOST, String
"GL_CONTEXT_LOST")
    ]