gpu-vulkan-core-0.1.0.11: src/Gpu/Vulkan/Image/Core.hsc
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.Image.Core (
-- * CREATE AND DESTROY
create, destroy, I, CreateInfo, pattern CreateInfo,
createInfoSType, createInfoPNext, createInfoFlags,
createInfoImageType, createInfoFormat, createInfoExtent,
createInfoMipLevels, createInfoArrayLayers, createInfoSamples,
createInfoTiling, createInfoUsage, createInfoSharingMode,
createInfoQueueFamilyIndexCount, createInfoPQueueFamilyIndices,
createInfoInitialLayout,
-- * MEMORY: REQUIREMENTS AND BINDING
getMemoryRequirements, bindMemory,
-- * MEMORY BARRIER
MemoryBarrier, pattern MemoryBarrier,
memoryBarrierSType, memoryBarrierPNext,
memoryBarrierSrcAccessMask, memoryBarrierDstAccessMask,
memoryBarrierOldLayout, memoryBarrierNewLayout,
memoryBarrierSrcQueueFamilyIndex, memoryBarrierDstQueueFamilyIndex,
memoryBarrierImage, memoryBarrierSubresourceRange,
-- ** SubresourceRange
SubresourceRange, pattern SubresourceRange,
subresourceRangeAspectMask, subresourceRangeBaseMipLevel,
subresourceRangeLevelCount, subresourceRangeBaseArrayLayer,
subresourceRangeLayerCount,
-- * BLIT
Blit, pattern Blit,
blitSrcSubresource, blitSrcOffsets, blitDstSubresource, blitDstOffsets,
-- ** SubresourceLayers
SubresourceLayers, pattern SubresourceLayers,
subresourceLayersAspectMask, subresourceLayersMipLevel,
subresourceLayersBaseArrayLayer, subresourceLayersLayerCount,
-- * Subresource
Subresource, pattern Subresource,
subresourceAspectMask, subresourceMipLevel,
subresourceArrayLayer
) where
import Foreign.Ptr
import Foreign.Marshal.Array
import Foreign.Storable
import Foreign.C.Struct
import Foreign.C.Struct.TypeSynonyms
import Data.Word
import Data.Int
import Gpu.Vulkan.Core
import Gpu.Vulkan.TypeSynonyms.Core
import Gpu.Vulkan.AllocationCallbacks.Core qualified as AllocationCallbacks
import {-# SOURCE #-} Gpu.Vulkan.Device.Core qualified as Device
import Gpu.Vulkan.Memory.Core qualified as Memory
#include <vulkan/vulkan.h>
struct "SubresourceRange" #{size VkImageSubresourceRange}
#{alignment VkImageSubresourceRange} [
("aspectMask", ''#{type VkImageAspectFlags},
[| #{peek VkImageSubresourceRange, aspectMask} |],
[| #{poke VkImageSubresourceRange, aspectMask} |]),
("baseMipLevel", ''#{type uint32_t},
[| #{peek VkImageSubresourceRange, baseMipLevel} |],
[| #{poke VkImageSubresourceRange, baseMipLevel} |]),
("levelCount", ''#{type uint32_t},
[| #{peek VkImageSubresourceRange, levelCount} |],
[| #{poke VkImageSubresourceRange, levelCount} |]),
("baseArrayLayer", ''#{type uint32_t},
[| #{peek VkImageSubresourceRange, baseArrayLayer} |],
[| #{poke VkImageSubresourceRange, baseArrayLayer} |]),
("layerCount", ''#{type uint32_t},
[| #{peek VkImageSubresourceRange, layerCount} |],
[| #{poke VkImageSubresourceRange, layerCount} |]) ]
[''Show, ''Storable]
data ITag
type I = Ptr ITag
sType :: #{type VkStructureType}
sType = #{const VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}
struct "CreateInfo" #{size VkImageCreateInfo} #{alignment VkImageCreateInfo} [
("sType", ''(), [| const $ pure () |],
[| \p _ -> #{poke VkImageCreateInfo, sType} p sType |]),
("pNext", ''PtrVoid,
[| #{peek VkImageCreateInfo, pNext} |],
[| #{poke VkImageCreateInfo, pNext} |]),
("flags", ''#{type VkImageCreateFlags},
[| #{peek VkImageCreateInfo, flags} |],
[| #{poke VkImageCreateInfo, flags} |]),
("imageType", ''#{type VkImageType},
[| #{peek VkImageCreateInfo, imageType} |],
[| #{poke VkImageCreateInfo, imageType} |]),
("format", ''#{type VkFormat},
[| #{peek VkImageCreateInfo, format} |],
[| #{poke VkImageCreateInfo, format} |]),
("extent", ''Extent3d,
[| #{peek VkImageCreateInfo, extent} |],
[| #{poke VkImageCreateInfo, extent} |]),
("mipLevels", ''#{type uint32_t},
[| #{peek VkImageCreateInfo, mipLevels} |],
[| #{poke VkImageCreateInfo, mipLevels} |]),
("arrayLayers", ''#{type uint32_t},
[| #{peek VkImageCreateInfo, arrayLayers} |],
[| #{poke VkImageCreateInfo, arrayLayers} |]),
("samples", ''#{type VkSampleCountFlagBits},
[| #{peek VkImageCreateInfo, samples} |],
[| #{poke VkImageCreateInfo, samples} |]),
("tiling", ''#{type VkImageTiling},
[| #{peek VkImageCreateInfo, tiling} |],
[| #{poke VkImageCreateInfo, tiling} |]),
("usage", ''#{type VkImageUsageFlags},
[| #{peek VkImageCreateInfo, usage} |],
[| #{poke VkImageCreateInfo, usage} |]),
("sharingMode", ''#{type VkSharingMode},
[| #{peek VkImageCreateInfo, sharingMode} |],
[| #{poke VkImageCreateInfo, sharingMode} |]),
("queueFamilyIndexCount", ''#{type uint32_t},
[| #{peek VkImageCreateInfo, queueFamilyIndexCount} |],
[| #{poke VkImageCreateInfo, queueFamilyIndexCount} |]),
("pQueueFamilyIndices", ''PtrUint32T,
[| #{peek VkImageCreateInfo, pQueueFamilyIndices} |],
[| #{poke VkImageCreateInfo, pQueueFamilyIndices} |]),
("initialLayout", ''#{type VkImageLayout},
[| #{peek VkImageCreateInfo, initialLayout} |],
[| #{poke VkImageCreateInfo, initialLayout} |]) ]
[''Show, ''Storable]
foreign import ccall "vkCreateImage" create ::
Device.D -> Ptr CreateInfo -> Ptr AllocationCallbacks.A -> Ptr I ->
IO #{type VkResult}
foreign import ccall "vkGetImageMemoryRequirements" getMemoryRequirements ::
Device.D -> I -> Ptr Memory.Requirements -> IO ()
foreign import ccall "vkBindImageMemory" bindMemory ::
Device.D -> I -> Memory.M -> #{type VkDeviceSize} ->
IO #{type VkResult}
mbType :: #{type VkStructureType}
mbType = #{const VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER}
struct "MemoryBarrier" #{size VkImageMemoryBarrier}
#{alignment VkImageMemoryBarrier} [
("sType", ''(), [| const $ pure () |],
[| \p _ -> #{poke VkImageMemoryBarrier, sType} p mbType |]),
("pNext", ''PtrVoid,
[| #{peek VkImageMemoryBarrier, pNext} |],
[| #{poke VkImageMemoryBarrier, pNext} |]),
("srcAccessMask", ''#{type VkAccessFlags},
[| #{peek VkImageMemoryBarrier, srcAccessMask} |],
[| #{poke VkImageMemoryBarrier, srcAccessMask} |]),
("dstAccessMask", ''#{type VkAccessFlags},
[| #{peek VkImageMemoryBarrier, dstAccessMask} |],
[| #{poke VkImageMemoryBarrier, dstAccessMask} |]),
("oldLayout", ''#{type VkImageLayout},
[| #{peek VkImageMemoryBarrier, oldLayout} |],
[| #{poke VkImageMemoryBarrier, oldLayout} |]),
("newLayout", ''#{type VkImageLayout},
[| #{peek VkImageMemoryBarrier, newLayout} |],
[| #{poke VkImageMemoryBarrier, newLayout} |]),
("srcQueueFamilyIndex", ''#{type uint32_t},
[| #{peek VkImageMemoryBarrier, srcQueueFamilyIndex} |],
[| #{poke VkImageMemoryBarrier, srcQueueFamilyIndex} |]),
("dstQueueFamilyIndex", ''#{type uint32_t},
[| #{peek VkImageMemoryBarrier, dstQueueFamilyIndex} |],
[| #{poke VkImageMemoryBarrier, dstQueueFamilyIndex} |]),
("image", ''I,
[| #{peek VkImageMemoryBarrier, image} |],
[| #{poke VkImageMemoryBarrier, image} |]),
("subresourceRange", ''SubresourceRange,
[| #{peek VkImageMemoryBarrier, subresourceRange} |],
[| #{poke VkImageMemoryBarrier, subresourceRange} |]) ]
[''Show, ''Storable]
struct "SubresourceLayers" #{size VkImageSubresourceLayers}
#{alignment VkImageSubresourceLayers} [
("aspectMask", ''#{type VkImageAspectFlags},
[| #{peek VkImageSubresourceLayers, aspectMask} |],
[| #{poke VkImageSubresourceLayers, aspectMask} |]),
("mipLevel", ''#{type uint32_t},
[| #{peek VkImageSubresourceLayers, mipLevel} |],
[| #{poke VkImageSubresourceLayers, mipLevel} |]),
("baseArrayLayer", ''#{type uint32_t},
[| #{peek VkImageSubresourceLayers, baseArrayLayer} |],
[| #{poke VkImageSubresourceLayers, baseArrayLayer} |]),
("layerCount", ''#{type uint32_t},
[| #{peek VkImageSubresourceLayers, layerCount} |],
[| #{poke VkImageSubresourceLayers, layerCount} |]) ]
[''Show, ''Storable]
foreign import ccall "vkDestroyImage" destroy ::
Device.D -> I -> Ptr AllocationCallbacks.A -> IO ()
struct "Blit" #{size VkImageBlit} #{alignment VkImageBlit} [
("srcSubresource", ''SubresourceLayers,
[| #{peek VkImageBlit, srcSubresource} |],
[| #{poke VkImageBlit, srcSubresource} |]),
("srcOffsets", ''ListOffset3d,
[| \p -> peekArray 2 (#{ptr VkImageBlit, srcOffsets} p) |],
[| \p os -> pokeArray
(#{ptr VkImageBlit, srcOffsets} p) $ take 2 os |]),
("dstSubresource", ''SubresourceLayers,
[| #{peek VkImageBlit, dstSubresource} |],
[| #{poke VkImageBlit, dstSubresource} |]),
("dstOffsets", ''ListOffset3d,
[| \p -> peekArray 2 (#{ptr VkImageBlit, dstOffsets} p) |],
[| \p os -> pokeArray
(#{ptr VkImageBlit, dstOffsets} p) $ take 2 os |]) ]
[''Show, ''Storable]
struct "Subresource" #{size VkImageSubresource}
#{alignment VkImageSubresource} [
("aspectMask", ''#{type VkImageAspectFlags},
[| #{peek VkImageSubresource, aspectMask} |],
[| #{poke VkImageSubresource, aspectMask} |]),
("mipLevel", ''#{type uint32_t},
[| #{peek VkImageSubresource, mipLevel} |],
[| #{poke VkImageSubresource, mipLevel} |]),
("arrayLayer", ''#{type uint32_t},
[| #{peek VkImageSubresource, arrayLayer} |],
[| #{poke VkImageSubresource, arrayLayer} |]) ]
[''Show, ''Storable]