Orange/include/Orange/Render/VulkanHelpers.h

79 lines
2.5 KiB
C
Raw Normal View History

2022-08-04 03:00:54 +01:00
#pragma once
#include <Orange/Core/Traits.h>
2022-08-12 21:18:11 +01:00
#include <Orange/Core/Result.h>
2022-08-04 18:23:08 +01:00
#include <vulkan/vulkan_core.h>
2022-08-04 03:00:54 +01:00
namespace orange
{
template <typename Func, typename OutArray, typename... Args>
uint32_t VkEnumerate(Func function, OutArray& outArray, Args&&... arguments)
{
uint32_t count = 0;
function(arguments..., &count, nullptr);
outArray.resize(count);
2022-08-04 03:00:54 +01:00
if (!count)
return 0;
function(Forward<Args>(arguments)..., &count, outArray.data());
2022-08-04 03:00:54 +01:00
return count;
}
2022-08-04 18:23:08 +01:00
2022-08-13 07:18:10 +01:00
static constexpr VkImageSubresourceRange FirstColorMipSubresourceRange =
2022-08-04 18:23:08 +01:00
{
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = 1,
};
2022-08-12 13:34:04 +01:00
2022-08-13 07:18:10 +01:00
static constexpr VkImageSubresourceRange FirstDepthMipSubresourceRange =
{
2022-08-13 22:19:29 +01:00
.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT,
2022-08-13 07:18:10 +01:00
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = 1,
};
2022-08-12 13:34:04 +01:00
constexpr VkFormat FormatToSrgbFormat(VkFormat format)
{
switch (format)
{
case VK_FORMAT_R8G8B8A8_UNORM:
return VK_FORMAT_R8G8B8A8_SRGB;
case VK_FORMAT_B8G8R8A8_UNORM:
return VK_FORMAT_B8G8R8A8_SRGB;
default:
return format;
}
}
2022-08-12 21:18:11 +01:00
template <typename... Formats>
Result<VkFormat> FindSupportedFormat(VkPhysicalDevice physicalDevice, VkImageTiling tiling, VkFormatFeatureFlags features, Formats... formats)
{
for (auto& format : {formats...})
{
VkFormatProperties props;
vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);
if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features)
return Result<VkFormat>::Success(format);
if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features)
return Result<VkFormat>::Success(format);
}
return Result<VkFormat>::Error(BasicErrorCode::NotFound);
}
2022-08-13 07:18:10 +01:00
inline Result<VkFormat> FindDepthFormat(VkPhysicalDevice physicalDevice)
{
return FindSupportedFormat(physicalDevice, VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT,
VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT);
}
2022-08-04 03:00:54 +01:00
}