{-# language CPP #-} -- No documentation found for Chapter "Image" module Vulkan.Core10.Image ( createImage , withImage , destroyImage , getImageSubresourceLayout , ImageCreateInfo(..) , SubresourceLayout(..) , Image(..) , ImageLayout(..) ) where import Vulkan.Internal.Utils (traceAroundEvent) import Control.Exception.Base (bracket) import Control.Monad (unless) import Control.Monad.IO.Class (liftIO) import Data.Typeable (eqT) import Foreign.Marshal.Alloc (allocaBytesAligned) import Foreign.Marshal.Alloc (callocBytes) import Foreign.Marshal.Alloc (free) import GHC.Base (when) import GHC.IO (throwIO) import GHC.Ptr (castPtr) import GHC.Ptr (nullFunPtr) import Foreign.Ptr (nullPtr) import Foreign.Ptr (plusPtr) import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Cont (evalContT) import Data.Vector (generateM) import qualified Data.Vector (imapM_) import qualified Data.Vector (length) import Vulkan.CStruct (FromCStruct) import Vulkan.CStruct (FromCStruct(..)) import Vulkan.CStruct (ToCStruct) import Vulkan.CStruct (ToCStruct(..)) import Vulkan.Zero (Zero(..)) import Control.Monad.IO.Class (MonadIO) import Data.Type.Equality ((:~:)(Refl)) import Data.Typeable (Typeable) import Foreign.Storable (Storable) import Foreign.Storable (Storable(peek)) import Foreign.Storable (Storable(poke)) import qualified Foreign.Storable (Storable(..)) import GHC.Generics (Generic) import GHC.IO.Exception (IOErrorType(..)) import GHC.IO.Exception (IOException(..)) import Foreign.Ptr (FunPtr) import Foreign.Ptr (Ptr) import Data.Word (Word32) import Data.Kind (Type) import Control.Monad.Trans.Cont (ContT(..)) import Data.Vector (Vector) import Vulkan.CStruct.Utils (advancePtrBytes) import Vulkan.CStruct.Extends (forgetExtensions) import Vulkan.NamedType ((:::)) import Vulkan.Core10.AllocationCallbacks (AllocationCallbacks) import Vulkan.CStruct.Extends (Chain) import {-# SOURCE #-} Vulkan.Extensions.VK_NV_dedicated_allocation (DedicatedAllocationImageCreateInfoNV) import Vulkan.Core10.Handles (Device) import Vulkan.Core10.Handles (Device(..)) import Vulkan.Dynamic (DeviceCmds(pVkCreateImage)) import Vulkan.Dynamic (DeviceCmds(pVkDestroyImage)) import Vulkan.Dynamic (DeviceCmds(pVkGetImageSubresourceLayout)) import Vulkan.Core10.FundamentalTypes (DeviceSize) import Vulkan.Core10.Handles (Device_T) import Vulkan.CStruct.Extends (Extends) import Vulkan.CStruct.Extends (Extendss) import Vulkan.CStruct.Extends (Extensible(..)) import Vulkan.Core10.FundamentalTypes (Extent3D) import {-# SOURCE #-} Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer (ExternalFormatANDROID) import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_external_memory (ExternalMemoryImageCreateInfo) import {-# SOURCE #-} Vulkan.Extensions.VK_NV_external_memory (ExternalMemoryImageCreateInfoNV) import Vulkan.Core10.Enums.Format (Format) import Vulkan.Core10.Handles (Image) import Vulkan.Core10.Handles (Image(..)) import Vulkan.Core10.Enums.ImageCreateFlagBits (ImageCreateFlags) import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_image_drm_format_modifier (ImageDrmFormatModifierExplicitCreateInfoEXT) import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_image_drm_format_modifier (ImageDrmFormatModifierListCreateInfoEXT) import {-# SOURCE #-} Vulkan.Core12.Promoted_From_VK_KHR_image_format_list (ImageFormatListCreateInfo) import Vulkan.Core10.Enums.ImageLayout (ImageLayout) import {-# SOURCE #-} Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage (ImageStencilUsageCreateInfo) import Vulkan.Core10.SparseResourceMemoryManagement (ImageSubresource) import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_swapchain (ImageSwapchainCreateInfoKHR) import Vulkan.Core10.Enums.ImageTiling (ImageTiling) import Vulkan.Core10.Enums.ImageType (ImageType) import Vulkan.Core10.Enums.ImageUsageFlagBits (ImageUsageFlags) import Vulkan.CStruct.Extends (PeekChain) import Vulkan.CStruct.Extends (PeekChain(..)) import Vulkan.CStruct.Extends (PokeChain) import Vulkan.CStruct.Extends (PokeChain(..)) import Vulkan.Core10.Enums.Result (Result) import Vulkan.Core10.Enums.Result (Result(..)) import Vulkan.Core10.Enums.SampleCountFlagBits (SampleCountFlagBits) import Vulkan.Core10.Enums.SharingMode (SharingMode) import Vulkan.CStruct.Extends (SomeStruct) import Vulkan.Core10.Enums.StructureType (StructureType) import Vulkan.Exception (VulkanException(..)) import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_IMAGE_CREATE_INFO)) import Vulkan.Core10.Enums.Result (Result(SUCCESS)) import Vulkan.Core10.Handles (Image(..)) import Vulkan.Core10.Enums.ImageLayout (ImageLayout(..)) foreign import ccall #if !defined(SAFE_FOREIGN_CALLS) unsafe #endif "dynamic" mkVkCreateImage :: FunPtr (Ptr Device_T -> Ptr (SomeStruct ImageCreateInfo) -> Ptr AllocationCallbacks -> Ptr Image -> IO Result) -> Ptr Device_T -> Ptr (SomeStruct ImageCreateInfo) -> Ptr AllocationCallbacks -> Ptr Image -> IO Result -- | vkCreateImage - Create a new image object -- -- == Valid Usage -- -- - #VUID-vkCreateImage-flags-00939# If the @flags@ member of -- @pCreateInfo@ includes -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_BINDING_BIT', -- creating this 'Vulkan.Core10.Handles.Image' /must/ not cause the -- total required sparse memory for all currently valid sparse -- resources on the device to exceed -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@sparseAddressSpaceSize@ -- -- == Valid Usage (Implicit) -- -- - #VUID-vkCreateImage-device-parameter# @device@ /must/ be a valid -- 'Vulkan.Core10.Handles.Device' handle -- -- - #VUID-vkCreateImage-pCreateInfo-parameter# @pCreateInfo@ /must/ be a -- valid pointer to a valid 'ImageCreateInfo' structure -- -- - #VUID-vkCreateImage-pAllocator-parameter# If @pAllocator@ is not -- @NULL@, @pAllocator@ /must/ be a valid pointer to a valid -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' structure -- -- - #VUID-vkCreateImage-pImage-parameter# @pImage@ /must/ be a valid -- pointer to a 'Vulkan.Core10.Handles.Image' handle -- -- == Return Codes -- -- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>] -- -- - 'Vulkan.Core10.Enums.Result.SUCCESS' -- -- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>] -- -- - 'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY' -- -- - 'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY' -- -- = See Also -- -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks', -- 'Vulkan.Core10.Handles.Device', 'Vulkan.Core10.Handles.Image', -- 'ImageCreateInfo' createImage :: forall a io . (Extendss ImageCreateInfo a, PokeChain a, MonadIO io) => -- | @device@ is the logical device that creates the image. Device -> -- | @pCreateInfo@ is a pointer to a 'ImageCreateInfo' structure containing -- parameters to be used to create the image. (ImageCreateInfo a) -> -- | @pAllocator@ controls host memory allocation as described in the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#memory-allocation Memory Allocation> -- chapter. ("allocator" ::: Maybe AllocationCallbacks) -> io (Image) createImage :: Device -> ImageCreateInfo a -> ("allocator" ::: Maybe AllocationCallbacks) -> io Image createImage device :: Device device createInfo :: ImageCreateInfo a createInfo allocator :: "allocator" ::: Maybe AllocationCallbacks allocator = IO Image -> io Image forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO Image -> io Image) -> (ContT Image IO Image -> IO Image) -> ContT Image IO Image -> io Image forall b c a. (b -> c) -> (a -> b) -> a -> c . ContT Image IO Image -> IO Image forall (m :: * -> *) r. Monad m => ContT r m r -> m r evalContT (ContT Image IO Image -> io Image) -> ContT Image IO Image -> io Image forall a b. (a -> b) -> a -> b $ do let vkCreateImagePtr :: FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) vkCreateImagePtr = DeviceCmds -> FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) pVkCreateImage (Device -> DeviceCmds deviceCmds (Device device :: Device)) IO () -> ContT Image IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT Image IO ()) -> IO () -> ContT Image IO () forall a b. (a -> b) -> a -> b $ Bool -> IO () -> IO () forall (f :: * -> *). Applicative f => Bool -> f () -> f () unless (FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) vkCreateImagePtr FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) -> FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) -> Bool forall a. Eq a => a -> a -> Bool /= FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) forall a. FunPtr a nullFunPtr) (IO () -> IO ()) -> IO () -> IO () forall a b. (a -> b) -> a -> b $ IOException -> IO () forall e a. Exception e => e -> IO a throwIO (IOException -> IO ()) -> IOException -> IO () forall a b. (a -> b) -> a -> b $ Maybe Handle -> IOErrorType -> String -> String -> Maybe CInt -> Maybe String -> IOException IOError Maybe Handle forall a. Maybe a Nothing IOErrorType InvalidArgument "" "The function pointer for vkCreateImage is null" Maybe CInt forall a. Maybe a Nothing Maybe String forall a. Maybe a Nothing let vkCreateImage' :: Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result vkCreateImage' = FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) -> Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result mkVkCreateImage FunPtr (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result) vkCreateImagePtr Ptr (ImageCreateInfo a) pCreateInfo <- ((Ptr (ImageCreateInfo a) -> IO Image) -> IO Image) -> ContT Image IO (Ptr (ImageCreateInfo a)) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((Ptr (ImageCreateInfo a) -> IO Image) -> IO Image) -> ContT Image IO (Ptr (ImageCreateInfo a))) -> ((Ptr (ImageCreateInfo a) -> IO Image) -> IO Image) -> ContT Image IO (Ptr (ImageCreateInfo a)) forall a b. (a -> b) -> a -> b $ ImageCreateInfo a -> (Ptr (ImageCreateInfo a) -> IO Image) -> IO Image forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b withCStruct (ImageCreateInfo a createInfo) "pAllocator" ::: Ptr AllocationCallbacks pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks allocator) of Nothing -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ContT Image IO ("pAllocator" ::: Ptr AllocationCallbacks) forall (f :: * -> *) a. Applicative f => a -> f a pure "pAllocator" ::: Ptr AllocationCallbacks forall a. Ptr a nullPtr Just j :: AllocationCallbacks j -> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO Image) -> IO Image) -> ContT Image IO ("pAllocator" ::: Ptr AllocationCallbacks) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((("pAllocator" ::: Ptr AllocationCallbacks) -> IO Image) -> IO Image) -> ContT Image IO ("pAllocator" ::: Ptr AllocationCallbacks)) -> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO Image) -> IO Image) -> ContT Image IO ("pAllocator" ::: Ptr AllocationCallbacks) forall a b. (a -> b) -> a -> b $ AllocationCallbacks -> (("pAllocator" ::: Ptr AllocationCallbacks) -> IO Image) -> IO Image forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b withCStruct (AllocationCallbacks j) "pImage" ::: Ptr Image pPImage <- ((("pImage" ::: Ptr Image) -> IO Image) -> IO Image) -> ContT Image IO ("pImage" ::: Ptr Image) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((("pImage" ::: Ptr Image) -> IO Image) -> IO Image) -> ContT Image IO ("pImage" ::: Ptr Image)) -> ((("pImage" ::: Ptr Image) -> IO Image) -> IO Image) -> ContT Image IO ("pImage" ::: Ptr Image) forall a b. (a -> b) -> a -> b $ IO ("pImage" ::: Ptr Image) -> (("pImage" ::: Ptr Image) -> IO ()) -> (("pImage" ::: Ptr Image) -> IO Image) -> IO Image forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c bracket (Int -> IO ("pImage" ::: Ptr Image) forall a. Int -> IO (Ptr a) callocBytes @Image 8) ("pImage" ::: Ptr Image) -> IO () forall a. Ptr a -> IO () free Result r <- IO Result -> ContT Image IO Result forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO Result -> ContT Image IO Result) -> IO Result -> ContT Image IO Result forall a b. (a -> b) -> a -> b $ String -> IO Result -> IO Result forall a. String -> IO a -> IO a traceAroundEvent "vkCreateImage" (Ptr Device_T -> ("pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo)) -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ("pImage" ::: Ptr Image) -> IO Result vkCreateImage' (Device -> Ptr Device_T deviceHandle (Device device)) (Ptr (ImageCreateInfo a) -> "pCreateInfo" ::: Ptr (SomeStruct ImageCreateInfo) forall (a :: [*] -> *) (es :: [*]). Ptr (a es) -> Ptr (SomeStruct a) forgetExtensions Ptr (ImageCreateInfo a) pCreateInfo) "pAllocator" ::: Ptr AllocationCallbacks pAllocator ("pImage" ::: Ptr Image pPImage)) IO () -> ContT Image IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT Image IO ()) -> IO () -> ContT Image IO () forall a b. (a -> b) -> a -> b $ Bool -> IO () -> IO () forall (f :: * -> *). Applicative f => Bool -> f () -> f () when (Result r Result -> Result -> Bool forall a. Ord a => a -> a -> Bool < Result SUCCESS) (VulkanException -> IO () forall e a. Exception e => e -> IO a throwIO (Result -> VulkanException VulkanException Result r)) Image pImage <- IO Image -> ContT Image IO Image forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO Image -> ContT Image IO Image) -> IO Image -> ContT Image IO Image forall a b. (a -> b) -> a -> b $ ("pImage" ::: Ptr Image) -> IO Image forall a. Storable a => Ptr a -> IO a peek @Image "pImage" ::: Ptr Image pPImage Image -> ContT Image IO Image forall (f :: * -> *) a. Applicative f => a -> f a pure (Image -> ContT Image IO Image) -> Image -> ContT Image IO Image forall a b. (a -> b) -> a -> b $ (Image pImage) -- | A convenience wrapper to make a compatible pair of calls to -- 'createImage' and 'destroyImage' -- -- To ensure that 'destroyImage' is always called: pass -- 'Control.Exception.bracket' (or the allocate function from your -- favourite resource management library) as the last argument. -- To just extract the pair pass '(,)' as the last argument. -- withImage :: forall a io r . (Extendss ImageCreateInfo a, PokeChain a, MonadIO io) => Device -> ImageCreateInfo a -> Maybe AllocationCallbacks -> (io Image -> (Image -> io ()) -> r) -> r withImage :: Device -> ImageCreateInfo a -> ("allocator" ::: Maybe AllocationCallbacks) -> (io Image -> (Image -> io ()) -> r) -> r withImage device :: Device device pCreateInfo :: ImageCreateInfo a pCreateInfo pAllocator :: "allocator" ::: Maybe AllocationCallbacks pAllocator b :: io Image -> (Image -> io ()) -> r b = io Image -> (Image -> io ()) -> r b (Device -> ImageCreateInfo a -> ("allocator" ::: Maybe AllocationCallbacks) -> io Image forall (a :: [*]) (io :: * -> *). (Extendss ImageCreateInfo a, PokeChain a, MonadIO io) => Device -> ImageCreateInfo a -> ("allocator" ::: Maybe AllocationCallbacks) -> io Image createImage Device device ImageCreateInfo a pCreateInfo "allocator" ::: Maybe AllocationCallbacks pAllocator) (\(Image o0) -> Device -> Image -> ("allocator" ::: Maybe AllocationCallbacks) -> io () forall (io :: * -> *). MonadIO io => Device -> Image -> ("allocator" ::: Maybe AllocationCallbacks) -> io () destroyImage Device device Image o0 "allocator" ::: Maybe AllocationCallbacks pAllocator) foreign import ccall #if !defined(SAFE_FOREIGN_CALLS) unsafe #endif "dynamic" mkVkDestroyImage :: FunPtr (Ptr Device_T -> Image -> Ptr AllocationCallbacks -> IO ()) -> Ptr Device_T -> Image -> Ptr AllocationCallbacks -> IO () -- | vkDestroyImage - Destroy an image object -- -- == Valid Usage -- -- - #VUID-vkDestroyImage-image-01000# All submitted commands that refer -- to @image@, either directly or via a -- 'Vulkan.Core10.Handles.ImageView', /must/ have completed execution -- -- - #VUID-vkDestroyImage-image-01001# If -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were -- provided when @image@ was created, a compatible set of callbacks -- /must/ be provided here -- -- - #VUID-vkDestroyImage-image-01002# If no -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were -- provided when @image@ was created, @pAllocator@ /must/ be @NULL@ -- -- == Valid Usage (Implicit) -- -- - #VUID-vkDestroyImage-device-parameter# @device@ /must/ be a valid -- 'Vulkan.Core10.Handles.Device' handle -- -- - #VUID-vkDestroyImage-image-parameter# If @image@ is not -- 'Vulkan.Core10.APIConstants.NULL_HANDLE', @image@ /must/ be a valid -- 'Vulkan.Core10.Handles.Image' handle -- -- - #VUID-vkDestroyImage-pAllocator-parameter# If @pAllocator@ is not -- @NULL@, @pAllocator@ /must/ be a valid pointer to a valid -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' structure -- -- - #VUID-vkDestroyImage-image-parent# If @image@ is a valid handle, it -- /must/ have been created, allocated, or retrieved from @device@ -- -- == Host Synchronization -- -- - Host access to @image@ /must/ be externally synchronized -- -- = See Also -- -- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks', -- 'Vulkan.Core10.Handles.Device', 'Vulkan.Core10.Handles.Image' destroyImage :: forall io . (MonadIO io) => -- | @device@ is the logical device that destroys the image. Device -> -- | @image@ is the image to destroy. Image -> -- | @pAllocator@ controls host memory allocation as described in the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#memory-allocation Memory Allocation> -- chapter. ("allocator" ::: Maybe AllocationCallbacks) -> io () destroyImage :: Device -> Image -> ("allocator" ::: Maybe AllocationCallbacks) -> io () destroyImage device :: Device device image :: Image image allocator :: "allocator" ::: Maybe AllocationCallbacks allocator = IO () -> io () forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> io ()) -> (ContT () IO () -> IO ()) -> ContT () IO () -> io () forall b c a. (b -> c) -> (a -> b) -> a -> c . ContT () IO () -> IO () forall (m :: * -> *) r. Monad m => ContT r m r -> m r evalContT (ContT () IO () -> io ()) -> ContT () IO () -> io () forall a b. (a -> b) -> a -> b $ do let vkDestroyImagePtr :: FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) vkDestroyImagePtr = DeviceCmds -> FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) pVkDestroyImage (Device -> DeviceCmds deviceCmds (Device device :: Device)) IO () -> ContT () IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO () forall a b. (a -> b) -> a -> b $ Bool -> IO () -> IO () forall (f :: * -> *). Applicative f => Bool -> f () -> f () unless (FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) vkDestroyImagePtr FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> Bool forall a. Eq a => a -> a -> Bool /= FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) forall a. FunPtr a nullFunPtr) (IO () -> IO ()) -> IO () -> IO () forall a b. (a -> b) -> a -> b $ IOException -> IO () forall e a. Exception e => e -> IO a throwIO (IOException -> IO ()) -> IOException -> IO () forall a b. (a -> b) -> a -> b $ Maybe Handle -> IOErrorType -> String -> String -> Maybe CInt -> Maybe String -> IOException IOError Maybe Handle forall a. Maybe a Nothing IOErrorType InvalidArgument "" "The function pointer for vkDestroyImage is null" Maybe CInt forall a. Maybe a Nothing Maybe String forall a. Maybe a Nothing let vkDestroyImage' :: Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO () vkDestroyImage' = FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO () mkVkDestroyImage FunPtr (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) vkDestroyImagePtr "pAllocator" ::: Ptr AllocationCallbacks pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks allocator) of Nothing -> ("pAllocator" ::: Ptr AllocationCallbacks) -> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks) forall (f :: * -> *) a. Applicative f => a -> f a pure "pAllocator" ::: Ptr AllocationCallbacks forall a. Ptr a nullPtr Just j :: AllocationCallbacks j -> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ()) -> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ()) -> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks)) -> ((("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO ()) -> ContT () IO ("pAllocator" ::: Ptr AllocationCallbacks) forall a b. (a -> b) -> a -> b $ AllocationCallbacks -> (("pAllocator" ::: Ptr AllocationCallbacks) -> IO ()) -> IO () forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b withCStruct (AllocationCallbacks j) IO () -> ContT () IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO () forall a b. (a -> b) -> a -> b $ String -> IO () -> IO () forall a. String -> IO a -> IO a traceAroundEvent "vkDestroyImage" (Ptr Device_T -> Image -> ("pAllocator" ::: Ptr AllocationCallbacks) -> IO () vkDestroyImage' (Device -> Ptr Device_T deviceHandle (Device device)) (Image image) "pAllocator" ::: Ptr AllocationCallbacks pAllocator) () -> ContT () IO () forall (f :: * -> *) a. Applicative f => a -> f a pure (() -> ContT () IO ()) -> () -> ContT () IO () forall a b. (a -> b) -> a -> b $ () foreign import ccall #if !defined(SAFE_FOREIGN_CALLS) unsafe #endif "dynamic" mkVkGetImageSubresourceLayout :: FunPtr (Ptr Device_T -> Image -> Ptr ImageSubresource -> Ptr SubresourceLayout -> IO ()) -> Ptr Device_T -> Image -> Ptr ImageSubresource -> Ptr SubresourceLayout -> IO () -- | vkGetImageSubresourceLayout - Retrieve information about an image -- subresource -- -- = Description -- -- If the image is -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-linear-resource linear>, -- then the returned layout is valid for -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#memory-device-hostaccess host access>. -- -- If the image’s tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' and its format is -- a -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>, -- then 'getImageSubresourceLayout' describes one /format plane/ of the -- image. If the image’s tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then 'getImageSubresourceLayout' describes one /memory plane/ of the -- image. If the image’s tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT' -- and the image is -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-linear-resource non-linear>, -- then the returned layout has an implementation-dependent meaning; the -- vendor of the image’s -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-drm-format-modifier DRM format modifier> -- /may/ provide documentation that explains how to interpret the returned -- layout. -- -- 'getImageSubresourceLayout' is invariant for the lifetime of a single -- image. However, the subresource layout of images in Android hardware -- buffer external memory is not known until the image has been bound to -- memory, so applications /must/ not call 'getImageSubresourceLayout' for -- such an image before it has been bound. -- -- == Valid Usage -- -- - #VUID-vkGetImageSubresourceLayout-image-02270# @image@ /must/ have -- been created with @tiling@ equal to -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' or -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT' -- -- - #VUID-vkGetImageSubresourceLayout-aspectMask-00997# The @aspectMask@ -- member of @pSubresource@ /must/ only have a single bit set -- -- - #VUID-vkGetImageSubresourceLayout-mipLevel-01716# The @mipLevel@ -- member of @pSubresource@ /must/ be less than the @mipLevels@ -- specified in 'ImageCreateInfo' when @image@ was created -- -- - #VUID-vkGetImageSubresourceLayout-arrayLayer-01717# The @arrayLayer@ -- member of @pSubresource@ /must/ be less than the @arrayLayers@ -- specified in 'ImageCreateInfo' when @image@ was created -- -- - #VUID-vkGetImageSubresourceLayout-format-04461# If @format@ is a -- color format, the @aspectMask@ member of @pSubresource@ /must/ be -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_COLOR_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-format-04462# If @format@ has a -- depth component, the @aspectMask@ member of @pSubresource@ /must/ -- contain -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_DEPTH_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-format-04463# If @format@ has a -- stencil component, the @aspectMask@ member of @pSubresource@ /must/ -- contain -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_STENCIL_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-format-04464# If @format@ does not -- contain a stencil or depth component, the @aspectMask@ member of -- @pSubresource@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_DEPTH_BIT' or -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_STENCIL_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-format-01581# If the @tiling@ of -- the @image@ is 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' -- and its @format@ is a -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format> -- with two planes, the @aspectMask@ member of @pSubresource@ /must/ be -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT' -- or -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_1_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-format-01582# If the @tiling@ of -- the @image@ is 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' -- and its @format@ is a -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format> -- with three planes, the @aspectMask@ member of @pSubresource@ /must/ -- be -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT', -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_1_BIT' -- or -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_2_BIT' -- -- - #VUID-vkGetImageSubresourceLayout-image-01895# If @image@ was -- created with the -- 'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID' -- external memory handle type, then @image@ /must/ be bound to memory -- -- - #VUID-vkGetImageSubresourceLayout-tiling-02271# If the @tiling@ of -- the @image@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then the @aspectMask@ member of @pSubresource@ /must/ be -- @VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT@ and the index @i@ /must/ be -- less than the -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesEXT'::@drmFormatModifierPlaneCount@ -- associated with the image’s @format@ and -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierPropertiesEXT'::@drmFormatModifier@ -- -- == Valid Usage (Implicit) -- -- - #VUID-vkGetImageSubresourceLayout-device-parameter# @device@ /must/ -- be a valid 'Vulkan.Core10.Handles.Device' handle -- -- - #VUID-vkGetImageSubresourceLayout-image-parameter# @image@ /must/ be -- a valid 'Vulkan.Core10.Handles.Image' handle -- -- - #VUID-vkGetImageSubresourceLayout-pSubresource-parameter# -- @pSubresource@ /must/ be a valid pointer to a valid -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource' -- structure -- -- - #VUID-vkGetImageSubresourceLayout-pLayout-parameter# @pLayout@ -- /must/ be a valid pointer to a 'SubresourceLayout' structure -- -- - #VUID-vkGetImageSubresourceLayout-image-parent# @image@ /must/ have -- been created, allocated, or retrieved from @device@ -- -- = See Also -- -- 'Vulkan.Core10.Handles.Device', 'Vulkan.Core10.Handles.Image', -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource', -- 'SubresourceLayout' getImageSubresourceLayout :: forall io . (MonadIO io) => -- | @device@ is the logical device that owns the image. Device -> -- | @image@ is the image whose layout is being queried. Image -> -- | @pSubresource@ is a pointer to a -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource' -- structure selecting a specific image for the image subresource. ImageSubresource -> io (SubresourceLayout) getImageSubresourceLayout :: Device -> Image -> ImageSubresource -> io SubresourceLayout getImageSubresourceLayout device :: Device device image :: Image image subresource :: ImageSubresource subresource = IO SubresourceLayout -> io SubresourceLayout forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO SubresourceLayout -> io SubresourceLayout) -> (ContT SubresourceLayout IO SubresourceLayout -> IO SubresourceLayout) -> ContT SubresourceLayout IO SubresourceLayout -> io SubresourceLayout forall b c a. (b -> c) -> (a -> b) -> a -> c . ContT SubresourceLayout IO SubresourceLayout -> IO SubresourceLayout forall (m :: * -> *) r. Monad m => ContT r m r -> m r evalContT (ContT SubresourceLayout IO SubresourceLayout -> io SubresourceLayout) -> ContT SubresourceLayout IO SubresourceLayout -> io SubresourceLayout forall a b. (a -> b) -> a -> b $ do let vkGetImageSubresourceLayoutPtr :: FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) vkGetImageSubresourceLayoutPtr = DeviceCmds -> FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) pVkGetImageSubresourceLayout (Device -> DeviceCmds deviceCmds (Device device :: Device)) IO () -> ContT SubresourceLayout IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT SubresourceLayout IO ()) -> IO () -> ContT SubresourceLayout IO () forall a b. (a -> b) -> a -> b $ Bool -> IO () -> IO () forall (f :: * -> *). Applicative f => Bool -> f () -> f () unless (FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) vkGetImageSubresourceLayoutPtr FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) -> FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) -> Bool forall a. Eq a => a -> a -> Bool /= FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) forall a. FunPtr a nullFunPtr) (IO () -> IO ()) -> IO () -> IO () forall a b. (a -> b) -> a -> b $ IOException -> IO () forall e a. Exception e => e -> IO a throwIO (IOException -> IO ()) -> IOException -> IO () forall a b. (a -> b) -> a -> b $ Maybe Handle -> IOErrorType -> String -> String -> Maybe CInt -> Maybe String -> IOException IOError Maybe Handle forall a. Maybe a Nothing IOErrorType InvalidArgument "" "The function pointer for vkGetImageSubresourceLayout is null" Maybe CInt forall a. Maybe a Nothing Maybe String forall a. Maybe a Nothing let vkGetImageSubresourceLayout' :: Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO () vkGetImageSubresourceLayout' = FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) -> Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO () mkVkGetImageSubresourceLayout FunPtr (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO ()) vkGetImageSubresourceLayoutPtr "pSubresource" ::: Ptr ImageSubresource pSubresource <- ((("pSubresource" ::: Ptr ImageSubresource) -> IO SubresourceLayout) -> IO SubresourceLayout) -> ContT SubresourceLayout IO ("pSubresource" ::: Ptr ImageSubresource) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((("pSubresource" ::: Ptr ImageSubresource) -> IO SubresourceLayout) -> IO SubresourceLayout) -> ContT SubresourceLayout IO ("pSubresource" ::: Ptr ImageSubresource)) -> ((("pSubresource" ::: Ptr ImageSubresource) -> IO SubresourceLayout) -> IO SubresourceLayout) -> ContT SubresourceLayout IO ("pSubresource" ::: Ptr ImageSubresource) forall a b. (a -> b) -> a -> b $ ImageSubresource -> (("pSubresource" ::: Ptr ImageSubresource) -> IO SubresourceLayout) -> IO SubresourceLayout forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b withCStruct (ImageSubresource subresource) "pLayout" ::: Ptr SubresourceLayout pPLayout <- ((("pLayout" ::: Ptr SubresourceLayout) -> IO SubresourceLayout) -> IO SubresourceLayout) -> ContT SubresourceLayout IO ("pLayout" ::: Ptr SubresourceLayout) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (forall b. ToCStruct SubresourceLayout => (("pLayout" ::: Ptr SubresourceLayout) -> IO b) -> IO b forall a b. ToCStruct a => (Ptr a -> IO b) -> IO b withZeroCStruct @SubresourceLayout) IO () -> ContT SubresourceLayout IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT SubresourceLayout IO ()) -> IO () -> ContT SubresourceLayout IO () forall a b. (a -> b) -> a -> b $ String -> IO () -> IO () forall a. String -> IO a -> IO a traceAroundEvent "vkGetImageSubresourceLayout" (Ptr Device_T -> Image -> ("pSubresource" ::: Ptr ImageSubresource) -> ("pLayout" ::: Ptr SubresourceLayout) -> IO () vkGetImageSubresourceLayout' (Device -> Ptr Device_T deviceHandle (Device device)) (Image image) "pSubresource" ::: Ptr ImageSubresource pSubresource ("pLayout" ::: Ptr SubresourceLayout pPLayout)) SubresourceLayout pLayout <- IO SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout) -> IO SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout forall a b. (a -> b) -> a -> b $ ("pLayout" ::: Ptr SubresourceLayout) -> IO SubresourceLayout forall a. FromCStruct a => Ptr a -> IO a peekCStruct @SubresourceLayout "pLayout" ::: Ptr SubresourceLayout pPLayout SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout forall (f :: * -> *) a. Applicative f => a -> f a pure (SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout) -> SubresourceLayout -> ContT SubresourceLayout IO SubresourceLayout forall a b. (a -> b) -> a -> b $ (SubresourceLayout pLayout) -- | VkImageCreateInfo - Structure specifying the parameters of a newly -- created image object -- -- = Description -- -- Images created with @tiling@ equal to -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' have further -- restrictions on their limits and capabilities compared to images created -- with @tiling@ equal to -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL'. Creation of -- images with tiling 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' -- /may/ not be supported unless other parameters meet all of the -- constraints: -- -- - @imageType@ is 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - @format@ is not a depth\/stencil format -- -- - @mipLevels@ is 1 -- -- - @arrayLayers@ is 1 -- -- - @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- - @usage@ only includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSFER_SRC_BIT' -- and\/or -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSFER_DST_BIT' -- -- Images created with a @format@ from one of those listed in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion> -- have further restrictions on their limits and capabilities compared to -- images created with other formats. Creation of images with a format -- requiring -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion Y′CBCR conversion> -- /may/ not be supported unless other parameters meet all of the -- constraints: -- -- - @imageType@ is 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - @mipLevels@ is 1 -- -- - @arrayLayers@ is 1 -- -- - @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- Implementations /may/ support additional limits and capabilities beyond -- those listed above. -- -- To determine the set of valid @usage@ bits for a given format, call -- 'Vulkan.Core10.DeviceInitialization.getPhysicalDeviceFormatProperties'. -- -- If the size of the resultant image would exceed @maxResourceSize@, then -- 'createImage' /must/ fail and return -- 'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'. This failure -- /may/ occur even when all image creation parameters satisfy their valid -- usage requirements. -- -- Note -- -- For images created without -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_EXTENDED_USAGE_BIT' -- a @usage@ bit is valid if it is supported for the format the image is -- created with. -- -- For images created with -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_EXTENDED_USAGE_BIT' -- a @usage@ bit is valid if it is supported for at least one of the -- formats a 'Vulkan.Core10.Handles.ImageView' created from the image /can/ -- have (see -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-views Image Views> -- for more detail). -- -- Valid values for some image creation parameters are limited by a -- numerical upper bound or by inclusion in a bitset. For example, -- 'ImageCreateInfo'::@arrayLayers@ is limited by -- @imageCreateMaxArrayLayers@, defined below; and -- 'ImageCreateInfo'::@samples@ is limited by @imageCreateSampleCounts@, -- also defined below. -- -- Several limiting values are defined below, as well as assisting values -- from which the limiting values are derived. The limiting values are -- referenced by the relevant valid usage statements of 'ImageCreateInfo'. -- -- - Let @uint64_t imageCreateDrmFormatModifiers[]@ be the set of -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-drm-format-modifier Linux DRM format modifiers> -- that the resultant image /may/ have. -- -- - If @tiling@ is not -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then @imageCreateDrmFormatModifiers@ is empty. -- -- - If 'ImageCreateInfo'::@pNext@ contains -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT', -- then @imageCreateDrmFormatModifiers@ contains exactly one -- modifier, -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT'::@drmFormatModifier@. -- -- - If 'ImageCreateInfo'::@pNext@ contains -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierListCreateInfoEXT', -- then @imageCreateDrmFormatModifiers@ contains the entire array -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierListCreateInfoEXT'::@pDrmFormatModifiers@. -- -- - Let @VkBool32 imageCreateMaybeLinear@ indicate if the resultant -- image may be -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-linear-resource linear>. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR', then -- @imageCreateMaybeLinear@ is @true@. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', then -- @imageCreateMaybeLinear@ is @false@. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then @imageCreateMaybeLinear_@ is @true@ if and only if -- @imageCreateDrmFormatModifiers@ contains -- @DRM_FORMAT_MOD_LINEAR@. -- -- - Let @VkFormatFeatureFlags imageCreateFormatFeatures@ be the set of -- valid /format features/ available during image creation. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR', then -- @imageCreateFormatFeatures@ is the value of -- 'Vulkan.Core10.DeviceInitialization.FormatProperties'::@linearTilingFeatures@ -- found by calling -- 'Vulkan.Core10.DeviceInitialization.getPhysicalDeviceFormatProperties' -- with parameter @format@ equal to 'ImageCreateInfo'::@format@. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', and if -- the @pNext@ chain includes no -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure with non-zero @externalFormat@, then -- @imageCreateFormatFeatures@ is value of -- 'Vulkan.Core10.DeviceInitialization.FormatProperties'::@optimalTilingFeatures@ -- found by calling -- 'Vulkan.Core10.DeviceInitialization.getPhysicalDeviceFormatProperties' -- with parameter @format@ equal to 'ImageCreateInfo'::@format@. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL', and if -- the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure with non-zero @externalFormat@, then -- @imageCreateFormatFeatures@ is the value of -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.AndroidHardwareBufferFormatPropertiesANDROID'::@formatFeatures@ -- obtained by -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.getAndroidHardwareBufferPropertiesANDROID' -- with a matching @externalFormat@ value. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then the value of @imageCreateFormatFeatures@ is found by -- calling -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceFormatProperties2' -- with -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@format@ -- equal to 'ImageCreateInfo'::@format@ and with -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesListEXT' -- chained into -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.ImageFormatProperties2'; -- by collecting all members of the returned array -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesListEXT'::@pDrmFormatModifierProperties@ -- whose @drmFormatModifier@ belongs to -- @imageCreateDrmFormatModifiers@; and by taking the bitwise -- intersection, over the collected array members, of -- @drmFormatModifierTilingFeatures@. (The resultant -- @imageCreateFormatFeatures@ /may/ be empty). -- -- - Let -- @VkImageFormatProperties2 imageCreateImageFormatPropertiesList[]@ be -- defined as follows. -- -- - If 'ImageCreateInfo'::@pNext@ contains no -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure with non-zero @externalFormat@, then -- @imageCreateImageFormatPropertiesList@ is the list of structures -- obtained by calling -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2', -- possibly multiple times, as follows: -- -- - The parameters -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2'::@format@, -- @imageType@, @tiling@, @usage@, and @flags@ /must/ be equal -- to those in 'ImageCreateInfo'. -- -- - If 'ImageCreateInfo'::@pNext@ contains a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure whose @handleTypes@ is not @0@, then -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2'::@pNext@ -- /must/ contain a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceExternalImageFormatInfo' -- structure whose @handleType@ is not @0@; and -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- /must/ be called for each handle type in -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo'::@handleTypes@, -- successively setting -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceExternalImageFormatInfo'::@handleType@ -- on each call. -- -- - If 'ImageCreateInfo'::@pNext@ contains no -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure, or contains a structure whose @handleTypes@ is -- @0@, then -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2'::@pNext@ -- /must/ either contain no -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceExternalImageFormatInfo' -- structure, or contain a structure whose @handleType@ is @0@. -- -- - If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2'::@pNext@ -- /must/ contain a -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.PhysicalDeviceImageDrmFormatModifierInfoEXT' -- structure where @sharingMode@ is equal to -- 'ImageCreateInfo'::@sharingMode@; and, if @sharingMode@ is -- 'Vulkan.Core10.Enums.SharingMode.SHARING_MODE_CONCURRENT', -- then @queueFamilyIndexCount@ and @pQueueFamilyIndices@ -- /must/ be equal to those in 'ImageCreateInfo'; and, if -- @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_MUTABLE_FORMAT_BIT', -- then the -- 'Vulkan.Core12.Promoted_From_VK_KHR_image_format_list.ImageFormatListCreateInfo' -- structure included in the @pNext@ chain of -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2' -- /must/ be equivalent to the one included in the @pNext@ -- chain of 'ImageCreateInfo'; and -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- /must/ be called for each modifier in -- @imageCreateDrmFormatModifiers@, successively setting -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.PhysicalDeviceImageDrmFormatModifierInfoEXT'::@drmFormatModifier@ -- on each call. -- -- - If @tiling@ is not -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceImageFormatInfo2'::@pNext@ -- /must/ contain no -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.PhysicalDeviceImageDrmFormatModifierInfoEXT' -- structure. -- -- - If any call to -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- returns an error, then -- @imageCreateImageFormatPropertiesList@ is defined to be the -- empty list. -- -- - If 'ImageCreateInfo'::@pNext@ contains a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure with non-zero @externalFormat@, then -- @imageCreateImageFormatPropertiesList@ contains a single element -- where: -- -- - 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxMipLevels@ -- is ⌊log2(max(@extent.width@, @extent.height@, -- @extent.depth@))⌋ + 1. -- -- - 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxArrayLayers@ -- is -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::maxImageArrayLayers. -- -- - Each component of -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxExtent@ -- is -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::maxImageDimension2D. -- -- - 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@sampleCounts@ -- contains exactly -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT'. -- -- - Let @uint32_t imageCreateMaxMipLevels@ be the minimum value of -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxMipLevels@ -- in @imageCreateImageFormatPropertiesList@. The value is undefined if -- @imageCreateImageFormatPropertiesList@ is empty. -- -- - Let @uint32_t imageCreateMaxArrayLayers@ be the minimum value of -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxArrayLayers@ -- in @imageCreateImageFormatPropertiesList@. The value is undefined if -- @imageCreateImageFormatPropertiesList@ is empty. -- -- - Let @VkExtent3D imageCreateMaxExtent@ be the component-wise minimum -- over all -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@maxExtent@ -- values in @imageCreateImageFormatPropertiesList@. The value is -- undefined if @imageCreateImageFormatPropertiesList@ is empty. -- -- - Let @VkSampleCountFlags imageCreateSampleCounts@ be the intersection -- of each -- 'Vulkan.Core10.DeviceInitialization.ImageFormatProperties'::@sampleCounts@ -- in @imageCreateImageFormatPropertiesList@. The value is undefined if -- @imageCreateImageFormatPropertiesList@ is empty. -- -- = Valid Usage -- -- - #VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251# Each of the -- following values (as described in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- /must/ not be undefined @imageCreateMaxMipLevels@, -- @imageCreateMaxArrayLayers@, @imageCreateMaxExtent@, and -- @imageCreateSampleCounts@ -- -- - #VUID-VkImageCreateInfo-sharingMode-00941# If @sharingMode@ is -- 'Vulkan.Core10.Enums.SharingMode.SHARING_MODE_CONCURRENT', -- @pQueueFamilyIndices@ /must/ be a valid pointer to an array of -- @queueFamilyIndexCount@ @uint32_t@ values -- -- - #VUID-VkImageCreateInfo-sharingMode-00942# If @sharingMode@ is -- 'Vulkan.Core10.Enums.SharingMode.SHARING_MODE_CONCURRENT', -- @queueFamilyIndexCount@ /must/ be greater than @1@ -- -- - #VUID-VkImageCreateInfo-sharingMode-01420# If @sharingMode@ is -- 'Vulkan.Core10.Enums.SharingMode.SHARING_MODE_CONCURRENT', each -- element of @pQueueFamilyIndices@ /must/ be unique and /must/ be less -- than @pQueueFamilyPropertyCount@ returned by either -- 'Vulkan.Core10.DeviceInitialization.getPhysicalDeviceQueueFamilyProperties' -- or -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceQueueFamilyProperties2' -- for the @physicalDevice@ that was used to create @device@ -- -- - #VUID-VkImageCreateInfo-pNext-01974# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure, and its @externalFormat@ member is non-zero the @format@ -- /must/ be 'Vulkan.Core10.Enums.Format.FORMAT_UNDEFINED' -- -- - #VUID-VkImageCreateInfo-pNext-01975# If the @pNext@ chain does not -- include a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure, or does and its @externalFormat@ member is @0@, the -- @format@ /must/ not be 'Vulkan.Core10.Enums.Format.FORMAT_UNDEFINED' -- -- - #VUID-VkImageCreateInfo-extent-00944# @extent.width@ /must/ be -- greater than @0@ -- -- - #VUID-VkImageCreateInfo-extent-00945# @extent.height@ /must/ be -- greater than @0@ -- -- - #VUID-VkImageCreateInfo-extent-00946# @extent.depth@ /must/ be -- greater than @0@ -- -- - #VUID-VkImageCreateInfo-mipLevels-00947# @mipLevels@ /must/ be -- greater than @0@ -- -- - #VUID-VkImageCreateInfo-arrayLayers-00948# @arrayLayers@ /must/ be -- greater than @0@ -- -- - #VUID-VkImageCreateInfo-flags-00949# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CUBE_COMPATIBLE_BIT', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-flags-02557# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-flags-00950# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D' -- -- - #VUID-VkImageCreateInfo-extent-02252# @extent.width@ /must/ be less -- than or equal to @imageCreateMaxExtent.width@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-extent-02253# @extent.height@ /must/ be less -- than or equal to @imageCreateMaxExtent.height@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-extent-02254# @extent.depth@ /must/ be less -- than or equal to @imageCreateMaxExtent.depth@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-imageType-00954# If @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' and @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CUBE_COMPATIBLE_BIT', -- @extent.width@ and @extent.height@ /must/ be equal and @arrayLayers@ -- /must/ be greater than or equal to 6 -- -- - #VUID-VkImageCreateInfo-imageType-00956# If @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', both @extent.height@ -- and @extent.depth@ /must/ be @1@ -- -- - #VUID-VkImageCreateInfo-imageType-00957# If @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', @extent.depth@ /must/ -- be @1@ -- -- - #VUID-VkImageCreateInfo-mipLevels-00958# @mipLevels@ /must/ be less -- than or equal to the number of levels in the complete mipmap chain -- based on @extent.width@, @extent.height@, and @extent.depth@ -- -- - #VUID-VkImageCreateInfo-mipLevels-02255# @mipLevels@ /must/ be less -- than or equal to @imageCreateMaxMipLevels@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-arrayLayers-02256# @arrayLayers@ /must/ be -- less than or equal to @imageCreateMaxArrayLayers@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-imageType-00961# If @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D', @arrayLayers@ /must/ -- be @1@ -- -- - #VUID-VkImageCreateInfo-samples-02257# If @samples@ is not -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT', then -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CUBE_COMPATIBLE_BIT', -- @mipLevels@ /must/ be equal to @1@, and @imageCreateMaybeLinear@ (as -- defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- /must/ be @false@, -- -- - #VUID-VkImageCreateInfo-samples-02558# If @samples@ is not -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT', -- @usage@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT' -- -- - #VUID-VkImageCreateInfo-usage-00963# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- then bits other than -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_COLOR_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- and -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT' -- /must/ not be set -- -- - #VUID-VkImageCreateInfo-usage-00964# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_COLOR_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- or -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT', -- @extent.width@ /must/ be less than or equal to -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxFramebufferWidth@ -- -- - #VUID-VkImageCreateInfo-usage-00965# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_COLOR_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- or -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT', -- @extent.height@ /must/ be less than or equal to -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxFramebufferHeight@ -- -- - #VUID-VkImageCreateInfo-usage-02559# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT', -- @extent.width@ /must/ be less than or equal to -- \(\left\lceil{\frac{maxFramebufferWidth}{minFragmentDensityTexelSize_{width}}}\right\rceil\) -- -- - #VUID-VkImageCreateInfo-usage-02560# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT', -- @extent.height@ /must/ be less than or equal to -- \(\left\lceil{\frac{maxFramebufferHeight}{minFragmentDensityTexelSize_{height}}}\right\rceil\) -- -- - #VUID-VkImageCreateInfo-usage-00966# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- @usage@ /must/ also contain at least one of -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_COLOR_ATTACHMENT_BIT', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- or -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT' -- -- - #VUID-VkImageCreateInfo-samples-02258# @samples@ /must/ be a bit -- value that is set in @imageCreateSampleCounts@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- -- - #VUID-VkImageCreateInfo-usage-00968# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-shaderStorageImageMultisample multisampled storage images> -- feature is not enabled, and @usage@ contains -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_STORAGE_BIT', -- @samples@ /must/ be -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- - #VUID-VkImageCreateInfo-flags-00969# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseBinding sparse bindings> -- feature is not enabled, @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_BINDING_BIT' -- -- - #VUID-VkImageCreateInfo-flags-01924# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidencyAliased sparse aliased residency> -- feature is not enabled, @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_ALIASED_BIT' -- -- - #VUID-VkImageCreateInfo-tiling-04121# If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR', @flags@ -- /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00970# If @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', @flags@ /must/ not -- contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00971# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidencyImage2D sparse residency for 2D images> -- feature is not enabled, and @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', @flags@ /must/ not -- contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00972# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidencyImage3D sparse residency for 3D images> -- feature is not enabled, and @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D', @flags@ /must/ not -- contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00973# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidency2Samples sparse residency for images with 2 samples> -- feature is not enabled, @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', and @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_2_BIT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00974# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidency4Samples sparse residency for images with 4 samples> -- feature is not enabled, @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', and @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_4_BIT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00975# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidency8Samples sparse residency for images with 8 samples> -- feature is not enabled, @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', and @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_8_BIT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-imageType-00976# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-sparseResidency16Samples sparse residency for images with 16 samples> -- feature is not enabled, @imageType@ is -- 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', and @samples@ is -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_16_BIT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- -- - #VUID-VkImageCreateInfo-flags-00987# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT' -- or -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_ALIASED_BIT', -- it /must/ also contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_BINDING_BIT' -- -- - #VUID-VkImageCreateInfo-None-01925# If any of the bits -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_BINDING_BIT', -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT', -- or -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_ALIASED_BIT' -- are set, -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT' -- /must/ not also be set -- -- - #VUID-VkImageCreateInfo-flags-01890# If the protected memory feature -- is not enabled, @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_PROTECTED_BIT' -- -- - #VUID-VkImageCreateInfo-None-01891# If any of the bits -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_BINDING_BIT', -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_RESIDENCY_BIT', -- or -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPARSE_ALIASED_BIT' -- are set, -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_PROTECTED_BIT' -- /must/ not also be set -- -- - #VUID-VkImageCreateInfo-pNext-00988# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_NV_external_memory.ExternalMemoryImageCreateInfoNV' -- structure, it /must/ not contain a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure -- -- - #VUID-VkImageCreateInfo-pNext-00990# If the @pNext@ chain includes a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure, its @handleTypes@ member /must/ only contain bits that -- are also in -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.ExternalImageFormatProperties'::@externalMemoryProperties.compatibleHandleTypes@, -- as returned by -- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceImageFormatProperties2' -- with @format@, @imageType@, @tiling@, @usage@, and @flags@ equal to -- those in this structure, and with a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceExternalImageFormatInfo' -- structure included in the @pNext@ chain, with a @handleType@ equal -- to any one of the handle types specified in -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo'::@handleTypes@ -- -- - #VUID-VkImageCreateInfo-pNext-00991# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_NV_external_memory.ExternalMemoryImageCreateInfoNV' -- structure, its @handleTypes@ member /must/ only contain bits that -- are also in -- 'Vulkan.Extensions.VK_NV_external_memory_capabilities.ExternalImageFormatPropertiesNV'::@externalMemoryProperties.compatibleHandleTypes@, -- as returned by -- 'Vulkan.Extensions.VK_NV_external_memory_capabilities.getPhysicalDeviceExternalImageFormatPropertiesNV' -- with @format@, @imageType@, @tiling@, @usage@, and @flags@ equal to -- those in this structure, and with @externalHandleType@ equal to any -- one of the handle types specified in -- 'Vulkan.Extensions.VK_NV_external_memory.ExternalMemoryImageCreateInfoNV'::@handleTypes@ -- -- - #VUID-VkImageCreateInfo-physicalDeviceCount-01421# If the logical -- device was created with -- 'Vulkan.Core11.Promoted_From_VK_KHR_device_group_creation.DeviceGroupDeviceCreateInfo'::@physicalDeviceCount@ -- equal to 1, @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT' -- -- - #VUID-VkImageCreateInfo-flags-02259# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT', -- then @mipLevels@ /must/ be one, @arrayLayers@ /must/ be one, -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D'. -- and @imageCreateMaybeLinear@ (as defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- /must/ be @false@ -- -- - #VUID-VkImageCreateInfo-flags-01572# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT', -- then @format@ /must/ be a -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#appendix-compressedtex-bc block-compressed image format>, -- an -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#appendix-compressedtex-etc2 ETC compressed image format>, -- or an -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#appendix-compressedtex-astc ASTC compressed image format> -- -- - #VUID-VkImageCreateInfo-flags-01573# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT', -- then @flags@ /must/ also contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_MUTABLE_FORMAT_BIT' -- -- - #VUID-VkImageCreateInfo-initialLayout-00993# @initialLayout@ /must/ -- be 'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_UNDEFINED' or -- 'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_PREINITIALIZED' -- -- - #VUID-VkImageCreateInfo-pNext-01443# If the @pNext@ chain includes a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- or -- 'Vulkan.Extensions.VK_NV_external_memory.ExternalMemoryImageCreateInfoNV' -- structure whose @handleTypes@ member is not @0@, @initialLayout@ -- /must/ be 'Vulkan.Core10.Enums.ImageLayout.IMAGE_LAYOUT_UNDEFINED' -- -- - #VUID-VkImageCreateInfo-format-02561# If the image @format@ is one -- of those listed in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion>, -- then @mipLevels@ /must/ be 1 -- -- - #VUID-VkImageCreateInfo-format-02562# If the image @format@ is one -- of those listed in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion>, -- @samples@ /must/ be -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- - #VUID-VkImageCreateInfo-format-02563# If the image @format@ is one -- of those listed in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion>, -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-format-02653# If the image @format@ is one -- of those listed in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion>, -- and the @ycbcrImageArrays@ feature is not enabled, @arrayLayers@ -- /must/ be 1 -- -- - #VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260# If @format@ -- is a /multi-planar/ format, and if @imageCreateFormatFeatures@ (as -- defined in -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-creation-limits Image Creation Limits>) -- does not contain -- 'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_DISJOINT_BIT', -- then @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_DISJOINT_BIT' -- -- - #VUID-VkImageCreateInfo-format-01577# If @format@ is not a -- /multi-planar/ format, and @flags@ does not include -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_ALIAS_BIT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_DISJOINT_BIT' -- -- - #VUID-VkImageCreateInfo-tiling-02261# If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then the @pNext@ chain /must/ include exactly one of -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierListCreateInfoEXT' -- or -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT' -- structures -- -- - #VUID-VkImageCreateInfo-pNext-02262# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierListCreateInfoEXT' -- or -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT' -- structure, then @tiling@ /must/ be -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT' -- -- - #VUID-VkImageCreateInfo-tiling-02353# If @tiling@ is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT' -- and @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_MUTABLE_FORMAT_BIT', -- then the @pNext@ chain /must/ include a -- 'Vulkan.Core12.Promoted_From_VK_KHR_image_format_list.ImageFormatListCreateInfo' -- structure with non-zero @viewFormatCount@ -- -- - #VUID-VkImageCreateInfo-flags-01533# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT' -- @format@ /must/ be a depth or depth\/stencil format -- -- - #VUID-VkImageCreateInfo-pNext-02393# If the @pNext@ chain includes a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure whose @handleTypes@ member includes -- 'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-pNext-02394# If the @pNext@ chain includes a -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo' -- structure whose @handleTypes@ member includes -- 'Vulkan.Core11.Enums.ExternalMemoryHandleTypeFlagBits.EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID', -- @mipLevels@ /must/ either be @1@ or equal to the number of levels in -- the complete mipmap chain based on @extent.width@, @extent.height@, -- and @extent.depth@ -- -- - #VUID-VkImageCreateInfo-pNext-02396# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure whose @externalFormat@ member is not @0@, @flags@ /must/ -- not include -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_MUTABLE_FORMAT_BIT' -- -- - #VUID-VkImageCreateInfo-pNext-02397# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure whose @externalFormat@ member is not @0@, @usage@ /must/ -- not include any usages except -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_SAMPLED_BIT' -- -- - #VUID-VkImageCreateInfo-pNext-02398# If the @pNext@ chain includes a -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID' -- structure whose @externalFormat@ member is not @0@, @tiling@ /must/ -- be 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL' -- -- - #VUID-VkImageCreateInfo-format-02795# If @format@ is a depth-stencil -- format, @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- and the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure, then its -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo'::@stencilUsage@ -- member /must/ also include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' -- -- - #VUID-VkImageCreateInfo-format-02796# If @format@ is a depth-stencil -- format, @usage@ does not include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT', -- and the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure, then its -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo'::@stencilUsage@ -- member /must/ also not include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT' -- -- - #VUID-VkImageCreateInfo-format-02797# If @format@ is a depth-stencil -- format, @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- and the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure, then its -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo'::@stencilUsage@ -- member /must/ also include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT' -- -- - #VUID-VkImageCreateInfo-format-02798# If @format@ is a depth-stencil -- format, @usage@ does not include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT', -- and the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure, then its -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo'::@stencilUsage@ -- member /must/ also not include -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT' -- -- - #VUID-VkImageCreateInfo-Format-02536# If -- 'Vulkan.Core10.Enums.Format.Format' is a depth-stencil format and -- the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure with its @stencilUsage@ member including -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT', -- @extent.width@ /must/ be less than or equal to -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxFramebufferWidth@ -- -- - #VUID-VkImageCreateInfo-format-02537# If @format@ is a depth-stencil -- format and the @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure with its @stencilUsage@ member including -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_INPUT_ATTACHMENT_BIT', -- @extent.height@ /must/ be less than or equal to -- 'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxFramebufferHeight@ -- -- - #VUID-VkImageCreateInfo-format-02538# If the -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-shaderStorageImageMultisample multisampled storage images> -- feature is not enabled, @format@ is a depth-stencil format and the -- @pNext@ chain includes a -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo' -- structure with its @stencilUsage@ including -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_STORAGE_BIT', -- @samples@ /must/ be -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- - #VUID-VkImageCreateInfo-flags-02050# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- or 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D' -- -- - #VUID-VkImageCreateInfo-flags-02051# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV', -- it /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CUBE_COMPATIBLE_BIT' -- and the @format@ /must/ not be a depth\/stencil format -- -- - #VUID-VkImageCreateInfo-flags-02052# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV' -- and @imageType@ is 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', -- @extent.width@ and @extent.height@ /must/ be greater than @1@ -- -- - #VUID-VkImageCreateInfo-flags-02053# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CORNER_SAMPLED_BIT_NV' -- and @imageType@ is 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_3D', -- @extent.width@, @extent.height@, and @extent.depth@ /must/ be -- greater than @1@ -- -- - #VUID-VkImageCreateInfo-imageType-02082# If @usage@ includes -- 'Vulkan.Extensions.VK_KHR_fragment_shading_rate.IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-samples-02083# If @usage@ includes -- 'Vulkan.Extensions.VK_KHR_fragment_shading_rate.IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR', -- @samples@ /must/ be -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT' -- -- - #VUID-VkImageCreateInfo-tiling-02084# If @usage@ includes -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV', -- @tiling@ /must/ be -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL' -- -- - #VUID-VkImageCreateInfo-flags-02565# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SUBSAMPLED_BIT_EXT', -- @tiling@ /must/ be -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_OPTIMAL' -- -- - #VUID-VkImageCreateInfo-flags-02566# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SUBSAMPLED_BIT_EXT', -- @imageType@ /must/ be 'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' -- -- - #VUID-VkImageCreateInfo-flags-02567# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SUBSAMPLED_BIT_EXT', -- @flags@ /must/ not contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_CUBE_COMPATIBLE_BIT' -- -- - #VUID-VkImageCreateInfo-flags-02568# If @flags@ contains -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_SUBSAMPLED_BIT_EXT', -- @mipLevels@ /must/ be @1@ -- -- - #VUID-VkImageCreateInfo-imageView2DOn3DImage-04459# If the -- @VK_KHR_portability_subset@ extension is enabled, and -- 'Vulkan.Extensions.VK_KHR_portability_subset.PhysicalDevicePortabilitySubsetFeaturesKHR'::@imageView2DOn3DImage@ -- is 'Vulkan.Core10.FundamentalTypes.FALSE', @flags@ /must/ not -- contain -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT'. -- -- - #VUID-VkImageCreateInfo-multisampleArrayImage-04460# If the -- @VK_KHR_portability_subset@ extension is enabled, and -- 'Vulkan.Extensions.VK_KHR_portability_subset.PhysicalDevicePortabilitySubsetFeaturesKHR'::@multisampleArrayImage@ -- is 'Vulkan.Core10.FundamentalTypes.FALSE', and @samples@ is not -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SAMPLE_COUNT_1_BIT', then -- @arrayLayers@ /must/ be @1@. -- -- = Valid Usage (Implicit) -- -- - #VUID-VkImageCreateInfo-sType-sType# @sType@ /must/ be -- 'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMAGE_CREATE_INFO' -- -- - #VUID-VkImageCreateInfo-pNext-pNext# Each @pNext@ member of any -- structure (including this one) in the @pNext@ chain /must/ be either -- @NULL@ or a pointer to a valid instance of -- 'Vulkan.Extensions.VK_NV_dedicated_allocation.DedicatedAllocationImageCreateInfoNV', -- 'Vulkan.Extensions.VK_ANDROID_external_memory_android_hardware_buffer.ExternalFormatANDROID', -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory.ExternalMemoryImageCreateInfo', -- 'Vulkan.Extensions.VK_NV_external_memory.ExternalMemoryImageCreateInfoNV', -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT', -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierListCreateInfoEXT', -- 'Vulkan.Core12.Promoted_From_VK_KHR_image_format_list.ImageFormatListCreateInfo', -- 'Vulkan.Core12.Promoted_From_VK_EXT_separate_stencil_usage.ImageStencilUsageCreateInfo', -- or 'Vulkan.Extensions.VK_KHR_swapchain.ImageSwapchainCreateInfoKHR' -- -- - #VUID-VkImageCreateInfo-sType-unique# The @sType@ value of each -- struct in the @pNext@ chain /must/ be unique -- -- - #VUID-VkImageCreateInfo-flags-parameter# @flags@ /must/ be a valid -- combination of -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.ImageCreateFlagBits' values -- -- - #VUID-VkImageCreateInfo-imageType-parameter# @imageType@ /must/ be a -- valid 'Vulkan.Core10.Enums.ImageType.ImageType' value -- -- - #VUID-VkImageCreateInfo-format-parameter# @format@ /must/ be a valid -- 'Vulkan.Core10.Enums.Format.Format' value -- -- - #VUID-VkImageCreateInfo-samples-parameter# @samples@ /must/ be a -- valid 'Vulkan.Core10.Enums.SampleCountFlagBits.SampleCountFlagBits' -- value -- -- - #VUID-VkImageCreateInfo-tiling-parameter# @tiling@ /must/ be a valid -- 'Vulkan.Core10.Enums.ImageTiling.ImageTiling' value -- -- - #VUID-VkImageCreateInfo-usage-parameter# @usage@ /must/ be a valid -- combination of -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.ImageUsageFlagBits' values -- -- - #VUID-VkImageCreateInfo-usage-requiredbitmask# @usage@ /must/ not be -- @0@ -- -- - #VUID-VkImageCreateInfo-sharingMode-parameter# @sharingMode@ /must/ -- be a valid 'Vulkan.Core10.Enums.SharingMode.SharingMode' value -- -- - #VUID-VkImageCreateInfo-initialLayout-parameter# @initialLayout@ -- /must/ be a valid 'Vulkan.Core10.Enums.ImageLayout.ImageLayout' -- value -- -- \<\/section> -- = See Also -- -- 'Vulkan.Core10.FundamentalTypes.Extent3D', -- 'Vulkan.Core10.Enums.Format.Format', -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.ImageCreateFlags', -- 'Vulkan.Core10.Enums.ImageLayout.ImageLayout', -- 'Vulkan.Core10.Enums.ImageTiling.ImageTiling', -- 'Vulkan.Core10.Enums.ImageType.ImageType', -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.ImageUsageFlags', -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SampleCountFlagBits', -- 'Vulkan.Core10.Enums.SharingMode.SharingMode', -- 'Vulkan.Core10.Enums.StructureType.StructureType', 'createImage' data ImageCreateInfo (es :: [Type]) = ImageCreateInfo { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure. ImageCreateInfo es -> Chain es next :: Chain es , -- | @flags@ is a bitmask of -- 'Vulkan.Core10.Enums.ImageCreateFlagBits.ImageCreateFlagBits' describing -- additional parameters of the image. ImageCreateInfo es -> ImageCreateFlags flags :: ImageCreateFlags , -- | @imageType@ is a 'Vulkan.Core10.Enums.ImageType.ImageType' value -- specifying the basic dimensionality of the image. Layers in array -- textures do not count as a dimension for the purposes of the image type. ImageCreateInfo es -> ImageType imageType :: ImageType , -- | @format@ is a 'Vulkan.Core10.Enums.Format.Format' describing the format -- and type of the texel blocks that will be contained in the image. ImageCreateInfo es -> Format format :: Format , -- | @extent@ is a 'Vulkan.Core10.FundamentalTypes.Extent3D' describing the -- number of data elements in each dimension of the base level. ImageCreateInfo es -> Extent3D extent :: Extent3D , -- | @mipLevels@ describes the number of levels of detail available for -- minified sampling of the image. ImageCreateInfo es -> Word32 mipLevels :: Word32 , -- | @arrayLayers@ is the number of layers in the image. ImageCreateInfo es -> Word32 arrayLayers :: Word32 , -- | @samples@ is a -- 'Vulkan.Core10.Enums.SampleCountFlagBits.SampleCountFlagBits' specifying -- the number of -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#primsrast-multisampling samples per texel>. ImageCreateInfo es -> SampleCountFlagBits samples :: SampleCountFlagBits , -- | @tiling@ is a 'Vulkan.Core10.Enums.ImageTiling.ImageTiling' value -- specifying the tiling arrangement of the texel blocks in memory. ImageCreateInfo es -> ImageTiling tiling :: ImageTiling , -- | @usage@ is a bitmask of -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.ImageUsageFlagBits' describing -- the intended usage of the image. ImageCreateInfo es -> ImageUsageFlags usage :: ImageUsageFlags , -- | @sharingMode@ is a 'Vulkan.Core10.Enums.SharingMode.SharingMode' value -- specifying the sharing mode of the image when it will be accessed by -- multiple queue families. ImageCreateInfo es -> SharingMode sharingMode :: SharingMode , -- | @pQueueFamilyIndices@ is a list of queue families that will access this -- image (ignored if @sharingMode@ is not -- 'Vulkan.Core10.Enums.SharingMode.SHARING_MODE_CONCURRENT'). ImageCreateInfo es -> Vector Word32 queueFamilyIndices :: Vector Word32 , -- | @initialLayout@ is a 'Vulkan.Core10.Enums.ImageLayout.ImageLayout' value -- specifying the initial 'Vulkan.Core10.Enums.ImageLayout.ImageLayout' of -- all image subresources of the image. See -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-layouts Image Layouts>. ImageCreateInfo es -> ImageLayout initialLayout :: ImageLayout } deriving (Typeable) #if defined(GENERIC_INSTANCES) deriving instance Generic (ImageCreateInfo (es :: [Type])) #endif deriving instance Show (Chain es) => Show (ImageCreateInfo es) instance Extensible ImageCreateInfo where extensibleTypeName :: String extensibleTypeName = "ImageCreateInfo" setNext :: ImageCreateInfo ds -> Chain es -> ImageCreateInfo es setNext x :: ImageCreateInfo ds x next :: Chain es next = ImageCreateInfo ds x{$sel:next:ImageCreateInfo :: Chain es next = Chain es next} getNext :: ImageCreateInfo es -> Chain es getNext ImageCreateInfo{..} = Chain es next extends :: forall e b proxy. Typeable e => proxy e -> (Extends ImageCreateInfo e => b) -> Maybe b extends :: proxy e -> (Extends ImageCreateInfo e => b) -> Maybe b extends _ f :: Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ImageStencilUsageCreateInfo) => Maybe (e :~: ImageStencilUsageCreateInfo) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ImageStencilUsageCreateInfo = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ImageDrmFormatModifierExplicitCreateInfoEXT) => Maybe (e :~: ImageDrmFormatModifierExplicitCreateInfoEXT) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ImageDrmFormatModifierExplicitCreateInfoEXT = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ImageDrmFormatModifierListCreateInfoEXT) => Maybe (e :~: ImageDrmFormatModifierListCreateInfoEXT) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ImageDrmFormatModifierListCreateInfoEXT = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ExternalFormatANDROID) => Maybe (e :~: ExternalFormatANDROID) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ExternalFormatANDROID = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ImageFormatListCreateInfo) => Maybe (e :~: ImageFormatListCreateInfo) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ImageFormatListCreateInfo = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ImageSwapchainCreateInfoKHR) => Maybe (e :~: ImageSwapchainCreateInfoKHR) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ImageSwapchainCreateInfoKHR = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ExternalMemoryImageCreateInfo) => Maybe (e :~: ExternalMemoryImageCreateInfo) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ExternalMemoryImageCreateInfo = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable ExternalMemoryImageCreateInfoNV) => Maybe (e :~: ExternalMemoryImageCreateInfoNV) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @ExternalMemoryImageCreateInfoNV = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Just Refl <- (Typeable e, Typeable DedicatedAllocationImageCreateInfoNV) => Maybe (e :~: DedicatedAllocationImageCreateInfoNV) forall k (a :: k) (b :: k). (Typeable a, Typeable b) => Maybe (a :~: b) eqT @e @DedicatedAllocationImageCreateInfoNV = b -> Maybe b forall a. a -> Maybe a Just b Extends ImageCreateInfo e => b f | Bool otherwise = Maybe b forall a. Maybe a Nothing instance (Extendss ImageCreateInfo es, PokeChain es) => ToCStruct (ImageCreateInfo es) where withCStruct :: ImageCreateInfo es -> (Ptr (ImageCreateInfo es) -> IO b) -> IO b withCStruct x :: ImageCreateInfo es x f :: Ptr (ImageCreateInfo es) -> IO b f = Int -> Int -> (Ptr (ImageCreateInfo es) -> IO b) -> IO b forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b allocaBytesAligned 88 8 ((Ptr (ImageCreateInfo es) -> IO b) -> IO b) -> (Ptr (ImageCreateInfo es) -> IO b) -> IO b forall a b. (a -> b) -> a -> b $ \p :: Ptr (ImageCreateInfo es) p -> Ptr (ImageCreateInfo es) -> ImageCreateInfo es -> IO b -> IO b forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b pokeCStruct Ptr (ImageCreateInfo es) p ImageCreateInfo es x (Ptr (ImageCreateInfo es) -> IO b f Ptr (ImageCreateInfo es) p) pokeCStruct :: Ptr (ImageCreateInfo es) -> ImageCreateInfo es -> IO b -> IO b pokeCStruct p :: Ptr (ImageCreateInfo es) p ImageCreateInfo{..} f :: IO b f = ContT b IO b -> IO b forall (m :: * -> *) r. Monad m => ContT r m r -> m r evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b forall a b. (a -> b) -> a -> b $ do IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr StructureType -> StructureType -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr StructureType forall a b. Ptr a -> Int -> Ptr b `plusPtr` 0 :: Ptr StructureType)) (StructureType STRUCTURE_TYPE_IMAGE_CREATE_INFO) Ptr () pNext'' <- (Ptr (Chain es) -> Ptr ()) -> ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ()) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap Ptr (Chain es) -> Ptr () forall a b. Ptr a -> Ptr b castPtr (ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ())) -> (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es))) -> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()) forall b c a. (b -> c) -> (a -> b) -> a -> c . ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es)) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ())) -> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()) forall a b. (a -> b) -> a -> b $ Chain es -> (Ptr (Chain es) -> IO b) -> IO b forall (es :: [*]) a. PokeChain es => Chain es -> (Ptr (Chain es) -> IO a) -> IO a withChain (Chain es next) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr (Ptr ()) -> Ptr () -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr ()) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr (Ptr ()))) Ptr () pNext'' IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageCreateFlags -> ImageCreateFlags -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageCreateFlags forall a b. Ptr a -> Int -> Ptr b `plusPtr` 16 :: Ptr ImageCreateFlags)) (ImageCreateFlags flags) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageType -> ImageType -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageType forall a b. Ptr a -> Int -> Ptr b `plusPtr` 20 :: Ptr ImageType)) (ImageType imageType) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Format -> Format -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Format forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr Format)) (Format format) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Extent3D -> Extent3D -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Extent3D forall a b. Ptr a -> Int -> Ptr b `plusPtr` 28 :: Ptr Extent3D)) (Extent3D extent) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 40 :: Ptr Word32)) (Word32 mipLevels) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 44 :: Ptr Word32)) (Word32 arrayLayers) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr SampleCountFlagBits -> SampleCountFlagBits -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SampleCountFlagBits forall a b. Ptr a -> Int -> Ptr b `plusPtr` 48 :: Ptr SampleCountFlagBits)) (SampleCountFlagBits samples) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageTiling -> ImageTiling -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageTiling forall a b. Ptr a -> Int -> Ptr b `plusPtr` 52 :: Ptr ImageTiling)) (ImageTiling tiling) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageUsageFlags -> ImageUsageFlags -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageUsageFlags forall a b. Ptr a -> Int -> Ptr b `plusPtr` 56 :: Ptr ImageUsageFlags)) (ImageUsageFlags usage) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr SharingMode -> SharingMode -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SharingMode forall a b. Ptr a -> Int -> Ptr b `plusPtr` 60 :: Ptr SharingMode)) (SharingMode sharingMode) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 64 :: Ptr Word32)) ((Int -> Word32 forall a b. (Integral a, Num b) => a -> b fromIntegral (Vector Word32 -> Int forall a. Vector a -> Int Data.Vector.length (Vector Word32 -> Int) -> Vector Word32 -> Int forall a b. (a -> b) -> a -> b $ (Vector Word32 queueFamilyIndices)) :: Word32)) Ptr Word32 pPQueueFamilyIndices' <- ((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32)) -> ((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32) forall a b. (a -> b) -> a -> b $ Int -> Int -> (Ptr Word32 -> IO b) -> IO b forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b allocaBytesAligned @Word32 ((Vector Word32 -> Int forall a. Vector a -> Int Data.Vector.length (Vector Word32 queueFamilyIndices)) Int -> Int -> Int forall a. Num a => a -> a -> a * 4) 4 IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ (Int -> Word32 -> IO ()) -> Vector Word32 -> IO () forall (m :: * -> *) a b. Monad m => (Int -> a -> m b) -> Vector a -> m () Data.Vector.imapM_ (\i :: Int i e :: Word32 e -> Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (Ptr Word32 pPQueueFamilyIndices' Ptr Word32 -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` (4 Int -> Int -> Int forall a. Num a => a -> a -> a * (Int i)) :: Ptr Word32) (Word32 e)) (Vector Word32 queueFamilyIndices) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr (Ptr Word32) -> Ptr Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr Word32) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 72 :: Ptr (Ptr Word32))) (Ptr Word32 pPQueueFamilyIndices') IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageLayout -> ImageLayout -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageLayout forall a b. Ptr a -> Int -> Ptr b `plusPtr` 80 :: Ptr ImageLayout)) (ImageLayout initialLayout) IO b -> ContT b IO b forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO b -> ContT b IO b) -> IO b -> ContT b IO b forall a b. (a -> b) -> a -> b $ IO b f cStructSize :: Int cStructSize = 88 cStructAlignment :: Int cStructAlignment = 8 pokeZeroCStruct :: Ptr (ImageCreateInfo es) -> IO b -> IO b pokeZeroCStruct p :: Ptr (ImageCreateInfo es) p f :: IO b f = ContT b IO b -> IO b forall (m :: * -> *) r. Monad m => ContT r m r -> m r evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b forall a b. (a -> b) -> a -> b $ do IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr StructureType -> StructureType -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr StructureType forall a b. Ptr a -> Int -> Ptr b `plusPtr` 0 :: Ptr StructureType)) (StructureType STRUCTURE_TYPE_IMAGE_CREATE_INFO) Ptr () pNext' <- (Ptr (Chain es) -> Ptr ()) -> ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ()) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap Ptr (Chain es) -> Ptr () forall a b. Ptr a -> Ptr b castPtr (ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ())) -> (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es))) -> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()) forall b c a. (b -> c) -> (a -> b) -> a -> c . ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es)) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ())) -> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()) forall a b. (a -> b) -> a -> b $ forall a. PokeChain es => (Ptr (Chain es) -> IO a) -> IO a forall (es :: [*]) a. PokeChain es => (Ptr (Chain es) -> IO a) -> IO a withZeroChain @es IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr (Ptr ()) -> Ptr () -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr ()) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr (Ptr ()))) Ptr () pNext' IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageType -> ImageType -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageType forall a b. Ptr a -> Int -> Ptr b `plusPtr` 20 :: Ptr ImageType)) (ImageType forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Format -> Format -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Format forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr Format)) (Format forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Extent3D -> Extent3D -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Extent3D forall a b. Ptr a -> Int -> Ptr b `plusPtr` 28 :: Ptr Extent3D)) (Extent3D forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 40 :: Ptr Word32)) (Word32 forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 44 :: Ptr Word32)) (Word32 forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr SampleCountFlagBits -> SampleCountFlagBits -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SampleCountFlagBits forall a b. Ptr a -> Int -> Ptr b `plusPtr` 48 :: Ptr SampleCountFlagBits)) (SampleCountFlagBits forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageTiling -> ImageTiling -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageTiling forall a b. Ptr a -> Int -> Ptr b `plusPtr` 52 :: Ptr ImageTiling)) (ImageTiling forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageUsageFlags -> ImageUsageFlags -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageUsageFlags forall a b. Ptr a -> Int -> Ptr b `plusPtr` 56 :: Ptr ImageUsageFlags)) (ImageUsageFlags forall a. Zero a => a zero) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr SharingMode -> SharingMode -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SharingMode forall a b. Ptr a -> Int -> Ptr b `plusPtr` 60 :: Ptr SharingMode)) (SharingMode forall a. Zero a => a zero) Ptr Word32 pPQueueFamilyIndices' <- ((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32) forall k (r :: k) (m :: k -> *) a. ((a -> m r) -> m r) -> ContT r m a ContT (((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32)) -> ((Ptr Word32 -> IO b) -> IO b) -> ContT b IO (Ptr Word32) forall a b. (a -> b) -> a -> b $ Int -> Int -> (Ptr Word32 -> IO b) -> IO b forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b allocaBytesAligned @Word32 ((Vector Any -> Int forall a. Vector a -> Int Data.Vector.length (Vector Any forall a. Monoid a => a mempty)) Int -> Int -> Int forall a. Num a => a -> a -> a * 4) 4 IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ (Int -> Word32 -> IO ()) -> Vector Word32 -> IO () forall (m :: * -> *) a b. Monad m => (Int -> a -> m b) -> Vector a -> m () Data.Vector.imapM_ (\i :: Int i e :: Word32 e -> Ptr Word32 -> Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (Ptr Word32 pPQueueFamilyIndices' Ptr Word32 -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` (4 Int -> Int -> Int forall a. Num a => a -> a -> a * (Int i)) :: Ptr Word32) (Word32 e)) (Vector Word32 forall a. Monoid a => a mempty) IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr (Ptr Word32) -> Ptr Word32 -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr Word32) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 72 :: Ptr (Ptr Word32))) (Ptr Word32 pPQueueFamilyIndices') IO () -> ContT b IO () forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO () forall a b. (a -> b) -> a -> b $ Ptr ImageLayout -> ImageLayout -> IO () forall a. Storable a => Ptr a -> a -> IO () poke ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageLayout forall a b. Ptr a -> Int -> Ptr b `plusPtr` 80 :: Ptr ImageLayout)) (ImageLayout forall a. Zero a => a zero) IO b -> ContT b IO b forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO b -> ContT b IO b) -> IO b -> ContT b IO b forall a b. (a -> b) -> a -> b $ IO b f instance (Extendss ImageCreateInfo es, PeekChain es) => FromCStruct (ImageCreateInfo es) where peekCStruct :: Ptr (ImageCreateInfo es) -> IO (ImageCreateInfo es) peekCStruct p :: Ptr (ImageCreateInfo es) p = do Ptr () pNext <- Ptr (Ptr ()) -> IO (Ptr ()) forall a. Storable a => Ptr a -> IO a peek @(Ptr ()) ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr ()) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr (Ptr ()))) Chain es next <- Ptr (Chain es) -> IO (Chain es) forall (es :: [*]). PeekChain es => Ptr (Chain es) -> IO (Chain es) peekChain (Ptr () -> Ptr (Chain es) forall a b. Ptr a -> Ptr b castPtr Ptr () pNext) ImageCreateFlags flags <- Ptr ImageCreateFlags -> IO ImageCreateFlags forall a. Storable a => Ptr a -> IO a peek @ImageCreateFlags ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageCreateFlags forall a b. Ptr a -> Int -> Ptr b `plusPtr` 16 :: Ptr ImageCreateFlags)) ImageType imageType <- Ptr ImageType -> IO ImageType forall a. Storable a => Ptr a -> IO a peek @ImageType ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageType forall a b. Ptr a -> Int -> Ptr b `plusPtr` 20 :: Ptr ImageType)) Format format <- Ptr Format -> IO Format forall a. Storable a => Ptr a -> IO a peek @Format ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Format forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr Format)) Extent3D extent <- Ptr Extent3D -> IO Extent3D forall a. FromCStruct a => Ptr a -> IO a peekCStruct @Extent3D ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Extent3D forall a b. Ptr a -> Int -> Ptr b `plusPtr` 28 :: Ptr Extent3D)) Word32 mipLevels <- Ptr Word32 -> IO Word32 forall a. Storable a => Ptr a -> IO a peek @Word32 ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 40 :: Ptr Word32)) Word32 arrayLayers <- Ptr Word32 -> IO Word32 forall a. Storable a => Ptr a -> IO a peek @Word32 ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 44 :: Ptr Word32)) SampleCountFlagBits samples <- Ptr SampleCountFlagBits -> IO SampleCountFlagBits forall a. Storable a => Ptr a -> IO a peek @SampleCountFlagBits ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SampleCountFlagBits forall a b. Ptr a -> Int -> Ptr b `plusPtr` 48 :: Ptr SampleCountFlagBits)) ImageTiling tiling <- Ptr ImageTiling -> IO ImageTiling forall a. Storable a => Ptr a -> IO a peek @ImageTiling ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageTiling forall a b. Ptr a -> Int -> Ptr b `plusPtr` 52 :: Ptr ImageTiling)) ImageUsageFlags usage <- Ptr ImageUsageFlags -> IO ImageUsageFlags forall a. Storable a => Ptr a -> IO a peek @ImageUsageFlags ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageUsageFlags forall a b. Ptr a -> Int -> Ptr b `plusPtr` 56 :: Ptr ImageUsageFlags)) SharingMode sharingMode <- Ptr SharingMode -> IO SharingMode forall a. Storable a => Ptr a -> IO a peek @SharingMode ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr SharingMode forall a b. Ptr a -> Int -> Ptr b `plusPtr` 60 :: Ptr SharingMode)) Word32 queueFamilyIndexCount <- Ptr Word32 -> IO Word32 forall a. Storable a => Ptr a -> IO a peek @Word32 ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr Word32 forall a b. Ptr a -> Int -> Ptr b `plusPtr` 64 :: Ptr Word32)) Ptr Word32 pQueueFamilyIndices <- Ptr (Ptr Word32) -> IO (Ptr Word32) forall a. Storable a => Ptr a -> IO a peek @(Ptr Word32) ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr (Ptr Word32) forall a b. Ptr a -> Int -> Ptr b `plusPtr` 72 :: Ptr (Ptr Word32))) Vector Word32 pQueueFamilyIndices' <- Int -> (Int -> IO Word32) -> IO (Vector Word32) forall (m :: * -> *) a. Monad m => Int -> (Int -> m a) -> m (Vector a) generateM (Word32 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral Word32 queueFamilyIndexCount) (\i :: Int i -> Ptr Word32 -> IO Word32 forall a. Storable a => Ptr a -> IO a peek @Word32 ((Ptr Word32 pQueueFamilyIndices Ptr Word32 -> Int -> Ptr Word32 forall a. Ptr a -> Int -> Ptr a `advancePtrBytes` (4 Int -> Int -> Int forall a. Num a => a -> a -> a * (Int i)) :: Ptr Word32))) ImageLayout initialLayout <- Ptr ImageLayout -> IO ImageLayout forall a. Storable a => Ptr a -> IO a peek @ImageLayout ((Ptr (ImageCreateInfo es) p Ptr (ImageCreateInfo es) -> Int -> Ptr ImageLayout forall a b. Ptr a -> Int -> Ptr b `plusPtr` 80 :: Ptr ImageLayout)) ImageCreateInfo es -> IO (ImageCreateInfo es) forall (f :: * -> *) a. Applicative f => a -> f a pure (ImageCreateInfo es -> IO (ImageCreateInfo es)) -> ImageCreateInfo es -> IO (ImageCreateInfo es) forall a b. (a -> b) -> a -> b $ Chain es -> ImageCreateFlags -> ImageType -> Format -> Extent3D -> Word32 -> Word32 -> SampleCountFlagBits -> ImageTiling -> ImageUsageFlags -> SharingMode -> Vector Word32 -> ImageLayout -> ImageCreateInfo es forall (es :: [*]). Chain es -> ImageCreateFlags -> ImageType -> Format -> Extent3D -> Word32 -> Word32 -> SampleCountFlagBits -> ImageTiling -> ImageUsageFlags -> SharingMode -> Vector Word32 -> ImageLayout -> ImageCreateInfo es ImageCreateInfo Chain es next ImageCreateFlags flags ImageType imageType Format format Extent3D extent Word32 mipLevels Word32 arrayLayers SampleCountFlagBits samples ImageTiling tiling ImageUsageFlags usage SharingMode sharingMode Vector Word32 pQueueFamilyIndices' ImageLayout initialLayout instance es ~ '[] => Zero (ImageCreateInfo es) where zero :: ImageCreateInfo es zero = Chain es -> ImageCreateFlags -> ImageType -> Format -> Extent3D -> Word32 -> Word32 -> SampleCountFlagBits -> ImageTiling -> ImageUsageFlags -> SharingMode -> Vector Word32 -> ImageLayout -> ImageCreateInfo es forall (es :: [*]). Chain es -> ImageCreateFlags -> ImageType -> Format -> Extent3D -> Word32 -> Word32 -> SampleCountFlagBits -> ImageTiling -> ImageUsageFlags -> SharingMode -> Vector Word32 -> ImageLayout -> ImageCreateInfo es ImageCreateInfo () ImageCreateFlags forall a. Zero a => a zero ImageType forall a. Zero a => a zero Format forall a. Zero a => a zero Extent3D forall a. Zero a => a zero Word32 forall a. Zero a => a zero Word32 forall a. Zero a => a zero SampleCountFlagBits forall a. Zero a => a zero ImageTiling forall a. Zero a => a zero ImageUsageFlags forall a. Zero a => a zero SharingMode forall a. Zero a => a zero Vector Word32 forall a. Monoid a => a mempty ImageLayout forall a. Zero a => a zero -- | VkSubresourceLayout - Structure specifying subresource layout -- -- = Description -- -- If the image is -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-linear-resource linear>, -- then @rowPitch@, @arrayPitch@ and @depthPitch@ describe the layout of -- the image subresource in linear memory. For uncompressed formats, -- @rowPitch@ is the number of bytes between texels with the same x -- coordinate in adjacent rows (y coordinates differ by one). @arrayPitch@ -- is the number of bytes between texels with the same x and y coordinate -- in adjacent array layers of the image (array layer values differ by -- one). @depthPitch@ is the number of bytes between texels with the same x -- and y coordinate in adjacent slices of a 3D image (z coordinates differ -- by one). Expressed as an addressing formula, the starting byte of a -- texel in the image subresource has address: -- -- > // (x,y,z,layer) are in texel coordinates -- > address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*elementSize + offset -- -- For compressed formats, the @rowPitch@ is the number of bytes between -- compressed texel blocks in adjacent rows. @arrayPitch@ is the number of -- bytes between compressed texel blocks in adjacent array layers. -- @depthPitch@ is the number of bytes between compressed texel blocks in -- adjacent slices of a 3D image. -- -- > // (x,y,z,layer) are in compressed texel block coordinates -- > address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*compressedTexelBlockByteSize + offset; -- -- The value of @arrayPitch@ is undefined for images that were not created -- as arrays. @depthPitch@ is defined only for 3D images. -- -- If the image has a /single-plane/ color format and its tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' , then the -- @aspectMask@ member of -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource' /must/ -- be 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_COLOR_BIT'. -- -- If the image has a depth\/stencil format and its tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' , then -- @aspectMask@ /must/ be either -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_DEPTH_BIT' or -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_STENCIL_BIT'. On -- implementations that store depth and stencil aspects separately, -- querying each of these image subresource layouts will return a different -- @offset@ and @size@ representing the region of memory used for that -- aspect. On implementations that store depth and stencil aspects -- interleaved, the same @offset@ and @size@ are returned and represent the -- interleaved memory allocation. -- -- If the image has a -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format> -- and its tiling is 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_LINEAR' -- , then the @aspectMask@ member of -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource' /must/ -- be 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_0_BIT', -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_1_BIT', or -- (for 3-plane formats only) -- 'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_PLANE_2_BIT'. -- Querying each of these image subresource layouts will return a different -- @offset@ and @size@ representing the region of memory used for that -- plane. If the image is /disjoint/, then the @offset@ is relative to the -- base address of the plane. If the image is /non-disjoint/, then the -- @offset@ is relative to the base address of the image. -- -- If the image’s tiling is -- 'Vulkan.Core10.Enums.ImageTiling.IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT', -- then the @aspectMask@ member of -- 'Vulkan.Core10.SparseResourceMemoryManagement.ImageSubresource' /must/ -- be one of @VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT@, where the maximum -- allowed plane index @i@ is defined by the -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.DrmFormatModifierPropertiesEXT'::@drmFormatModifierPlaneCount@ -- associated with the image’s 'ImageCreateInfo'::@format@ and -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-drm-format-modifier modifier>. -- The memory range used by the subresource is described by @offset@ and -- @size@. If the image is /disjoint/, then the @offset@ is relative to the -- base address of the /memory plane/. If the image is /non-disjoint/, then -- the @offset@ is relative to the base address of the image. If the image -- is -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#glossary-linear-resource non-linear>, -- then @rowPitch@, @arrayPitch@, and @depthPitch@ have an -- implementation-dependent meaning. -- -- = See Also -- -- 'Vulkan.Core10.FundamentalTypes.DeviceSize', -- 'Vulkan.Extensions.VK_EXT_image_drm_format_modifier.ImageDrmFormatModifierExplicitCreateInfoEXT', -- 'getImageSubresourceLayout' data SubresourceLayout = SubresourceLayout { -- | @offset@ is the byte offset from the start of the image or the plane -- where the image subresource begins. SubresourceLayout -> DeviceSize offset :: DeviceSize , -- | @size@ is the size in bytes of the image subresource. @size@ includes -- any extra memory that is required based on @rowPitch@. SubresourceLayout -> DeviceSize size :: DeviceSize , -- | @rowPitch@ describes the number of bytes between each row of texels in -- an image. SubresourceLayout -> DeviceSize rowPitch :: DeviceSize , -- | @arrayPitch@ describes the number of bytes between each array layer of -- an image. SubresourceLayout -> DeviceSize arrayPitch :: DeviceSize , -- | @depthPitch@ describes the number of bytes between each slice of 3D -- image. SubresourceLayout -> DeviceSize depthPitch :: DeviceSize } deriving (Typeable, SubresourceLayout -> SubresourceLayout -> Bool (SubresourceLayout -> SubresourceLayout -> Bool) -> (SubresourceLayout -> SubresourceLayout -> Bool) -> Eq SubresourceLayout forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: SubresourceLayout -> SubresourceLayout -> Bool $c/= :: SubresourceLayout -> SubresourceLayout -> Bool == :: SubresourceLayout -> SubresourceLayout -> Bool $c== :: SubresourceLayout -> SubresourceLayout -> Bool Eq) #if defined(GENERIC_INSTANCES) deriving instance Generic (SubresourceLayout) #endif deriving instance Show SubresourceLayout instance ToCStruct SubresourceLayout where withCStruct :: SubresourceLayout -> (("pLayout" ::: Ptr SubresourceLayout) -> IO b) -> IO b withCStruct x :: SubresourceLayout x f :: ("pLayout" ::: Ptr SubresourceLayout) -> IO b f = Int -> Int -> (("pLayout" ::: Ptr SubresourceLayout) -> IO b) -> IO b forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b allocaBytesAligned 40 8 ((("pLayout" ::: Ptr SubresourceLayout) -> IO b) -> IO b) -> (("pLayout" ::: Ptr SubresourceLayout) -> IO b) -> IO b forall a b. (a -> b) -> a -> b $ \p :: "pLayout" ::: Ptr SubresourceLayout p -> ("pLayout" ::: Ptr SubresourceLayout) -> SubresourceLayout -> IO b -> IO b forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b pokeCStruct "pLayout" ::: Ptr SubresourceLayout p SubresourceLayout x (("pLayout" ::: Ptr SubresourceLayout) -> IO b f "pLayout" ::: Ptr SubresourceLayout p) pokeCStruct :: ("pLayout" ::: Ptr SubresourceLayout) -> SubresourceLayout -> IO b -> IO b pokeCStruct p :: "pLayout" ::: Ptr SubresourceLayout p SubresourceLayout{..} f :: IO b f = do Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 0 :: Ptr DeviceSize)) (DeviceSize offset) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr DeviceSize)) (DeviceSize size) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 16 :: Ptr DeviceSize)) (DeviceSize rowPitch) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr DeviceSize)) (DeviceSize arrayPitch) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 32 :: Ptr DeviceSize)) (DeviceSize depthPitch) IO b f cStructSize :: Int cStructSize = 40 cStructAlignment :: Int cStructAlignment = 8 pokeZeroCStruct :: ("pLayout" ::: Ptr SubresourceLayout) -> IO b -> IO b pokeZeroCStruct p :: "pLayout" ::: Ptr SubresourceLayout p f :: IO b f = do Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 0 :: Ptr DeviceSize)) (DeviceSize forall a. Zero a => a zero) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr DeviceSize)) (DeviceSize forall a. Zero a => a zero) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 16 :: Ptr DeviceSize)) (DeviceSize forall a. Zero a => a zero) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr DeviceSize)) (DeviceSize forall a. Zero a => a zero) Ptr DeviceSize -> DeviceSize -> IO () forall a. Storable a => Ptr a -> a -> IO () poke (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 32 :: Ptr DeviceSize)) (DeviceSize forall a. Zero a => a zero) IO b f instance FromCStruct SubresourceLayout where peekCStruct :: ("pLayout" ::: Ptr SubresourceLayout) -> IO SubresourceLayout peekCStruct p :: "pLayout" ::: Ptr SubresourceLayout p = do DeviceSize offset <- Ptr DeviceSize -> IO DeviceSize forall a. Storable a => Ptr a -> IO a peek @DeviceSize (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 0 :: Ptr DeviceSize)) DeviceSize size <- Ptr DeviceSize -> IO DeviceSize forall a. Storable a => Ptr a -> IO a peek @DeviceSize (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 8 :: Ptr DeviceSize)) DeviceSize rowPitch <- Ptr DeviceSize -> IO DeviceSize forall a. Storable a => Ptr a -> IO a peek @DeviceSize (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 16 :: Ptr DeviceSize)) DeviceSize arrayPitch <- Ptr DeviceSize -> IO DeviceSize forall a. Storable a => Ptr a -> IO a peek @DeviceSize (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 24 :: Ptr DeviceSize)) DeviceSize depthPitch <- Ptr DeviceSize -> IO DeviceSize forall a. Storable a => Ptr a -> IO a peek @DeviceSize (("pLayout" ::: Ptr SubresourceLayout p ("pLayout" ::: Ptr SubresourceLayout) -> Int -> Ptr DeviceSize forall a b. Ptr a -> Int -> Ptr b `plusPtr` 32 :: Ptr DeviceSize)) SubresourceLayout -> IO SubresourceLayout forall (f :: * -> *) a. Applicative f => a -> f a pure (SubresourceLayout -> IO SubresourceLayout) -> SubresourceLayout -> IO SubresourceLayout forall a b. (a -> b) -> a -> b $ DeviceSize -> DeviceSize -> DeviceSize -> DeviceSize -> DeviceSize -> SubresourceLayout SubresourceLayout DeviceSize offset DeviceSize size DeviceSize rowPitch DeviceSize arrayPitch DeviceSize depthPitch instance Storable SubresourceLayout where sizeOf :: SubresourceLayout -> Int sizeOf ~SubresourceLayout _ = 40 alignment :: SubresourceLayout -> Int alignment ~SubresourceLayout _ = 8 peek :: ("pLayout" ::: Ptr SubresourceLayout) -> IO SubresourceLayout peek = ("pLayout" ::: Ptr SubresourceLayout) -> IO SubresourceLayout forall a. FromCStruct a => Ptr a -> IO a peekCStruct poke :: ("pLayout" ::: Ptr SubresourceLayout) -> SubresourceLayout -> IO () poke ptr :: "pLayout" ::: Ptr SubresourceLayout ptr poked :: SubresourceLayout poked = ("pLayout" ::: Ptr SubresourceLayout) -> SubresourceLayout -> IO () -> IO () forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b pokeCStruct "pLayout" ::: Ptr SubresourceLayout ptr SubresourceLayout poked (() -> IO () forall (f :: * -> *) a. Applicative f => a -> f a pure ()) instance Zero SubresourceLayout where zero :: SubresourceLayout zero = DeviceSize -> DeviceSize -> DeviceSize -> DeviceSize -> DeviceSize -> SubresourceLayout SubresourceLayout DeviceSize forall a. Zero a => a zero DeviceSize forall a. Zero a => a zero DeviceSize forall a. Zero a => a zero DeviceSize forall a. Zero a => a zero DeviceSize forall a. Zero a => a zero