suyu/src/video_core/renderer_vulkan/maxwell_to_vk.cpp

715 lines
33 KiB
C++
Raw Normal View History

2019-03-02 22:34:11 +01:00
// Copyright 2019 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
2020-03-27 05:33:21 +01:00
#include <iterator>
2019-03-02 22:34:11 +01:00
#include "common/assert.h"
#include "common/common_types.h"
#include "common/logging/log.h"
#include "video_core/engines/maxwell_3d.h"
#include "video_core/renderer_vulkan/maxwell_to_vk.h"
#include "video_core/renderer_vulkan/vk_device.h"
2020-03-27 05:33:21 +01:00
#include "video_core/renderer_vulkan/wrapper.h"
2019-03-02 22:34:11 +01:00
#include "video_core/surface.h"
namespace Vulkan::MaxwellToVK {
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
2019-03-02 22:34:11 +01:00
namespace Sampler {
2020-03-27 05:33:21 +01:00
VkFilter Filter(Tegra::Texture::TextureFilter filter) {
2019-03-02 22:34:11 +01:00
switch (filter) {
case Tegra::Texture::TextureFilter::Nearest:
2020-03-27 05:33:21 +01:00
return VK_FILTER_NEAREST;
case Tegra::Texture::TextureFilter::Linear:
return VK_FILTER_LINEAR;
2019-03-02 22:34:11 +01:00
}
UNREACHABLE_MSG("Invalid sampler filter={}", static_cast<u32>(filter));
2019-03-02 22:34:11 +01:00
return {};
}
2020-03-27 05:33:21 +01:00
VkSamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter) {
2019-03-02 22:34:11 +01:00
switch (mipmap_filter) {
case Tegra::Texture::TextureMipmapFilter::None:
// There are no Vulkan filter modes that directly correspond to OpenGL minification filters
// of GL_LINEAR or GL_NEAREST, but they can be emulated using
// VK_SAMPLER_MIPMAP_MODE_NEAREST, minLod = 0, and maxLod = 0.25, and using minFilter =
// VK_FILTER_LINEAR or minFilter = VK_FILTER_NEAREST, respectively.
return VK_SAMPLER_MIPMAP_MODE_NEAREST;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::TextureMipmapFilter::Nearest:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_MIPMAP_MODE_NEAREST;
case Tegra::Texture::TextureMipmapFilter::Linear:
return VK_SAMPLER_MIPMAP_MODE_LINEAR;
2019-03-02 22:34:11 +01:00
}
UNREACHABLE_MSG("Invalid sampler mipmap mode={}", static_cast<u32>(mipmap_filter));
2019-03-02 22:34:11 +01:00
return {};
}
2020-03-27 05:33:21 +01:00
VkSamplerAddressMode WrapMode(const VKDevice& device, Tegra::Texture::WrapMode wrap_mode,
Tegra::Texture::TextureFilter filter) {
2019-03-02 22:34:11 +01:00
switch (wrap_mode) {
case Tegra::Texture::WrapMode::Wrap:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_REPEAT;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::WrapMode::Mirror:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::WrapMode::ClampToEdge:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::WrapMode::Border:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
case Tegra::Texture::WrapMode::Clamp:
2020-03-27 05:33:21 +01:00
if (device.GetDriverID() == VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR) {
// Nvidia's Vulkan driver defaults to GL_CLAMP on invalid enumerations, we can hack this
// by sending an invalid enumeration.
2020-03-27 05:33:21 +01:00
return static_cast<VkSamplerAddressMode>(0xcafe);
}
// TODO(Rodrigo): Emulate GL_CLAMP properly on other vendors
switch (filter) {
case Tegra::Texture::TextureFilter::Nearest:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
case Tegra::Texture::TextureFilter::Linear:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
}
UNREACHABLE();
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::WrapMode::MirrorOnceClampToEdge:
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::WrapMode::MirrorOnceBorder:
UNIMPLEMENTED();
2020-03-27 05:33:21 +01:00
return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented wrap mode={}", static_cast<u32>(wrap_mode));
return {};
2019-03-02 22:34:11 +01:00
}
2020-03-27 05:33:21 +01:00
VkCompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func) {
2019-03-02 22:34:11 +01:00
switch (depth_compare_func) {
case Tegra::Texture::DepthCompareFunc::Never:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_NEVER;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::Less:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_LESS;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::LessEqual:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_LESS_OR_EQUAL;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::Equal:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_EQUAL;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::NotEqual:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_NOT_EQUAL;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::Greater:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_GREATER;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::GreaterEqual:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_GREATER_OR_EQUAL;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::DepthCompareFunc::Always:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_ALWAYS;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented sampler depth compare function={}",
static_cast<u32>(depth_compare_func));
return {};
}
} // namespace Sampler
namespace {
enum : u32 { Attachable = 1, Storage = 2 };
2019-03-02 22:34:11 +01:00
struct FormatTuple {
2020-03-27 05:33:21 +01:00
VkFormat format; ///< Vulkan format
int usage = 0; ///< Describes image format usage
} constexpr tex_format_tuples[] = {
{VK_FORMAT_A8B8G8R8_UNORM_PACK32, Attachable | Storage}, // A8B8G8R8_UNORM
{VK_FORMAT_A8B8G8R8_SNORM_PACK32, Attachable | Storage}, // A8B8G8R8_SNORM
{VK_FORMAT_A8B8G8R8_SINT_PACK32, Attachable | Storage}, // A8B8G8R8_SINT
{VK_FORMAT_A8B8G8R8_UINT_PACK32, Attachable | Storage}, // A8B8G8R8_UINT
{VK_FORMAT_R5G6B5_UNORM_PACK16, Attachable}, // R5G6B5_UNORM
{VK_FORMAT_B5G6R5_UNORM_PACK16, Attachable}, // B5G6R5_UNORM
{VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM
{VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM
{VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT
{VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle)
{VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM
{VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM
{VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT
{VK_FORMAT_R8_UINT, Attachable | Storage}, // R8_UINT
{VK_FORMAT_R16G16B16A16_SFLOAT, Attachable | Storage}, // R16G16B16A16_FLOAT
{VK_FORMAT_R16G16B16A16_UNORM, Attachable | Storage}, // R16G16B16A16_UNORM
{VK_FORMAT_R16G16B16A16_SNORM, Attachable | Storage}, // R16G16B16A16_SNORM
{VK_FORMAT_R16G16B16A16_SINT, Attachable | Storage}, // R16G16B16A16_SINT
{VK_FORMAT_R16G16B16A16_UINT, Attachable | Storage}, // R16G16B16A16_UINT
{VK_FORMAT_B10G11R11_UFLOAT_PACK32, Attachable | Storage}, // B10G11R11_FLOAT
{VK_FORMAT_R32G32B32A32_UINT, Attachable | Storage}, // R32G32B32A32_UINT
{VK_FORMAT_BC1_RGBA_UNORM_BLOCK}, // BC1_RGBA_UNORM
{VK_FORMAT_BC2_UNORM_BLOCK}, // BC2_UNORM
{VK_FORMAT_BC3_UNORM_BLOCK}, // BC3_UNORM
{VK_FORMAT_BC4_UNORM_BLOCK}, // BC4_UNORM
{VK_FORMAT_BC4_SNORM_BLOCK}, // BC4_SNORM
{VK_FORMAT_BC5_UNORM_BLOCK}, // BC5_UNORM
{VK_FORMAT_BC5_SNORM_BLOCK}, // BC5_SNORM
{VK_FORMAT_BC7_UNORM_BLOCK}, // BC7_UNORM
{VK_FORMAT_BC6H_UFLOAT_BLOCK}, // BC6H_UFLOAT
{VK_FORMAT_BC6H_SFLOAT_BLOCK}, // BC6H_SFLOAT
{VK_FORMAT_ASTC_4x4_UNORM_BLOCK}, // ASTC_2D_4X4_UNORM
{VK_FORMAT_B8G8R8A8_UNORM, Attachable}, // B8G8R8A8_UNORM
{VK_FORMAT_R32G32B32A32_SFLOAT, Attachable | Storage}, // R32G32B32A32_FLOAT
{VK_FORMAT_R32G32B32A32_SINT, Attachable | Storage}, // R32G32B32A32_SINT
{VK_FORMAT_R32G32_SFLOAT, Attachable | Storage}, // R32G32_FLOAT
{VK_FORMAT_R32G32_SINT, Attachable | Storage}, // R32G32_SINT
{VK_FORMAT_R32_SFLOAT, Attachable | Storage}, // R32_FLOAT
{VK_FORMAT_R16_SFLOAT, Attachable | Storage}, // R16_FLOAT
{VK_FORMAT_R16_UNORM, Attachable | Storage}, // R16_UNORM
{VK_FORMAT_UNDEFINED}, // R16_SNORM
{VK_FORMAT_R16_UINT, Attachable | Storage}, // R16_UINT
{VK_FORMAT_UNDEFINED}, // R16_SINT
{VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // R16G16_UNORM
{VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // R16G16_FLOAT
{VK_FORMAT_UNDEFINED}, // R16G16_UINT
{VK_FORMAT_UNDEFINED}, // R16G16_SINT
{VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // R16G16_SNORM
{VK_FORMAT_UNDEFINED}, // R32G32B32_FLOAT
{VK_FORMAT_R8G8B8A8_SRGB, Attachable}, // A8B8G8R8_SRGB
{VK_FORMAT_R8G8_UNORM, Attachable | Storage}, // R8G8_UNORM
{VK_FORMAT_R8G8_SNORM, Attachable | Storage}, // R8G8_SNORM
{VK_FORMAT_R8G8_SINT, Attachable | Storage}, // R8G8_SINT
{VK_FORMAT_R8G8_UINT, Attachable | Storage}, // R8G8_UINT
{VK_FORMAT_R32G32_UINT, Attachable | Storage}, // R32G32_UINT
{VK_FORMAT_UNDEFINED}, // R16G16B16X16_FLOAT
{VK_FORMAT_R32_UINT, Attachable | Storage}, // R32_UINT
{VK_FORMAT_R32_SINT, Attachable | Storage}, // R32_SINT
{VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8_UNORM
{VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5_UNORM
{VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4_UNORM
{VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // B8G8R8A8_SRGB
{VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // BC1_RGBA_SRGB
{VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
{VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
{VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
{VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM
{VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
{VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
{VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB
{VK_FORMAT_ASTC_5x4_SRGB_BLOCK}, // ASTC_2D_5X4_SRGB
{VK_FORMAT_ASTC_5x5_UNORM_BLOCK}, // ASTC_2D_5X5_UNORM
{VK_FORMAT_ASTC_5x5_SRGB_BLOCK}, // ASTC_2D_5X5_SRGB
{VK_FORMAT_ASTC_10x8_UNORM_BLOCK}, // ASTC_2D_10X8_UNORM
{VK_FORMAT_ASTC_10x8_SRGB_BLOCK}, // ASTC_2D_10X8_SRGB
{VK_FORMAT_ASTC_6x6_UNORM_BLOCK}, // ASTC_2D_6X6_UNORM
{VK_FORMAT_ASTC_6x6_SRGB_BLOCK}, // ASTC_2D_6X6_SRGB
{VK_FORMAT_ASTC_10x10_UNORM_BLOCK}, // ASTC_2D_10X10_UNORM
{VK_FORMAT_ASTC_10x10_SRGB_BLOCK}, // ASTC_2D_10X10_SRGB
{VK_FORMAT_ASTC_12x12_UNORM_BLOCK}, // ASTC_2D_12X12_UNORM
{VK_FORMAT_ASTC_12x12_SRGB_BLOCK}, // ASTC_2D_12X12_SRGB
{VK_FORMAT_ASTC_8x6_UNORM_BLOCK}, // ASTC_2D_8X6_UNORM
{VK_FORMAT_ASTC_8x6_SRGB_BLOCK}, // ASTC_2D_8X6_SRGB
{VK_FORMAT_ASTC_6x5_UNORM_BLOCK}, // ASTC_2D_6X5_UNORM
{VK_FORMAT_ASTC_6x5_SRGB_BLOCK}, // ASTC_2D_6X5_SRGB
{VK_FORMAT_E5B9G9R9_UFLOAT_PACK32}, // E5B9G9R9_FLOAT
2019-03-02 22:34:11 +01:00
// Depth formats
{VK_FORMAT_D32_SFLOAT, Attachable}, // D32_FLOAT
{VK_FORMAT_D16_UNORM, Attachable}, // D16_UNORM
2019-03-02 22:34:11 +01:00
// DepthStencil formats
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // D24_UNORM_S8_UINT
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8_UINT_D24_UNORM (emulated)
{VK_FORMAT_D32_SFLOAT_S8_UINT, Attachable}, // D32_FLOAT_S8_UINT
};
static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat);
2019-03-02 22:34:11 +01:00
constexpr bool IsZetaFormat(PixelFormat pixel_format) {
2019-03-02 22:34:11 +01:00
return pixel_format >= PixelFormat::MaxColorFormat &&
pixel_format < PixelFormat::MaxDepthStencilFormat;
}
} // Anonymous namespace
2019-03-02 22:34:11 +01:00
FormatInfo SurfaceFormat(const VKDevice& device, FormatType format_type, PixelFormat pixel_format) {
ASSERT(static_cast<std::size_t>(pixel_format) < std::size(tex_format_tuples));
2019-03-02 22:34:11 +01:00
auto tuple = tex_format_tuples[static_cast<std::size_t>(pixel_format)];
2020-03-27 05:33:21 +01:00
if (tuple.format == VK_FORMAT_UNDEFINED) {
UNIMPLEMENTED_MSG("Unimplemented texture format with pixel format={}",
static_cast<u32>(pixel_format));
2020-03-27 05:33:21 +01:00
return {VK_FORMAT_A8B8G8R8_UNORM_PACK32, true, true};
}
// Use A8B8G8R8_UNORM on hardware that doesn't support ASTC natively
if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) {
tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format)
2020-03-27 05:33:21 +01:00
? VK_FORMAT_A8B8G8R8_SRGB_PACK32
: VK_FORMAT_A8B8G8R8_UNORM_PACK32;
}
const bool attachable = tuple.usage & Attachable;
const bool storage = tuple.usage & Storage;
2020-03-27 05:33:21 +01:00
VkFormatFeatureFlags usage;
if (format_type == FormatType::Buffer) {
2020-03-27 05:33:21 +01:00
usage =
VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
} else {
2020-03-27 05:33:21 +01:00
usage = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
if (attachable) {
2020-03-27 05:33:21 +01:00
usage |= IsZetaFormat(pixel_format) ? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
: VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
}
if (storage) {
2020-03-27 05:33:21 +01:00
usage |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
}
2019-03-02 22:34:11 +01:00
}
return {device.GetSupportedFormat(tuple.format, usage, format_type), attachable, storage};
2019-03-02 22:34:11 +01:00
}
2020-03-27 05:33:21 +01:00
VkShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage) {
2019-03-02 22:34:11 +01:00
switch (stage) {
case Tegra::Engines::ShaderType::Vertex:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_VERTEX_BIT;
case Tegra::Engines::ShaderType::TesselationControl:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
case Tegra::Engines::ShaderType::TesselationEval:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
case Tegra::Engines::ShaderType::Geometry:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_GEOMETRY_BIT;
case Tegra::Engines::ShaderType::Fragment:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_FRAGMENT_BIT;
case Tegra::Engines::ShaderType::Compute:
2020-03-27 05:33:21 +01:00
return VK_SHADER_STAGE_COMPUTE_BIT;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented shader stage={}", static_cast<u32>(stage));
return {};
}
2020-03-27 05:33:21 +01:00
VkPrimitiveTopology PrimitiveTopology([[maybe_unused]] const VKDevice& device,
Maxwell::PrimitiveTopology topology) {
2019-03-02 22:34:11 +01:00
switch (topology) {
case Maxwell::PrimitiveTopology::Points:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
2019-03-02 22:34:11 +01:00
case Maxwell::PrimitiveTopology::Lines:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
2019-03-02 22:34:11 +01:00
case Maxwell::PrimitiveTopology::LineStrip:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
2019-03-02 22:34:11 +01:00
case Maxwell::PrimitiveTopology::Triangles:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
2019-03-02 22:34:11 +01:00
case Maxwell::PrimitiveTopology::TriangleStrip:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
case Maxwell::PrimitiveTopology::TriangleFan:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
case Maxwell::PrimitiveTopology::Quads:
// TODO(Rodrigo): Use VK_PRIMITIVE_TOPOLOGY_QUAD_LIST_EXT whenever it releases
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
case Maxwell::PrimitiveTopology::Patches:
2020-03-27 05:33:21 +01:00
return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented topology={}", static_cast<u32>(topology));
return {};
2019-03-02 22:34:11 +01:00
}
2020-03-27 05:33:21 +01:00
VkFormat VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size) {
2019-03-02 22:34:11 +01:00
switch (type) {
case Maxwell::VertexAttribute::Type::UnsignedNorm:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
return VK_FORMAT_R8_UNORM;
case Maxwell::VertexAttribute::Size::Size_8_8:
return VK_FORMAT_R8G8_UNORM;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
return VK_FORMAT_R8G8B8_UNORM;
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
return VK_FORMAT_R8G8B8A8_UNORM;
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_UNORM;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_UNORM;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_UNORM;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_UNORM;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
}
break;
2019-03-02 22:34:11 +01:00
case Maxwell::VertexAttribute::Type::SignedNorm:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8_SNORM;
case Maxwell::VertexAttribute::Size::Size_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8_SNORM;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8B8_SNORM;
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8B8A8_SNORM;
case Maxwell::VertexAttribute::Size::Size_16:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R16_SNORM;
case Maxwell::VertexAttribute::Size::Size_16_16:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R16G16_SNORM;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R16G16B16_SNORM;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R16G16B16A16_SNORM;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_A2B10G10R10_SNORM_PACK32;
}
2019-03-02 22:34:11 +01:00
break;
case Maxwell::VertexAttribute::Type::UnsignedScaled:
2019-03-02 22:34:11 +01:00
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
return VK_FORMAT_R8_USCALED;
case Maxwell::VertexAttribute::Size::Size_8_8:
return VK_FORMAT_R8G8_USCALED;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
return VK_FORMAT_R8G8B8_USCALED;
2019-03-02 22:34:11 +01:00
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
return VK_FORMAT_R8G8B8A8_USCALED;
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_USCALED;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_USCALED;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_USCALED;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_USCALED;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
return VK_FORMAT_A2B10G10R10_USCALED_PACK32;
2019-03-02 22:34:11 +01:00
}
break;
case Maxwell::VertexAttribute::Type::SignedScaled:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
return VK_FORMAT_R8_SSCALED;
case Maxwell::VertexAttribute::Size::Size_8_8:
return VK_FORMAT_R8G8_SSCALED;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
return VK_FORMAT_R8G8B8_SSCALED;
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
return VK_FORMAT_R8G8B8A8_SSCALED;
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_SSCALED;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_SSCALED;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_SSCALED;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_SSCALED;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
return VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
}
break;
2019-03-02 22:34:11 +01:00
case Maxwell::VertexAttribute::Type::UnsignedInt:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8_UINT;
case Maxwell::VertexAttribute::Size::Size_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8_UINT;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8B8_UINT;
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R8G8B8A8_UINT;
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_UINT;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_UINT;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_UINT;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_UINT;
2019-03-02 22:34:11 +01:00
case Maxwell::VertexAttribute::Size::Size_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32_UINT;
case Maxwell::VertexAttribute::Size::Size_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32_UINT;
case Maxwell::VertexAttribute::Size::Size_32_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32B32_UINT;
2020-02-18 15:52:51 +01:00
case Maxwell::VertexAttribute::Size::Size_32_32_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32B32A32_UINT;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
return VK_FORMAT_A2B10G10R10_UINT_PACK32;
2019-03-02 22:34:11 +01:00
}
break;
case Maxwell::VertexAttribute::Type::SignedInt:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_8:
return VK_FORMAT_R8_SINT;
case Maxwell::VertexAttribute::Size::Size_8_8:
return VK_FORMAT_R8G8_SINT;
case Maxwell::VertexAttribute::Size::Size_8_8_8:
return VK_FORMAT_R8G8B8_SINT;
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
return VK_FORMAT_R8G8B8A8_SINT;
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_SINT;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_SINT;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_SINT;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_SINT;
case Maxwell::VertexAttribute::Size::Size_32:
return VK_FORMAT_R32_SINT;
case Maxwell::VertexAttribute::Size::Size_32_32:
return VK_FORMAT_R32G32_SINT;
case Maxwell::VertexAttribute::Size::Size_32_32_32:
return VK_FORMAT_R32G32B32_SINT;
case Maxwell::VertexAttribute::Size::Size_32_32_32_32:
return VK_FORMAT_R32G32B32A32_SINT;
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
return VK_FORMAT_A2B10G10R10_SINT_PACK32;
}
break;
case Maxwell::VertexAttribute::Type::Float:
switch (size) {
case Maxwell::VertexAttribute::Size::Size_16:
return VK_FORMAT_R16_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_16_16:
return VK_FORMAT_R16G16_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_16_16_16:
return VK_FORMAT_R16G16B16_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
return VK_FORMAT_R16G16B16A16_SFLOAT;
2019-03-02 22:34:11 +01:00
case Maxwell::VertexAttribute::Size::Size_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_32_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32B32_SFLOAT;
case Maxwell::VertexAttribute::Size::Size_32_32_32_32:
2020-03-27 05:33:21 +01:00
return VK_FORMAT_R32G32B32A32_SFLOAT;
2019-03-02 22:34:11 +01:00
}
break;
}
UNIMPLEMENTED_MSG("Unimplemented vertex format of type={} and size={}", static_cast<u32>(type),
static_cast<u32>(size));
return {};
}
2020-03-27 05:33:21 +01:00
VkCompareOp ComparisonOp(Maxwell::ComparisonOp comparison) {
2019-03-02 22:34:11 +01:00
switch (comparison) {
case Maxwell::ComparisonOp::Never:
case Maxwell::ComparisonOp::NeverOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_NEVER;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::Less:
case Maxwell::ComparisonOp::LessOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_LESS;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::Equal:
case Maxwell::ComparisonOp::EqualOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_EQUAL;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::LessEqual:
case Maxwell::ComparisonOp::LessEqualOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_LESS_OR_EQUAL;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::Greater:
case Maxwell::ComparisonOp::GreaterOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_GREATER;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::NotEqual:
case Maxwell::ComparisonOp::NotEqualOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_NOT_EQUAL;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::GreaterEqual:
case Maxwell::ComparisonOp::GreaterEqualOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_GREATER_OR_EQUAL;
2019-03-02 22:34:11 +01:00
case Maxwell::ComparisonOp::Always:
case Maxwell::ComparisonOp::AlwaysOld:
2020-03-27 05:33:21 +01:00
return VK_COMPARE_OP_ALWAYS;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented comparison op={}", static_cast<u32>(comparison));
return {};
}
2020-03-27 05:33:21 +01:00
VkIndexType IndexFormat(const VKDevice& device, Maxwell::IndexFormat index_format) {
2019-03-02 22:34:11 +01:00
switch (index_format) {
case Maxwell::IndexFormat::UnsignedByte:
if (!device.IsExtIndexTypeUint8Supported()) {
UNIMPLEMENTED_MSG("Native uint8 indices are not supported on this device");
2020-03-27 05:33:21 +01:00
return VK_INDEX_TYPE_UINT16;
}
2020-03-27 05:33:21 +01:00
return VK_INDEX_TYPE_UINT8_EXT;
2019-03-02 22:34:11 +01:00
case Maxwell::IndexFormat::UnsignedShort:
2020-03-27 05:33:21 +01:00
return VK_INDEX_TYPE_UINT16;
2019-03-02 22:34:11 +01:00
case Maxwell::IndexFormat::UnsignedInt:
2020-03-27 05:33:21 +01:00
return VK_INDEX_TYPE_UINT32;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented index_format={}", static_cast<u32>(index_format));
return {};
}
2020-03-27 05:33:21 +01:00
VkStencilOp StencilOp(Maxwell::StencilOp stencil_op) {
2019-03-02 22:34:11 +01:00
switch (stencil_op) {
case Maxwell::StencilOp::Keep:
case Maxwell::StencilOp::KeepOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_KEEP;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::Zero:
case Maxwell::StencilOp::ZeroOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_ZERO;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::Replace:
case Maxwell::StencilOp::ReplaceOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_REPLACE;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::Incr:
case Maxwell::StencilOp::IncrOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_INCREMENT_AND_CLAMP;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::Decr:
case Maxwell::StencilOp::DecrOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_DECREMENT_AND_CLAMP;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::Invert:
case Maxwell::StencilOp::InvertOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_INVERT;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::IncrWrap:
case Maxwell::StencilOp::IncrWrapOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_INCREMENT_AND_WRAP;
2019-03-02 22:34:11 +01:00
case Maxwell::StencilOp::DecrWrap:
case Maxwell::StencilOp::DecrWrapOGL:
2020-03-27 05:33:21 +01:00
return VK_STENCIL_OP_DECREMENT_AND_WRAP;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented stencil op={}", static_cast<u32>(stencil_op));
return {};
}
2020-03-27 05:33:21 +01:00
VkBlendOp BlendEquation(Maxwell::Blend::Equation equation) {
2019-03-02 22:34:11 +01:00
switch (equation) {
case Maxwell::Blend::Equation::Add:
case Maxwell::Blend::Equation::AddGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_OP_ADD;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Equation::Subtract:
case Maxwell::Blend::Equation::SubtractGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_OP_SUBTRACT;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Equation::ReverseSubtract:
case Maxwell::Blend::Equation::ReverseSubtractGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_OP_REVERSE_SUBTRACT;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Equation::Min:
case Maxwell::Blend::Equation::MinGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_OP_MIN;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Equation::Max:
case Maxwell::Blend::Equation::MaxGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_OP_MAX;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented blend equation={}", static_cast<u32>(equation));
return {};
}
2020-03-27 05:33:21 +01:00
VkBlendFactor BlendFactor(Maxwell::Blend::Factor factor) {
2019-03-02 22:34:11 +01:00
switch (factor) {
case Maxwell::Blend::Factor::Zero:
case Maxwell::Blend::Factor::ZeroGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ZERO;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::One:
case Maxwell::Blend::Factor::OneGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::SourceColor:
case Maxwell::Blend::Factor::SourceColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_SRC_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusSourceColor:
case Maxwell::Blend::Factor::OneMinusSourceColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::SourceAlpha:
case Maxwell::Blend::Factor::SourceAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_SRC_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusSourceAlpha:
case Maxwell::Blend::Factor::OneMinusSourceAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::DestAlpha:
case Maxwell::Blend::Factor::DestAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_DST_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusDestAlpha:
case Maxwell::Blend::Factor::OneMinusDestAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::DestColor:
case Maxwell::Blend::Factor::DestColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_DST_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusDestColor:
case Maxwell::Blend::Factor::OneMinusDestColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::SourceAlphaSaturate:
case Maxwell::Blend::Factor::SourceAlphaSaturateGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::Source1Color:
case Maxwell::Blend::Factor::Source1ColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_SRC1_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusSource1Color:
case Maxwell::Blend::Factor::OneMinusSource1ColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::Source1Alpha:
case Maxwell::Blend::Factor::Source1AlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_SRC1_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusSource1Alpha:
case Maxwell::Blend::Factor::OneMinusSource1AlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::ConstantColor:
case Maxwell::Blend::Factor::ConstantColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_CONSTANT_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusConstantColor:
case Maxwell::Blend::Factor::OneMinusConstantColorGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::ConstantAlpha:
case Maxwell::Blend::Factor::ConstantAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_CONSTANT_ALPHA;
2019-03-02 22:34:11 +01:00
case Maxwell::Blend::Factor::OneMinusConstantAlpha:
case Maxwell::Blend::Factor::OneMinusConstantAlphaGL:
2020-03-27 05:33:21 +01:00
return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented blend factor={}", static_cast<u32>(factor));
return {};
}
2020-03-27 05:33:21 +01:00
VkFrontFace FrontFace(Maxwell::FrontFace front_face) {
2019-03-02 22:34:11 +01:00
switch (front_face) {
case Maxwell::FrontFace::ClockWise:
2020-03-27 05:33:21 +01:00
return VK_FRONT_FACE_CLOCKWISE;
case Maxwell::FrontFace::CounterClockWise:
2020-03-27 05:33:21 +01:00
return VK_FRONT_FACE_COUNTER_CLOCKWISE;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented front face={}", static_cast<u32>(front_face));
return {};
}
2020-03-27 05:33:21 +01:00
VkCullModeFlags CullFace(Maxwell::CullFace cull_face) {
2019-03-02 22:34:11 +01:00
switch (cull_face) {
case Maxwell::CullFace::Front:
2020-03-27 05:33:21 +01:00
return VK_CULL_MODE_FRONT_BIT;
case Maxwell::CullFace::Back:
2020-03-27 05:33:21 +01:00
return VK_CULL_MODE_BACK_BIT;
case Maxwell::CullFace::FrontAndBack:
2020-03-27 05:33:21 +01:00
return VK_CULL_MODE_FRONT_AND_BACK;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented cull face={}", static_cast<u32>(cull_face));
return {};
}
2020-03-27 05:33:21 +01:00
VkComponentSwizzle SwizzleSource(Tegra::Texture::SwizzleSource swizzle) {
2019-03-02 22:34:11 +01:00
switch (swizzle) {
case Tegra::Texture::SwizzleSource::Zero:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_ZERO;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::SwizzleSource::R:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_R;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::SwizzleSource::G:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_G;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::SwizzleSource::B:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_B;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::SwizzleSource::A:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_A;
2019-03-02 22:34:11 +01:00
case Tegra::Texture::SwizzleSource::OneInt:
case Tegra::Texture::SwizzleSource::OneFloat:
2020-03-27 05:33:21 +01:00
return VK_COMPONENT_SWIZZLE_ONE;
2019-03-02 22:34:11 +01:00
}
UNIMPLEMENTED_MSG("Unimplemented swizzle source={}", static_cast<u32>(swizzle));
return {};
}
VkViewportCoordinateSwizzleNV ViewportSwizzle(Maxwell::ViewportSwizzle swizzle) {
switch (swizzle) {
case Maxwell::ViewportSwizzle::PositiveX:
return VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV;
case Maxwell::ViewportSwizzle::NegativeX:
return VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV;
case Maxwell::ViewportSwizzle::PositiveY:
return VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV;
case Maxwell::ViewportSwizzle::NegativeY:
return VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV;
case Maxwell::ViewportSwizzle::PositiveZ:
return VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV;
case Maxwell::ViewportSwizzle::NegativeZ:
return VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV;
case Maxwell::ViewportSwizzle::PositiveW:
return VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV;
case Maxwell::ViewportSwizzle::NegativeW:
return VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV;
}
UNREACHABLE_MSG("Invalid swizzle={}", static_cast<int>(swizzle));
return {};
}
2019-03-02 22:34:11 +01:00
} // namespace Vulkan::MaxwellToVK