{-# LINE 1 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.PhysicalDevice.Core (

	-- * ENUMERATE

	enumerate, P, PtrP,

	-- * PROPERTIES

	getProperties, Properties, pattern Properties,
	propertiesApiVersion, propertiesDriverVersion,
	propertiesVendorId, propertiesDeviceId,
	propertiesDeviceType, propertiesDeviceName,
	propertiesPipelineCacheUuid, propertiesLimits,
	propertiesSparseProperties,

	-- ** SparseProperties

	SparseProperties, pattern SparseProperties,
	sparsePropertiesResidencyStandard2DBlockShape,
	sparsePropertiesResidencyStandard2DMultisampleBlockShape,
	sparsePropertiesResidencyStandard3DBlockShape,
	sparsePropertiesResidencyAlignedMipSize,
	sparsePropertiesResidencyNonResidentStrict,

	-- ** ExtensionProperties

	enumerateExtensionProperties,

	-- ** QqueueFamilyProperties

	getQueueFamilyProperties,

	-- ** MemoryProperties

	getMemoryProperties, MemoryProperties, pattern MemoryProperties,
	memoryPropertiesMemoryTypeCount, memoryPropertiesMemoryTypes,
	memoryPropertiesMemoryHeapCount, memoryPropertiesMemoryHeaps,

	-- ** FormatProperties

	getFormatProperties,

	-- * FEATURES

	-- ** Get Features

	getFeatures, Features, pattern Features, getClearedFeatures,

	-- ** Get Features 2

	getFeatures2, Features2,
	pattern Features2, features2SType, features2PNext, features2Features,
	Vulkan12Features, pattern Vulkan12Features, getClearedVulkan12Features,
	Vulkan13Features, pattern Vulkan13Features, getClearedVulkan13Features,
	DescriptorIndexingFeatures, pattern DescriptorIndexingFeatures,
	getClearedDescriptorIndexingFeatures,

	-- ** ShaderDrawParametersFeatures

	ShaderDrawParametersFeatures, pattern ShaderDrawParametersFeatures,
	shaderDrawParametersFeaturesSType, shaderDrawParametersFeaturesPNext,
	shaderDrawParametersFeaturesShaderDrawParameters

	) where

import Foreign.Ptr
import Foreign.Concurrent
import Foreign.Marshal
import Foreign.Storable
import Foreign.C.String
import Foreign.C.Struct
import Foreign.C.Struct.TypeSynonyms
import Data.Word
import Data.Int
import Data.Text.Tools

import qualified Data.Text as T

-- import Gpu.Vulkan.Base

import Gpu.Vulkan.Core (ExtensionProperties, FormatProperties)
import Gpu.Vulkan.TypeSynonyms.Core
import Gpu.Vulkan.PhysicalDevice.Struct.Core

import qualified Gpu.Vulkan.Instance.Core as Instance
import qualified Gpu.Vulkan.QueueFamily.Core as QueueFamily
import qualified Gpu.Vulkan.Memory.Core as Memory



data PTag
type P = Ptr PTag
type PtrP = Ptr P

foreign import ccall "vkEnumeratePhysicalDevices" enumerate ::
	Instance.I -> Ptr Word32 -> Ptr P ->
{-# LINE 102 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	IO Int32
{-# LINE 103 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

struct "SparseProperties" (20)
{-# LINE 105 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		4 [
{-# LINE 106 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("residencyStandard2DBlockShape", ''Word32,
{-# LINE 107 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 0) |],
{-# LINE 109 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 0) |]),
{-# LINE 111 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("residencyStandard2DMultisampleBlockShape", ''Word32,
{-# LINE 112 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 4) |],
{-# LINE 114 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 4) |]),
{-# LINE 116 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("residencyStandard3DBlockShape", ''Word32,
{-# LINE 117 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 8) |],
{-# LINE 119 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 8) |]),
{-# LINE 121 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("residencyAlignedMipSize", ''Word32,
{-# LINE 122 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 12) |],
{-# LINE 124 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 12) |]),
{-# LINE 126 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("residencyNonResidentStrict", ''Word32,
{-# LINE 127 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 16) |],
{-# LINE 129 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 16) |]) ]
{-# LINE 131 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	[''Show, ''Storable]

struct "Properties" (824)
{-# LINE 134 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		8 [
{-# LINE 135 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("apiVersion", ''Word32,
{-# LINE 136 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 0) |],
{-# LINE 137 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 0) |]),
{-# LINE 138 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("driverVersion", ''Word32,
{-# LINE 139 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 4) |],
{-# LINE 140 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 4) |]),
{-# LINE 141 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("vendorId", ''Word32,
{-# LINE 142 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 8) |],
{-# LINE 143 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 8) |]),
{-# LINE 144 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("deviceId", ''Word32,
{-# LINE 145 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 12) |],
{-# LINE 146 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 12) |]),
{-# LINE 147 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("deviceType", ''Word32,
{-# LINE 148 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 16) |],
{-# LINE 149 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 16) |]),
{-# LINE 150 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("deviceName", ''T.Text,
		[| cstringToText
			. (\hsc_ptr -> hsc_ptr `plusPtr` 20) |],
{-# LINE 153 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| \p -> pokeText maxNameSize
			((\hsc_ptr -> hsc_ptr `plusPtr` 20) p) |]),
{-# LINE 155 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("pipelineCacheUuid", ''ListUint8T,
		[| peekArray 16
{-# LINE 157 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			. (\hsc_ptr -> hsc_ptr `plusPtr` 276)
{-# LINE 158 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			|],
		[| \p -> pokeArray
			((\hsc_ptr -> hsc_ptr `plusPtr` 276) p)
{-# LINE 161 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
				. take 16 |]),
{-# LINE 162 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("limits", ''Limits,
		[| (\hsc_ptr -> peekByteOff hsc_ptr 296) |],
{-# LINE 164 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 296) |]),
{-# LINE 165 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("sparseProperties", ''SparseProperties,
		[| (\hsc_ptr -> peekByteOff hsc_ptr 800) |],
{-# LINE 167 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 800) |]) ]
{-# LINE 168 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	[''Show, ''Storable]

maxNameSize :: Integral n => n
maxNameSize :: forall n. Integral n => n
maxNameSize = n
256
{-# LINE 172 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

foreign import ccall "vkGetPhysicalDeviceProperties" getProperties ::
	P -> Ptr Properties -> IO ()

getClearedFeatures :: IO Features
getClearedFeatures :: IO Features
getClearedFeatures = do
	pf <- IO (Ptr Features)
forall a. Storable a => IO (Ptr a)
calloc
	Features_ <$> newForeignPtr pf (free pf)

foreign import ccall "vkGetPhysicalDeviceFeatures" getFeatures ::
	P -> Ptr Features -> IO ()

sTypeFeatures2 :: Word32
{-# LINE 185 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
sTypeFeatures2 = 1000059000
{-# LINE 186 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

struct "Features2"
	(240)
{-# LINE 189 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	8 [
{-# LINE 190 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("sType", ''(), [| const $ pure () |],
		[| \p _ -> (\hsc_ptr -> pokeByteOff hsc_ptr 0)
{-# LINE 192 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			p sTypeFeatures2 |]),
	("pNext", ''PtrVoid,
		[| (\hsc_ptr -> peekByteOff hsc_ptr 8) |],
{-# LINE 195 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 8) |]),
{-# LINE 196 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("features", ''Features,
		[| peek . (\hsc_ptr -> hsc_ptr `plusPtr` 16) |],
{-# LINE 198 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| poke . (\hsc_ptr -> hsc_ptr `plusPtr` 16) |]) ]
{-# LINE 199 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	[''Show, ''Storable]

foreign import ccall "vkGetPhysicalDeviceFeatures2" getFeatures2 ::
	P -> Ptr Features2 -> IO ()

foreign import ccall "vkGetPhysicalDeviceQueueFamilyProperties"
	getQueueFamilyProperties ::
	P -> Ptr Word32 -> Ptr QueueFamily.Properties ->
{-# LINE 207 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	IO ()

getClearedVulkan12Features :: IO Vulkan12Features
getClearedVulkan12Features :: IO Vulkan12Features
getClearedVulkan12Features = do
	pf <- IO (Ptr Vulkan12Features)
forall a. Storable a => IO (Ptr a)
calloc
	zero <- Vulkan12Features_ <$> newForeignPtr pf (free pf)
	pure $ zero { vulkan12FeaturesSType = () }

getClearedVulkan13Features :: IO Vulkan13Features
getClearedVulkan13Features :: IO Vulkan13Features
getClearedVulkan13Features = do
	pf <- IO (Ptr Vulkan13Features)
forall a. Storable a => IO (Ptr a)
calloc
	zero <- Vulkan13Features_ <$> newForeignPtr pf (free pf)
	pure $ zero { vulkan13FeaturesSType = () }

getClearedDescriptorIndexingFeatures :: IO DescriptorIndexingFeatures
getClearedDescriptorIndexingFeatures :: IO DescriptorIndexingFeatures
getClearedDescriptorIndexingFeatures = do
	pf <- IO (Ptr DescriptorIndexingFeatures)
forall a. Storable a => IO (Ptr a)
calloc
	zero <- DescriptorIndexingFeatures_ <$> newForeignPtr pf (free pf)
	pure $ zero { descriptorIndexingFeaturesSType = () }

foreign import ccall "vkEnumerateDeviceExtensionProperties"
	enumerateExtensionProperties ::
	P -> CString -> Ptr Word32 ->
{-# LINE 230 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	Ptr ExtensionProperties -> IO Int32
{-# LINE 231 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

struct "MemoryProperties" (520)
{-# LINE 233 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		8 [
{-# LINE 234 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("memoryTypeCount", ''Word32,
{-# LINE 235 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 0) |],
{-# LINE 236 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 0) |]),
{-# LINE 238 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("memoryTypes", ''Memory.ListMType,
		[| \p -> peekArray Memory.maxTypes
			$ (\hsc_ptr -> hsc_ptr `plusPtr` 4) p
{-# LINE 241 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			|],
		[| \p -> pokeArray
				((\hsc_ptr -> hsc_ptr `plusPtr` 4) p)
{-# LINE 245 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			. take Memory.maxTypes |]),
	("memoryHeapCount", ''Word32,
{-# LINE 247 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 260) |],
{-# LINE 248 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 260) |]),
{-# LINE 250 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("memoryHeaps", ''Memory.ListHeap,
		[| \p -> peekArray Memory.maxHeaps
			$ (\hsc_ptr -> hsc_ptr `plusPtr` 264) p
{-# LINE 253 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			|],
		[| \p -> pokeArray
				((\hsc_ptr -> hsc_ptr `plusPtr` 264) p) .
{-# LINE 257 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
			take Memory.maxHeaps |]) ]
	[''Show, ''Storable]

foreign import ccall "vkGetPhysicalDeviceMemoryProperties"
	getMemoryProperties :: P -> Ptr MemoryProperties -> IO ()

foreign import ccall "vkGetPhysicalDeviceFormatProperties"
	getFormatProperties ::
	P -> Word32 -> Ptr FormatProperties -> IO ()
{-# LINE 266 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

shaderDrawParametersFeaturesType :: Word32
{-# LINE 268 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
shaderDrawParametersFeaturesType =
	1000063000
{-# LINE 270 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}

struct "ShaderDrawParametersFeatures"
	(24)
{-# LINE 273 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	8 [
{-# LINE 274 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("sType", ''(), [| const $ pure () |],
		[| \p _ ->
			(\hsc_ptr -> pokeByteOff hsc_ptr 0) p shaderDrawParametersFeaturesType |]),
{-# LINE 278 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("pNext", ''PtrVoid,
		[| (\hsc_ptr -> peekByteOff hsc_ptr 8) |],
{-# LINE 280 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 8) |]),
{-# LINE 281 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	("shaderDrawParameters", ''Word32,
{-# LINE 282 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> peekByteOff hsc_ptr 16) |],
{-# LINE 284 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
		[| (\hsc_ptr -> pokeByteOff hsc_ptr 16) |]) ]
{-# LINE 286 "src/Gpu/Vulkan/PhysicalDevice/Core.hsc" #-}
	[''Show, ''Storable]