packages feed

dear-imgui-impl-sdlgpu3-1.0.0: src/DearImGui/Impl/SDLGPU3.hs

module DearImGui.Impl.SDLGPU3
  ( InitArgs (..)
  , init
  , withInit
  , prepareDrawData
  , renderDrawData
  , Raw.ImGui_ImplSDLGPU3_RenderState (..)
  , Raw.getRenderState
  , Raw.createDeviceObjects
  , Raw.destroyDeviceObjects
  , Raw.newFrame
  , Raw.shutdown
  , Raw.updateTexture
  ) where

import Prelude hiding (init)

import Control.Monad.IO.Unlift (MonadUnliftIO)
import Data.Coerce (coerce)
import Foreign.Marshal.Utils (toBool, with)
import Foreign.Ptr (Ptr, castPtr)
import SDL3.Sys qualified as SDL3

import DearImGui.Impl.Init (withInitOrFail)
import DearImGui.Raw.ImDrawData (ImDrawData)
import DearImGui.Raw.Impl.SDLGPU3 (ImGui_ImplSDLGPU3_InitInfo (..))
import DearImGui.Raw.Impl.SDLGPU3 qualified as Raw

data InitArgs = InitArgs
  { device :: Ptr SDL3.SDL_GPUDevice
  , colorTargetFormat :: SDL3.SDL_GPUTextureFormat
  , msaaSamples :: SDL3.SDL_GPUSampleCount
  , swapchainComposition :: SDL3.SDL_GPUSwapchainComposition
  , presentMode :: SDL3.SDL_GPUPresentMode
  }

init :: InitArgs -> IO Bool
init args =
  toBool <$> with (initInfo args) Raw.init

withInit :: (MonadUnliftIO m) => InitArgs -> m a -> m a
withInit args = withInitOrFail "ImGui_ImplSDLGPU3_Init" (init args) Raw.shutdown

prepareDrawData :: Ptr ImDrawData -> Ptr SDL3.SDL_GPUCommandBuffer -> IO ()
prepareDrawData drawData commandBuffer =
  Raw.prepareDrawData drawData (castPtr commandBuffer)

renderDrawData
  :: Ptr ImDrawData
  -> Ptr SDL3.SDL_GPUCommandBuffer
  -> Ptr SDL3.SDL_GPURenderPass
  -> Ptr SDL3.SDL_GPUGraphicsPipeline
  -> IO ()
renderDrawData drawData commandBuffer renderPass pipeline =
  Raw.renderDrawData drawData (castPtr commandBuffer) (castPtr renderPass) (castPtr pipeline)

initInfo :: InitArgs -> ImGui_ImplSDLGPU3_InitInfo
initInfo args =
  ImGui_ImplSDLGPU3_InitInfo
    { device = castPtr args.device
    , colorTargetFormat = coerce args.colorTargetFormat
    , mSAASamples = coerce args.msaaSamples
    , swapchainComposition = coerce args.swapchainComposition
    , presentMode = coerce args.presentMode
    }