{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- |
module WGPU.Raw.Types where

import Data.Word (Word32)
import Foreign (FunPtr, Ptr, Storable)
import Foreign.C.Types (CChar)
import WGPU.Raw.Generated.Enum.WGPUBufferMapAsyncStatus
import WGPU.Raw.Generated.Enum.WGPUCreatePipelineAsyncStatus
import WGPU.Raw.Generated.Enum.WGPUErrorType
import WGPU.Raw.Generated.Enum.WGPULogLevel
import WGPU.Raw.Generated.Enum.WGPUQueueWorkDoneStatus
import WGPU.Raw.Generated.Enum.WGPUTextureFormat

-------------------------------------------------------------------------------
-- Opaque pointers

newtype WGPUAdapter = WGPUAdapter (Ptr ())
  deriving (Storable)

newtype WGPUBindGroup = WGPUBindGroup (Ptr ())
  deriving (Storable)

newtype WGPUBindGroupLayout = WGPUBindGroupLayout (Ptr ())
  deriving (Storable)

newtype WGPUBuffer = WGPUBuffer (Ptr ())
  deriving (Storable)

newtype WGPUCommandBuffer = WGPUCommandBuffer (Ptr ())
  deriving (Storable)

newtype WGPUCommandEncoder = WGPUCommandEncoder (Ptr ())
  deriving (Storable)

newtype WGPUComputePassEncoder = WGPUComputePassEncoder (Ptr ())
  deriving (Storable)

newtype WGPUComputePipeline = WGPUComputePipeline (Ptr ())
  deriving (Storable)

newtype WGPUDevice = WGPUDevice (Ptr ())
  deriving (Storable)

newtype WGPUInstance = WGPUInstance (Ptr ())
  deriving (Storable)

newtype WGPUPipelineLayout = WGPUPipelineLayout (Ptr ())
  deriving (Storable)

newtype WGPUQuerySet = WGPUQuerySet (Ptr ())
  deriving (Storable)

newtype WGPUQueue = WGPUQueue (Ptr ())
  deriving (Storable)

newtype WGPURenderBundle = WGPURenderBundle (Ptr ())
  deriving (Storable)

newtype WGPURenderBundleEncoder = WGPURenderBundleEncoder (Ptr ())
  deriving (Storable)

newtype WGPURenderPassEncoder = WGPURenderPassEncoder (Ptr ())
  deriving (Storable)

newtype WGPURenderPipeline = WGPURenderPipeline (Ptr ())
  deriving (Storable)

newtype WGPUSampler = WGPUSampler (Ptr ())
  deriving (Storable)

newtype WGPUShaderModule = WGPUShaderModule (Ptr ())
  deriving (Storable)

newtype WGPUSurface = WGPUSurface (Ptr ())
  deriving (Storable)

newtype WGPUSwapChain = WGPUSwapChain (Ptr ())
  deriving (Storable)

newtype WGPUTexture = WGPUTexture (Ptr ())
  deriving (Storable)

newtype WGPUTextureView = WGPUTextureView (Ptr ())
  deriving (Storable)

-------------------------------------------------------------------------------
-- Extra type aliases

type WGPUFlags = Word32

type WGPUBufferUsageFlags = WGPUFlags

type WGPUColorWriteMaskFlags = WGPUFlags

type WGPUMapModeFlags = WGPUFlags

type WGPUShaderStageFlags = WGPUFlags

type WGPUTextureUsageFlags = WGPUFlags

-------------------------------------------------------------------------------
-- Function pointers from webgpu.h

type WGPUProc = FunPtr (IO ())

type WGPURequestDeviceCallback =
  FunPtr
    ( WGPUDevice ->
      Ptr () ->
      IO ()
    )

type WGPUBufferMapCallback =
  FunPtr
    ( WGPUBufferMapAsyncStatus ->
      Ptr () ->
      IO ()
    )

type WGPUCreateComputePipelineAsyncCallback =
  FunPtr
    ( WGPUCreatePipelineAsyncStatus ->
      WGPUComputePipeline ->
      Ptr CChar ->
      Ptr () ->
      IO ()
    )

type WGPUCreateRenderPipelineAsyncCallback =
  FunPtr
    ( WGPUCreatePipelineAsyncStatus ->
      WGPURenderPipeline ->
      Ptr CChar ->
      Ptr () ->
      IO ()
    )

type WGPUDeviceLostCallback =
  FunPtr
    ( Ptr CChar ->
      Ptr () ->
      IO ()
    )

type WGPUErrorCallback =
  FunPtr
    ( WGPUErrorType ->
      Ptr CChar ->
      Ptr () ->
      IO ()
    )

type WGPURequestAdapterCallback =
  FunPtr
    ( WGPUAdapter ->
      Ptr () ->
      IO ()
    )

type WGPUQueueWorkDoneCallback =
  FunPtr
    ( WGPUQueueWorkDoneStatus ->
      Ptr () ->
      IO ()
    )

type WGPUSurfaceGetPreferredFormatCallback =
  FunPtr
    ( WGPUTextureFormat ->
      Ptr () ->
      IO ()
    )

-------------------------------------------------------------------------------
-- Function pointers from wgpu.h

type WGPULogCallback =
  FunPtr
    ( WGPULogLevel ->
      Ptr CChar ->
      IO ()
    )