packages feed

mischief-render-0.1.0.0: src/Mischief/WGPU/Framework.hs

module Mischief.WGPU.Framework where

import Data.ByteString (ByteString)
import Data.ByteString qualified as BS
import Foreign (with)
import Foreign.C.ConstPtr (ConstPtr (ConstPtr))
import Foreign.Ptr
import Mischief.WGPU
import Mischief.WGPU.Opaque
import Mischief.WGPU.Types.Enums
import Mischief.WGPU.Types.General

loadShaderModule :: Ptr WGPUDevice -> String -> IO (Ptr WGPUShaderModule)
loadShaderModule device path = do
  bytes <- BS.readFile path
  loadShaderFromBytes device bytes

loadShaderFromBytes :: Ptr WGPUDevice -> ByteString -> IO (Ptr WGPUShaderModule)
loadShaderFromBytes device bytes = bsAsWGPUString bytes $ \shaderString -> do
  let shaderSource =
        WGPUShaderSourceWGSL
          { chain = WGPUChainedStruct {sType = wGPUSType_ShaderSourceWGSL, next = nullPtr},
            code = shaderString
          }

  with shaderSource $ \shaderSource -> do
    let desc =
          WGPUShaderModuleDescriptor
            { label = WGPUStringView {_data = ConstPtr nullPtr, length = 0},
              nextInChain = castPtr shaderSource
            }

    with desc $ \desc -> do
      wgpuDeviceCreateShaderModule device (ConstPtr desc)