easytensor-vulkan 2.0.0.0 → 2.0.1.0
raw patch · 2 files changed
+31/−84 lines, 2 filesdep ~easytensordep ~vulkan-apiPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: easytensor, vulkan-api
API changes (from Hackage documentation)
- Graphics.Vulkan.Marshal.Create.DataFrame: class VulkanDataFrame a (ds :: [k])
- Graphics.Vulkan.Marshal.Create.DataFrame: frameToVkData :: VulkanDataFrame a ds => DataFrame a ds -> VkDataFrame a ds
- Graphics.Vulkan.Marshal.Create.DataFrame: instance (Numeric.PrimBytes.PrimBytes a, Data.Type.List.All Numeric.Dimensions.Dim.KnownXNatType ds) => Graphics.Vulkan.Marshal.Create.DataFrame.VulkanDataFrame a ds
- Graphics.Vulkan.Marshal.Create.DataFrame: instance (Numeric.PrimBytes.PrimBytes a, Numeric.Dimensions.Dim.Dimensions ds) => Graphics.Vulkan.Marshal.Create.DataFrame.VulkanDataFrame a ds
- Graphics.Vulkan.Marshal.Create.DataFrame: instance Foreign.Storable.Storable (Graphics.Vulkan.Marshal.Internal.VulkanStruct a) => Numeric.PrimBytes.PrimBytes (Graphics.Vulkan.Marshal.Internal.VulkanStruct a)
- Graphics.Vulkan.Marshal.Create.DataFrame: instance forall k l (t :: l) (ds :: [k]). Numeric.PrimBytes.PrimBytes (Numeric.DataFrame.Type.DataFrame t ds) => Foreign.Storable.Storable (Graphics.Vulkan.Marshal.Create.DataFrame.VkDataFrame t ds)
- Graphics.Vulkan.Marshal.Create.DataFrame: instance forall k l (t :: l) (ds :: [k]). Numeric.PrimBytes.PrimBytes (Numeric.DataFrame.Type.DataFrame t ds) => Graphics.Vulkan.Marshal.VulkanMarshal (Graphics.Vulkan.Marshal.Create.DataFrame.VkDataFrame t ds)
- Graphics.Vulkan.Marshal.Create.DataFrame: type VkDataFrame (t :: l) (ds :: [k]) = VulkanStruct (DataFrame t ds)
- Graphics.Vulkan.Marshal.Create.DataFrame: vkDataToFrame :: VulkanDataFrame a ds => Dims ds -> VkDataFrame a ds -> DataFrame a ds
+ Graphics.Vulkan.Marshal.Create.DataFrame: instance Graphics.Vulkan.Marshal.Internal.VulkanMarshal (Graphics.Vulkan.Marshal.Internal.VkStruct a) => Numeric.PrimBytes.PrimBytes (Graphics.Vulkan.Marshal.Internal.VkStruct a)
- Graphics.Vulkan.Marshal.Create.DataFrame: getVec :: forall fname x t a. (FieldType fname x ~ t, PrimBytes t, KnownDim (FieldArrayLength fname x), CanReadFieldArray fname x, x ~ VulkanStruct a) => x -> Vector t (FieldArrayLength fname x)
+ Graphics.Vulkan.Marshal.Create.DataFrame: getVec :: forall fname x t. (FieldType fname x ~ t, PrimBytes t, KnownDim (FieldArrayLength fname x), CanReadFieldArray fname x) => x -> Vector t (FieldArrayLength fname x)
- Graphics.Vulkan.Marshal.Create.DataFrame: setDFRef :: forall fname x a ds. (CanWriteField fname x, FieldType fname x ~ Ptr a, VulkanDataFrame a ds) => DataFrame a ds -> CreateVkStruct x '[fname] ()
+ Graphics.Vulkan.Marshal.Create.DataFrame: setDFRef :: forall fname x a ds. (CanWriteField fname x, FieldType fname x ~ Ptr a, PrimBytes a, Dimensions ds) => DataFrame a ds -> CreateVkStruct x '[fname] ()
- Graphics.Vulkan.Marshal.Create.DataFrame: withDFPtr :: VulkanDataFrame a ds => DataFrame a ds -> (Ptr a -> IO b) -> IO b
+ Graphics.Vulkan.Marshal.Create.DataFrame: withDFPtr :: forall (a :: Type) (ds :: [Nat]) (b :: Type). (PrimBytes a, Dimensions ds) => DataFrame a ds -> (Ptr a -> IO b) -> IO b
Files
easytensor-vulkan.cabal view
@@ -1,13 +1,11 @@-cabal-version: 1.12---- This file has been generated from package.yaml by hpack version 0.31.1.+-- This file has been generated from package.yaml by hpack version 0.28.2. -- -- see: https://github.com/sol/hpack ----- hash: 18ec38832697f0f9a1c888134f69246d19b25aff81258412c304fdee023c00cd+-- hash: fad38f4115bfb3f47299af6dd0d8aa0d593b610be874be25248337e8de34b0d2 name: easytensor-vulkan-version: 2.0.0.0+version: 2.0.1.0 synopsis: Use easytensor with vulkan-api. description: Use easytensor DataFrame types with vulkan-api. This package provides an orphan instance of PrimBytes for Vulkan structures, so they can be used as elements of DataFrames. In addition, it provides a few helper functions for working with array-like structures. category: math, geometry, vulkan, bsd3, graphics, library, opengl@@ -19,6 +17,7 @@ license: BSD3 license-file: LICENSE build-type: Simple+cabal-version: >= 1.10 source-repository head type: git@@ -34,6 +33,6 @@ build-depends: base >=4.11 && <5 , dimensions >=2 && <3- , easytensor >=2 && <3- , vulkan-api >=1.2.0.0 && <2+ , easytensor >=2.0.1.0 && <3+ , vulkan-api >=1.3.0.0 && <2 default-language: Haskell2010
src/Graphics/Vulkan/Marshal/Create/DataFrame.hs view
@@ -25,8 +25,6 @@ module Graphics.Vulkan.Marshal.Create.DataFrame ( setVec, getVec , fillDataFrame, withDFPtr, setDFRef- -- * Helpers- , VulkanDataFrame (..), VkDataFrame ) where @@ -57,12 +55,11 @@ -- | Get an array of values, possibly without copying -- (if vector implementation allows).-getVec :: forall fname x t a+getVec :: forall fname x t . ( FieldType fname x ~ t , PrimBytes t , KnownDim (FieldArrayLength fname x) , CanReadFieldArray fname x- , x ~ VulkanStruct a ) => x -> Vector t (FieldArrayLength fname x) getVec x@@ -73,8 +70,8 @@ , Dict <- inferKnownBackend @t @'[FieldArrayLength fname x] = fromBytes (minusAddr# xaddr baddr +# off) ba -instance Storable (VulkanStruct a)=> PrimBytes (VulkanStruct a) where- type PrimFields (VulkanStruct a) = '[]+instance VulkanMarshal (VkStruct a) => PrimBytes (VkStruct a) where+ type PrimFields (VkStruct a) = '[] byteSize a = case sizeOf a of (I# s) -> s {-# INLINE byteSize #-} byteAlign a = case alignment a of (I# n) -> n@@ -86,18 +83,18 @@ {-# INLINE getBytes #-} fromBytes = unsafeFromByteArrayOffset {-# INLINE fromBytes #-}- readBytes mba off = unsafeCoerce# (newVkData# @a f)+ readBytes mba off = unsafeCoerce# (newVkData @(VkStruct a) f) where- f :: Ptr (VulkanStruct a) -> IO ()+ f :: Ptr (VkStruct a) -> IO () f (Ptr addr) = IO $ \s -> (# copyMutableByteArrayToAddr# (unsafeCoerce# mba)- off addr (byteSize @(VulkanStruct a) undefined) s+ off addr (byteSize @(VkStruct a) undefined) s , () #) writeBytes mba off a- = copyAddrToByteArray# (unsafeAddr a) mba off (byteSize @(VulkanStruct a) undefined)- readAddr addr = unsafeCoerce# (peekVkData# (Ptr addr) :: IO (VulkanStruct a))+ = copyAddrToByteArray# (unsafeAddr a) mba off (byteSize @(VkStruct a) undefined)+ readAddr addr = unsafeCoerce# (peek (Ptr addr) :: IO (VkStruct a)) writeAddr a addr s- = case unsafeCoerce# (pokeVkData# (Ptr addr) a :: IO ()) s of+ = case unsafeCoerce# (poke (Ptr addr) a :: IO ()) s of (# s', () #) -> s' byteFieldOffset _ _ = negateInt# 1# @@ -115,13 +112,15 @@ -- * If the original DF is based on unpinned `ByteArray#`, using this -- performs a copy anyway. ---withDFPtr :: VulkanDataFrame a ds+withDFPtr :: forall (a :: Type) (ds :: [Nat]) (b :: Type)+ . (PrimBytes a, Dimensions ds) => DataFrame a ds -> (Ptr a -> IO b) -> IO b withDFPtr x k- | d <- frameToVkData x = do- b <- k (Ptr (unsafeAddr d))- touchVkData# d- return b+ | Dict <- inferKnownBackend @a @ds+ , ba <- getBytesPinned x = do+ b <- k (Ptr (byteArrayContents# ba `plusAddr#` byteOffset x))+ IO $ \s -> (# touch# ba s, () #)+ return b -- | A variant of `setVkRef` that writes a pointer to a contiguous array of -- structures.@@ -135,16 +134,17 @@ setDFRef :: forall fname x a ds . ( CanWriteField fname x , FieldType fname x ~ Ptr a- , VulkanDataFrame a ds+ , PrimBytes a, Dimensions ds ) => DataFrame a ds -> CreateVkStruct x '[fname] ()-setDFRef v = unsafeCoerce# f -- workaround for the hidden CreateVkStruct constr.- where- d = frameToVkData v- f :: Ptr x -> IO ( ([Ptr ()],[IO ()]) , ())- f p = (,) ([],[touchVkData# d])- <$> writeField @fname @x p (Ptr (unsafeAddr d))-+setDFRef v+ | Dict <- inferKnownBackend @a @ds+ , ba <- getBytesPinned v+ , addr <- byteArrayContents# ba `plusAddr#` byteOffset v+ = let f :: Ptr x -> IO ( ([Ptr ()],[IO ()]) , ())+ f p = (,) ([],[IO $ \s -> (# touch# ba s, () #)])+ <$> writeField @fname @x p (Ptr addr)+ in unsafeCoerce# f -- workaround for the hidden CreateVkStruct constr. -- | Given the number of elements, create a new pinned DataFrame and initialize@@ -166,55 +166,3 @@ withDataFramePtr mdf k XFrame <$> unsafeFreezeDataFrame @a @'[n] mdf fillDataFrame _ _ = error "fillDataFrame: impossible combination of arguments."------- | Special data type used to provide @VulkanMarshal@ instance for DataFrames.--- It is guaranteed to be pinned.-type VkDataFrame (t :: l) (ds :: [k]) = VulkanStruct (DataFrame t ds)--instance PrimBytes (DataFrame t ds) => Storable (VkDataFrame t ds) where- sizeOf _ = I# (byteSize @(DataFrame t ds) undefined)- {-# INLINE sizeOf #-}- alignment _ = I# (byteAlign @(DataFrame t ds) undefined)- {-# INLINE alignment #-}- peek = peekVkData#- {-# INLINE peek #-}- poke = pokeVkData#- {-# INLINE poke #-}--instance PrimBytes (DataFrame t ds) => VulkanMarshal (VkDataFrame t ds) where- type StructFields (VkDataFrame t ds) = '[]- type CUnionType (VkDataFrame t ds) = 'False- type ReturnedOnly (VkDataFrame t ds) = 'False- type StructExtends (VkDataFrame t ds) = '[]---class VulkanDataFrame a (ds :: [k]) where- -- | Construct a new @VkDataFrame@ possibly without copying.- -- It performs no copy if the @DataFrame@ implementation is a pinned @ByteArray#@.- frameToVkData :: DataFrame a ds -> VkDataFrame a ds- -- | Construct a new (pinned if implementation allows) DataFrame from VK data,- -- possibly without copying.- --- -- Note, this is a user responsibility to check if the real size of @VkDataFrame@- -- and the dimensionality @ds@ agree.- vkDataToFrame :: Dims ds -> VkDataFrame a ds -> DataFrame a ds---instance (PrimBytes a, Dimensions ds)- => VulkanDataFrame a (ds :: [Nat]) where- frameToVkData x- | Dict <- inferKnownBackend @a @ds- = unsafeFromByteArrayOffset (byteOffset x) (getBytesPinned x)- vkDataToFrame _ (VulkanStruct addr ba)- | Dict <- inferKnownBackend @a @ds- = fromBytes (addr `minusAddr#` byteArrayContents# ba) ba--instance (PrimBytes a, All KnownXNatType ds)- => VulkanDataFrame a (ds :: [XNat]) where- frameToVkData (XFrame x) = unsafeCoerce# (frameToVkData x)- vkDataToFrame (XDims (ds :: Dims ns)) d- | Dict <- inferKnownBackend @a @ns- = XFrame (vkDataToFrame ds (unsafeCoerce# d))