import vulkan
, vulkan_utils
import std/bitops
type
Depth_Stencil* = object #of RootObj
memory*: VkDeviceMemory
image*: VkImage
view*: VkImageView
proc create_depth_stencil*( device: VkDevice
, image_format: VKFormat
, depth_format: VKFormat
, current_extent: VkExtent2D
, gpu_memory_properties: VkPhysicalDeviceMemoryProperties
): Depth_Stencil =
result = Depth_Stencil()
var
memReqs: VkMemoryRequirements
memAllloc: VkMemoryAllocateInfo
imageViewCI: VkImageViewCreateInfo
imageCI = VkImageCreateInfo( sType: VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
, imageType: VK_IMAGE_TYPE_2D
, format: depth_format
, extent: VkExtent3D( width: current_extent.width
, height: current_extent.height
, depth: 1
)
, mipLevels: 1
, arrayLayers: 1
, samples: VK_SAMPLE_COUNT_1_BIT
, tiling: VK_IMAGE_TILING_OPTIMAL
, usage: VkImageUsageFlags VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
, initialLayout: VK_IMAGE_LAYOUT_UNDEFINED
)
assert vkCreateImage( device
, addr imageCI
, nil
, addr result.image
) == VK_SUCCESS
# Allocate memory for the image (device local) and bind it to our image
memAllloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO
vkGetImageMemoryRequirements( device
, result.image
, addr memReqs
)
memAllloc.allocationSize = memReqs.size
memAllloc.memoryTypeIndex = find_memory_with_property( gpu_memory_properties
, memReqs.memoryTypeBits
, VkMemoryPropertyFlags VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
)
assert vkAllocateMemory( device
, addr memAllloc
, nil
, addr result.memory
) == VK_SUCCESS
assert vkBindImageMemory( device
, result.image
, result.memory
, VkDeviceSize 0
) == VK_SUCCESS
# Create a view for the depth stencil image
# Images aren't directly accessed in Vulkan, but rather through views described by a subresource range
# This allows for multiple views of one image with differing ranges (e.g. for different layers)
imageViewCI.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D
imageViewCI.format = depth_format
imageViewCI.subresourceRange.aspectMask = VkImageAspectFlags bitor( VK_IMAGE_ASPECT_DEPTH_BIT.int
, VK_IMAGE_ASPECT_STENCIL_BIT.int
)
imageViewCI.subresourceRange.baseMipLevel = 0
imageViewCI.subresourceRange.levelCount = 1
imageViewCI.subresourceRange.baseArrayLayer = 0
imageViewCI.subresourceRange.layerCount = 1
imageViewCI.image = result.image
assert vkCreateImageView( device
, addr imageViewCI
, nil
, addr result.view
) == VK_SUCCESS
proc destroyDepthStencil*( device: VkDevice
, depth_stencil: var Depth_Stencil
) =
discard vkDeviceWaitIdle device
vkDestroyImageView( device
, depth_stencil.view
, nil
)
vkDestroyImage( device
, depth_stencil.image
, nil
)
vkFreeMemory( device
, depth_stencil.memory
, nil
)