module Resource.Vulkan.Named
  ( object
  , objectOrigin
  ) where

import RIO

import GHC.Stack (callStack, getCallStack, srcLocModule, withFrozenCallStack)
import RIO.List qualified as List
import Vulkan.Core10 qualified as Vk
import Vulkan.Utils.Debug qualified as Debug

import Engine.Vulkan.Types (MonadVulkan, getDevice)

object
  :: ( MonadVulkan env m
    , Vk.HasObjectType a
    )
  => a
  -> Text
  -> m ()
object :: forall env (m :: * -> *) a.
(MonadVulkan env m, HasObjectType a) =>
a -> Text -> m ()
object a
o Text
name = do
  Device
device <- forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks forall a. HasVulkan a => a -> Device
getDevice
  forall a (m :: * -> *).
(HasObjectType a, MonadIO m) =>
Device -> a -> ByteString -> m ()
Debug.nameObject Device
device a
o forall a b. (a -> b) -> a -> b
$
    Text -> ByteString
encodeUtf8 Text
name

objectOrigin
  :: ( MonadVulkan env m
    , Vk.HasObjectType a
    , HasCallStack
    )
  => a
  -> m ()
objectOrigin :: forall env (m :: * -> *) a.
(MonadVulkan env m, HasObjectType a, HasCallStack) =>
a -> m ()
objectOrigin a
o =
  forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack forall a b. (a -> b) -> a -> b
$
    forall env (m :: * -> *) a.
(MonadVulkan env m, HasObjectType a) =>
a -> Text -> m ()
object a
o forall a b. (a -> b) -> a -> b
$
      forall a. IsString a => [Char] -> a
fromString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [[a]] -> [a]
List.intercalate [Char]
"|" forall a b. (a -> b) -> a -> b
$
        forall a b. (a -> b) -> [a] -> [b]
map (SrcLoc -> [Char]
srcLocModule forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd) (CallStack -> [([Char], SrcLoc)]
getCallStack HasCallStack => CallStack
callStack)