mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-08-03 19:28:31 +00:00
128 lines
5.9 KiB
C++
128 lines
5.9 KiB
C++
#include "graphics/host_gpu/vulkanCommon.h"
|
|
|
|
#include "common/assert.h"
|
|
#include "graphics/guest_gpu/gpu_defs.h"
|
|
|
|
#include <array>
|
|
|
|
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
|
|
|
namespace Libs::Graphics {
|
|
namespace {
|
|
|
|
struct FormatMapping {
|
|
Prospero::BufferFormat guest;
|
|
vk::Format host;
|
|
};
|
|
|
|
constexpr FormatMapping kFormatMappings[] = {
|
|
{Prospero::BufferFormat::k8UNorm, vk::Format::eR8Unorm},
|
|
{Prospero::BufferFormat::k8UInt, vk::Format::eR8Uint},
|
|
{Prospero::BufferFormat::k16UNorm, vk::Format::eR16Unorm},
|
|
{Prospero::BufferFormat::k16SNorm, vk::Format::eR16Snorm},
|
|
{Prospero::BufferFormat::k16UInt, vk::Format::eR16Uint},
|
|
{Prospero::BufferFormat::k16SInt, vk::Format::eR16Sint},
|
|
{Prospero::BufferFormat::k16Float, vk::Format::eR16Sfloat},
|
|
{Prospero::BufferFormat::k8_8UNorm, vk::Format::eR8G8Unorm},
|
|
{Prospero::BufferFormat::k8_8SNorm, vk::Format::eR8G8Snorm},
|
|
{Prospero::BufferFormat::k8_8UInt, vk::Format::eR8G8Uint},
|
|
{Prospero::BufferFormat::k8_8SInt, vk::Format::eR8G8Sint},
|
|
{Prospero::BufferFormat::k32UInt, vk::Format::eR32Uint},
|
|
{Prospero::BufferFormat::k32SInt, vk::Format::eR32Sint},
|
|
{Prospero::BufferFormat::k32Float, vk::Format::eR32Sfloat},
|
|
{Prospero::BufferFormat::k16_16UNorm, vk::Format::eR16G16Unorm},
|
|
{Prospero::BufferFormat::k16_16SNorm, vk::Format::eR16G16Snorm},
|
|
{Prospero::BufferFormat::k16_16UInt, vk::Format::eR16G16Uint},
|
|
{Prospero::BufferFormat::k16_16SInt, vk::Format::eR16G16Sint},
|
|
{Prospero::BufferFormat::k16_16Float, vk::Format::eR16G16Sfloat},
|
|
{Prospero::BufferFormat::k11_11_10Float, vk::Format::eB10G11R11UfloatPack32},
|
|
{Prospero::BufferFormat::k10_10_10_2UNorm, vk::Format::eA2B10G10R10UnormPack32},
|
|
{Prospero::BufferFormat::k10_10_10_2UInt, vk::Format::eA2B10G10R10UintPack32},
|
|
{Prospero::BufferFormat::k8_8_8_8UNorm, vk::Format::eR8G8B8A8Unorm},
|
|
{Prospero::BufferFormat::k8_8_8_8SNorm, vk::Format::eR8G8B8A8Snorm},
|
|
{Prospero::BufferFormat::k8_8_8_8UInt, vk::Format::eR8G8B8A8Uint},
|
|
{Prospero::BufferFormat::k8_8_8_8SInt, vk::Format::eR8G8B8A8Sint},
|
|
{Prospero::BufferFormat::k32_32UInt, vk::Format::eR32G32Uint},
|
|
{Prospero::BufferFormat::k32_32SInt, vk::Format::eR32G32Sint},
|
|
{Prospero::BufferFormat::k32_32Float, vk::Format::eR32G32Sfloat},
|
|
{Prospero::BufferFormat::k16_16_16_16UNorm, vk::Format::eR16G16B16A16Unorm},
|
|
{Prospero::BufferFormat::k16_16_16_16SNorm, vk::Format::eR16G16B16A16Snorm},
|
|
{Prospero::BufferFormat::k16_16_16_16UInt, vk::Format::eR16G16B16A16Uint},
|
|
{Prospero::BufferFormat::k16_16_16_16SInt, vk::Format::eR16G16B16A16Sint},
|
|
{Prospero::BufferFormat::k16_16_16_16Float, vk::Format::eR16G16B16A16Sfloat},
|
|
{Prospero::BufferFormat::k32_32_32UInt, vk::Format::eR32G32B32Uint},
|
|
{Prospero::BufferFormat::k32_32_32SInt, vk::Format::eR32G32B32Sint},
|
|
{Prospero::BufferFormat::k32_32_32Float, vk::Format::eR32G32B32Sfloat},
|
|
{Prospero::BufferFormat::k32_32_32_32UInt, vk::Format::eR32G32B32A32Uint},
|
|
{Prospero::BufferFormat::k32_32_32_32SInt, vk::Format::eR32G32B32A32Sint},
|
|
{Prospero::BufferFormat::k32_32_32_32Float, vk::Format::eR32G32B32A32Sfloat},
|
|
// Narrow-channel sRGB formats are optional in Vulkan. Keep a same-width fallback until
|
|
// sampler-aware sRGB emulation is available.
|
|
{Prospero::BufferFormat::k8Srgb, vk::Format::eR8Unorm},
|
|
{Prospero::BufferFormat::k8_8Srgb, vk::Format::eR8G8Unorm},
|
|
{Prospero::BufferFormat::k8_8_8_8Srgb, vk::Format::eR8G8B8A8Srgb},
|
|
{Prospero::BufferFormat::k9_9_9_5Float, vk::Format::eE5B9G9R9UfloatPack32},
|
|
{Prospero::BufferFormat::k5_6_5UNorm, vk::Format::eB5G6R5UnormPack16},
|
|
{Prospero::BufferFormat::k5_5_5_1UNorm, vk::Format::eR5G5B5A1UnormPack16},
|
|
{Prospero::BufferFormat::k4_4_4_4UNorm, vk::Format::eR4G4B4A4UnormPack16},
|
|
{Prospero::BufferFormat::kFmask8_S4_F4, vk::Format::eR32Sfloat},
|
|
{Prospero::BufferFormat::kBc1UNorm, vk::Format::eBc1RgbaUnormBlock},
|
|
{Prospero::BufferFormat::kBc1Srgb, vk::Format::eBc1RgbaSrgbBlock},
|
|
{Prospero::BufferFormat::kBc2UNorm, vk::Format::eBc2UnormBlock},
|
|
{Prospero::BufferFormat::kBc2Srgb, vk::Format::eBc2SrgbBlock},
|
|
{Prospero::BufferFormat::kBc3UNorm, vk::Format::eBc3UnormBlock},
|
|
{Prospero::BufferFormat::kBc3Srgb, vk::Format::eBc3SrgbBlock},
|
|
{Prospero::BufferFormat::kBc4UNorm, vk::Format::eBc4UnormBlock},
|
|
{Prospero::BufferFormat::kBc4SNorm, vk::Format::eBc4SnormBlock},
|
|
{Prospero::BufferFormat::kBc5UNorm, vk::Format::eBc5UnormBlock},
|
|
{Prospero::BufferFormat::kBc5SNorm, vk::Format::eBc5SnormBlock},
|
|
{Prospero::BufferFormat::kBc6UFloat, vk::Format::eBc6HUfloatBlock},
|
|
{Prospero::BufferFormat::kBc6SFloat, vk::Format::eBc6HSfloatBlock},
|
|
{Prospero::BufferFormat::kBc7UNorm, vk::Format::eBc7UnormBlock},
|
|
{Prospero::BufferFormat::kBc7Srgb, vk::Format::eBc7SrgbBlock},
|
|
};
|
|
|
|
constexpr auto MakeFormatLookup() {
|
|
constexpr auto kMaxFormat = Prospero::GpuEnumValue(Prospero::BufferFormat::kBc7Srgb);
|
|
std::array<vk::Format, kMaxFormat + 1> lookup {};
|
|
lookup.fill(vk::Format::eUndefined);
|
|
for (const auto& mapping: kFormatMappings) {
|
|
lookup[Prospero::GpuEnumValue(mapping.guest)] = mapping.host;
|
|
}
|
|
return lookup;
|
|
}
|
|
|
|
constexpr auto kFormatLookup = MakeFormatLookup();
|
|
|
|
} // namespace
|
|
|
|
std::string VulkanToString(vk::Result value) {
|
|
return vk::to_string(value);
|
|
}
|
|
|
|
std::string VulkanToString(vk::Format value) {
|
|
return vk::to_string(value);
|
|
}
|
|
|
|
std::string VulkanToString(vk::ImageLayout value) {
|
|
return vk::to_string(value);
|
|
}
|
|
|
|
std::string VulkanToString(vk::QueueFlags value) {
|
|
return vk::to_string(value);
|
|
}
|
|
|
|
vk::Format VulkanFormat(uint32_t guest_format) {
|
|
return guest_format < kFormatLookup.size() ? kFormatLookup[guest_format]
|
|
: vk::Format::eUndefined;
|
|
}
|
|
|
|
void RequireVulkanSuccess(vk::Result result, const char* operation) {
|
|
if (result != vk::Result::eSuccess) {
|
|
EXIT("%s failed: %s (%d)\n", operation, VulkanToString(result).c_str(),
|
|
static_cast<int>(result));
|
|
}
|
|
}
|
|
|
|
} // namespace Libs::Graphics
|