#include "graphics/host_gpu/vulkanCommon.h" #include "common/assert.h" #include "graphics/guest_gpu/gpu_defs.h" #include 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 = static_cast(Prospero::BufferFormat::kBc7Srgb); std::array lookup {}; lookup.fill(vk::Format::eUndefined); for (const auto& mapping: kFormatMappings) { lookup[static_cast(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(Prospero::BufferFormat guest_format) { const auto index = static_cast(guest_format); return index < kFormatLookup.size() ? kFormatLookup[index] : 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(result)); } } } // namespace Libs::Graphics