module Data.SpirV.Reflect.FFI ( Module , load , loadBytes ) where import Control.Exception (finally) import Control.Monad.IO.Class (MonadIO(..)) import Data.ByteString (ByteString) import Data.ByteString qualified as ByteString import Data.ByteString.Unsafe (unsafeUseAsCStringLen) import Data.SpirV.Reflect.FFI.Internal qualified as C import Foreign (allocaBytes, castPtr) import Data.SpirV.Reflect.Module (Module) load :: MonadIO io => FilePath -> io Module load path = liftIO $ ByteString.readFile path >>= loadBytes loadBytes :: MonadIO io => ByteString -> io Module loadBytes bytes = liftIO do unsafeUseAsCStringLen bytes \(code, size) -> do allocaBytes C.shaderModuleSize \smPtr -> do res <- C.createShaderModule2 C.SpvReflectModuleFlagNoCopy (fromIntegral size) (castPtr code) smPtr case res of C.SpvReflectResultSuccess -> C.inflateModule smPtr `finally` C.destroyShaderModule smPtr err -> error $ "spvReflectCreateShaderModule2:" <> show err