mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-12-23 17:00:57 +01:00
Merge pull request #3222 from ReinUsesLisp/maxwell-to-vk
maxwell_to_vk: Use VK_EXT_index_type_uint8 and misc changes
This commit is contained in:
commit
3d51153611
3 changed files with 243 additions and 111 deletions
|
@ -44,7 +44,8 @@ vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filt
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode) {
|
vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode,
|
||||||
|
Tegra::Texture::TextureFilter filter) {
|
||||||
switch (wrap_mode) {
|
switch (wrap_mode) {
|
||||||
case Tegra::Texture::WrapMode::Wrap:
|
case Tegra::Texture::WrapMode::Wrap:
|
||||||
return vk::SamplerAddressMode::eRepeat;
|
return vk::SamplerAddressMode::eRepeat;
|
||||||
|
@ -55,10 +56,15 @@ vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode) {
|
||||||
case Tegra::Texture::WrapMode::Border:
|
case Tegra::Texture::WrapMode::Border:
|
||||||
return vk::SamplerAddressMode::eClampToBorder;
|
return vk::SamplerAddressMode::eClampToBorder;
|
||||||
case Tegra::Texture::WrapMode::Clamp:
|
case Tegra::Texture::WrapMode::Clamp:
|
||||||
// TODO(Rodrigo): GL_CLAMP was removed as of OpenGL 3.1, to implement GL_CLAMP, we can use
|
// TODO(Rodrigo): Emulate GL_CLAMP properly
|
||||||
// eClampToBorder to get the border color of the texture, and then sample the edge to
|
switch (filter) {
|
||||||
// manually mix them. However the shader part of this is not yet implemented.
|
case Tegra::Texture::TextureFilter::Nearest:
|
||||||
return vk::SamplerAddressMode::eClampToBorder;
|
return vk::SamplerAddressMode::eClampToEdge;
|
||||||
|
case Tegra::Texture::TextureFilter::Linear:
|
||||||
|
return vk::SamplerAddressMode::eClampToBorder;
|
||||||
|
}
|
||||||
|
UNREACHABLE();
|
||||||
|
return vk::SamplerAddressMode::eClampToEdge;
|
||||||
case Tegra::Texture::WrapMode::MirrorOnceClampToEdge:
|
case Tegra::Texture::WrapMode::MirrorOnceClampToEdge:
|
||||||
return vk::SamplerAddressMode::eMirrorClampToEdge;
|
return vk::SamplerAddressMode::eMirrorClampToEdge;
|
||||||
case Tegra::Texture::WrapMode::MirrorOnceBorder:
|
case Tegra::Texture::WrapMode::MirrorOnceBorder:
|
||||||
|
@ -96,106 +102,140 @@ vk::CompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compar
|
||||||
|
|
||||||
} // namespace Sampler
|
} // namespace Sampler
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
enum : u32 { Attachable = 1, Storage = 2 };
|
||||||
|
|
||||||
struct FormatTuple {
|
struct FormatTuple {
|
||||||
vk::Format format; ///< Vulkan format
|
vk::Format format; ///< Vulkan format
|
||||||
bool attachable; ///< True when this format can be used as an attachment
|
int usage; ///< Describes image format usage
|
||||||
};
|
} constexpr tex_format_tuples[] = {
|
||||||
|
{vk::Format::eA8B8G8R8UnormPack32, Attachable | Storage}, // ABGR8U
|
||||||
static constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> tex_format_tuples = {{
|
{vk::Format::eA8B8G8R8SnormPack32, Attachable | Storage}, // ABGR8S
|
||||||
{vk::Format::eA8B8G8R8UnormPack32, true}, // ABGR8U
|
{vk::Format::eA8B8G8R8UintPack32, Attachable | Storage}, // ABGR8UI
|
||||||
{vk::Format::eUndefined, false}, // ABGR8S
|
{vk::Format::eB5G6R5UnormPack16, {}}, // B5G6R5U
|
||||||
{vk::Format::eUndefined, false}, // ABGR8UI
|
{vk::Format::eA2B10G10R10UnormPack32, Attachable | Storage}, // A2B10G10R10U
|
||||||
{vk::Format::eB5G6R5UnormPack16, false}, // B5G6R5U
|
{vk::Format::eA1R5G5B5UnormPack16, Attachable | Storage}, // A1B5G5R5U (flipped with swizzle)
|
||||||
{vk::Format::eA2B10G10R10UnormPack32, true}, // A2B10G10R10U
|
{vk::Format::eR8Unorm, Attachable | Storage}, // R8U
|
||||||
{vk::Format::eUndefined, false}, // A1B5G5R5U
|
{vk::Format::eR8Uint, Attachable | Storage}, // R8UI
|
||||||
{vk::Format::eR8Unorm, true}, // R8U
|
{vk::Format::eR16G16B16A16Sfloat, Attachable | Storage}, // RGBA16F
|
||||||
{vk::Format::eUndefined, false}, // R8UI
|
{vk::Format::eR16G16B16A16Unorm, Attachable | Storage}, // RGBA16U
|
||||||
{vk::Format::eUndefined, false}, // RGBA16F
|
{vk::Format::eR16G16B16A16Uint, Attachable | Storage}, // RGBA16UI
|
||||||
{vk::Format::eUndefined, false}, // RGBA16U
|
{vk::Format::eB10G11R11UfloatPack32, Attachable | Storage}, // R11FG11FB10F
|
||||||
{vk::Format::eUndefined, false}, // RGBA16UI
|
{vk::Format::eR32G32B32A32Uint, Attachable | Storage}, // RGBA32UI
|
||||||
{vk::Format::eUndefined, false}, // R11FG11FB10F
|
{vk::Format::eBc1RgbaUnormBlock, {}}, // DXT1
|
||||||
{vk::Format::eUndefined, false}, // RGBA32UI
|
{vk::Format::eBc2UnormBlock, {}}, // DXT23
|
||||||
{vk::Format::eBc1RgbaUnormBlock, false}, // DXT1
|
{vk::Format::eBc3UnormBlock, {}}, // DXT45
|
||||||
{vk::Format::eBc2UnormBlock, false}, // DXT23
|
{vk::Format::eBc4UnormBlock, {}}, // DXN1
|
||||||
{vk::Format::eBc3UnormBlock, false}, // DXT45
|
{vk::Format::eBc5UnormBlock, {}}, // DXN2UNORM
|
||||||
{vk::Format::eBc4UnormBlock, false}, // DXN1
|
{vk::Format::eBc5SnormBlock, {}}, // DXN2SNORM
|
||||||
{vk::Format::eUndefined, false}, // DXN2UNORM
|
{vk::Format::eBc7UnormBlock, {}}, // BC7U
|
||||||
{vk::Format::eUndefined, false}, // DXN2SNORM
|
{vk::Format::eBc6HUfloatBlock, {}}, // BC6H_UF16
|
||||||
{vk::Format::eUndefined, false}, // BC7U
|
{vk::Format::eBc6HSfloatBlock, {}}, // BC6H_SF16
|
||||||
{vk::Format::eUndefined, false}, // BC6H_UF16
|
{vk::Format::eAstc4x4UnormBlock, {}}, // ASTC_2D_4X4
|
||||||
{vk::Format::eUndefined, false}, // BC6H_SF16
|
{vk::Format::eB8G8R8A8Unorm, {}}, // BGRA8
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_4X4
|
{vk::Format::eR32G32B32A32Sfloat, Attachable | Storage}, // RGBA32F
|
||||||
{vk::Format::eUndefined, false}, // BGRA8
|
{vk::Format::eR32G32Sfloat, Attachable | Storage}, // RG32F
|
||||||
{vk::Format::eUndefined, false}, // RGBA32F
|
{vk::Format::eR32Sfloat, Attachable | Storage}, // R32F
|
||||||
{vk::Format::eUndefined, false}, // RG32F
|
{vk::Format::eR16Sfloat, Attachable | Storage}, // R16F
|
||||||
{vk::Format::eUndefined, false}, // R32F
|
{vk::Format::eR16Unorm, Attachable | Storage}, // R16U
|
||||||
{vk::Format::eUndefined, false}, // R16F
|
{vk::Format::eUndefined, {}}, // R16S
|
||||||
{vk::Format::eUndefined, false}, // R16U
|
{vk::Format::eUndefined, {}}, // R16UI
|
||||||
{vk::Format::eUndefined, false}, // R16S
|
{vk::Format::eUndefined, {}}, // R16I
|
||||||
{vk::Format::eUndefined, false}, // R16UI
|
{vk::Format::eR16G16Unorm, Attachable | Storage}, // RG16
|
||||||
{vk::Format::eUndefined, false}, // R16I
|
{vk::Format::eR16G16Sfloat, Attachable | Storage}, // RG16F
|
||||||
{vk::Format::eUndefined, false}, // RG16
|
{vk::Format::eUndefined, {}}, // RG16UI
|
||||||
{vk::Format::eUndefined, false}, // RG16F
|
{vk::Format::eUndefined, {}}, // RG16I
|
||||||
{vk::Format::eUndefined, false}, // RG16UI
|
{vk::Format::eR16G16Snorm, Attachable | Storage}, // RG16S
|
||||||
{vk::Format::eUndefined, false}, // RG16I
|
{vk::Format::eUndefined, {}}, // RGB32F
|
||||||
{vk::Format::eUndefined, false}, // RG16S
|
{vk::Format::eR8G8B8A8Srgb, Attachable}, // RGBA8_SRGB
|
||||||
{vk::Format::eUndefined, false}, // RGB32F
|
{vk::Format::eR8G8Unorm, Attachable | Storage}, // RG8U
|
||||||
{vk::Format::eA8B8G8R8SrgbPack32, true}, // RGBA8_SRGB
|
{vk::Format::eR8G8Snorm, Attachable | Storage}, // RG8S
|
||||||
{vk::Format::eUndefined, false}, // RG8U
|
{vk::Format::eR32G32Uint, Attachable | Storage}, // RG32UI
|
||||||
{vk::Format::eUndefined, false}, // RG8S
|
{vk::Format::eUndefined, {}}, // RGBX16F
|
||||||
{vk::Format::eUndefined, false}, // RG32UI
|
{vk::Format::eR32Uint, Attachable | Storage}, // R32UI
|
||||||
{vk::Format::eUndefined, false}, // RGBX16F
|
{vk::Format::eAstc8x8UnormBlock, {}}, // ASTC_2D_8X8
|
||||||
{vk::Format::eUndefined, false}, // R32UI
|
{vk::Format::eUndefined, {}}, // ASTC_2D_8X5
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_8X8
|
{vk::Format::eUndefined, {}}, // ASTC_2D_5X4
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_8X5
|
{vk::Format::eUndefined, {}}, // BGRA8_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_5X4
|
{vk::Format::eBc1RgbaSrgbBlock, {}}, // DXT1_SRGB
|
||||||
|
{vk::Format::eUndefined, {}}, // DXT23_SRGB
|
||||||
// Compressed sRGB formats
|
{vk::Format::eBc3SrgbBlock, {}}, // DXT45_SRGB
|
||||||
{vk::Format::eUndefined, false}, // BGRA8_SRGB
|
{vk::Format::eBc7SrgbBlock, {}}, // BC7U_SRGB
|
||||||
{vk::Format::eUndefined, false}, // DXT1_SRGB
|
{vk::Format::eR4G4B4A4UnormPack16, Attachable}, // R4G4B4A4U
|
||||||
{vk::Format::eUndefined, false}, // DXT23_SRGB
|
{vk::Format::eAstc4x4SrgbBlock, {}}, // ASTC_2D_4X4_SRGB
|
||||||
{vk::Format::eUndefined, false}, // DXT45_SRGB
|
{vk::Format::eAstc8x8SrgbBlock, {}}, // ASTC_2D_8X8_SRGB
|
||||||
{vk::Format::eUndefined, false}, // BC7U_SRGB
|
{vk::Format::eAstc8x5SrgbBlock, {}}, // ASTC_2D_8X5_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_4X4_SRGB
|
{vk::Format::eAstc5x4SrgbBlock, {}}, // ASTC_2D_5X4_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_8X8_SRGB
|
{vk::Format::eAstc5x5UnormBlock, {}}, // ASTC_2D_5X5
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_8X5_SRGB
|
{vk::Format::eAstc5x5SrgbBlock, {}}, // ASTC_2D_5X5_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_5X4_SRGB
|
{vk::Format::eAstc10x8UnormBlock, {}}, // ASTC_2D_10X8
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_5X5
|
{vk::Format::eAstc10x8SrgbBlock, {}}, // ASTC_2D_10X8_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_5X5_SRGB
|
{vk::Format::eAstc6x6UnormBlock, {}}, // ASTC_2D_6X6
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_10X8
|
{vk::Format::eAstc6x6SrgbBlock, {}}, // ASTC_2D_6X6_SRGB
|
||||||
{vk::Format::eUndefined, false}, // ASTC_2D_10X8_SRGB
|
{vk::Format::eAstc10x10UnormBlock, {}}, // ASTC_2D_10X10
|
||||||
|
{vk::Format::eAstc10x10SrgbBlock, {}}, // ASTC_2D_10X10_SRGB
|
||||||
|
{vk::Format::eAstc12x12UnormBlock, {}}, // ASTC_2D_12X12
|
||||||
|
{vk::Format::eAstc12x12SrgbBlock, {}}, // ASTC_2D_12X12_SRGB
|
||||||
|
{vk::Format::eAstc8x6UnormBlock, {}}, // ASTC_2D_8X6
|
||||||
|
{vk::Format::eAstc8x6SrgbBlock, {}}, // ASTC_2D_8X6_SRGB
|
||||||
|
{vk::Format::eAstc6x5UnormBlock, {}}, // ASTC_2D_6X5
|
||||||
|
{vk::Format::eAstc6x5SrgbBlock, {}}, // ASTC_2D_6X5_SRGB
|
||||||
|
{vk::Format::eE5B9G9R9UfloatPack32, {}}, // E5B9G9R9F
|
||||||
|
|
||||||
// Depth formats
|
// Depth formats
|
||||||
{vk::Format::eD32Sfloat, true}, // Z32F
|
{vk::Format::eD32Sfloat, Attachable}, // Z32F
|
||||||
{vk::Format::eD16Unorm, true}, // Z16
|
{vk::Format::eD16Unorm, Attachable}, // Z16
|
||||||
|
|
||||||
// DepthStencil formats
|
// DepthStencil formats
|
||||||
{vk::Format::eD24UnormS8Uint, true}, // Z24S8
|
{vk::Format::eD24UnormS8Uint, Attachable}, // Z24S8
|
||||||
{vk::Format::eD24UnormS8Uint, true}, // S8Z24 (emulated)
|
{vk::Format::eD24UnormS8Uint, Attachable}, // S8Z24 (emulated)
|
||||||
{vk::Format::eUndefined, false}, // Z32FS8
|
{vk::Format::eD32SfloatS8Uint, Attachable}, // Z32FS8
|
||||||
}};
|
};
|
||||||
|
static_assert(std::size(tex_format_tuples) == VideoCore::Surface::MaxPixelFormat);
|
||||||
|
|
||||||
static constexpr bool IsZetaFormat(PixelFormat pixel_format) {
|
constexpr bool IsZetaFormat(PixelFormat pixel_format) {
|
||||||
return pixel_format >= PixelFormat::MaxColorFormat &&
|
return pixel_format >= PixelFormat::MaxColorFormat &&
|
||||||
pixel_format < PixelFormat::MaxDepthStencilFormat;
|
pixel_format < PixelFormat::MaxDepthStencilFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<vk::Format, bool> SurfaceFormat(const VKDevice& device, FormatType format_type,
|
} // Anonymous namespace
|
||||||
PixelFormat pixel_format) {
|
|
||||||
ASSERT(static_cast<std::size_t>(pixel_format) < tex_format_tuples.size());
|
|
||||||
|
|
||||||
const auto tuple = tex_format_tuples[static_cast<u32>(pixel_format)];
|
FormatInfo SurfaceFormat(const VKDevice& device, FormatType format_type, PixelFormat pixel_format) {
|
||||||
UNIMPLEMENTED_IF_MSG(tuple.format == vk::Format::eUndefined,
|
ASSERT(static_cast<std::size_t>(pixel_format) < std::size(tex_format_tuples));
|
||||||
"Unimplemented texture format with pixel format={}",
|
|
||||||
static_cast<u32>(pixel_format));
|
|
||||||
|
|
||||||
auto usage = vk::FormatFeatureFlagBits::eSampledImage |
|
auto tuple = tex_format_tuples[static_cast<std::size_t>(pixel_format)];
|
||||||
vk::FormatFeatureFlagBits::eTransferDst | vk::FormatFeatureFlagBits::eTransferSrc;
|
if (tuple.format == vk::Format::eUndefined) {
|
||||||
if (tuple.attachable) {
|
UNIMPLEMENTED_MSG("Unimplemented texture format with pixel format={}",
|
||||||
usage |= IsZetaFormat(pixel_format) ? vk::FormatFeatureFlagBits::eDepthStencilAttachment
|
static_cast<u32>(pixel_format));
|
||||||
: vk::FormatFeatureFlagBits::eColorAttachment;
|
return {vk::Format::eA8B8G8R8UnormPack32, true, true};
|
||||||
}
|
}
|
||||||
return {device.GetSupportedFormat(tuple.format, usage, format_type), tuple.attachable};
|
|
||||||
|
// Use ABGR8 on hardware that doesn't support ASTC natively
|
||||||
|
if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) {
|
||||||
|
tuple.format = VideoCore::Surface::IsPixelFormatSRGB(pixel_format)
|
||||||
|
? vk::Format::eA8B8G8R8SrgbPack32
|
||||||
|
: vk::Format::eA8B8G8R8UnormPack32;
|
||||||
|
}
|
||||||
|
const bool attachable = tuple.usage & Attachable;
|
||||||
|
const bool storage = tuple.usage & Storage;
|
||||||
|
|
||||||
|
vk::FormatFeatureFlags usage;
|
||||||
|
if (format_type == FormatType::Buffer) {
|
||||||
|
usage = vk::FormatFeatureFlagBits::eStorageTexelBuffer |
|
||||||
|
vk::FormatFeatureFlagBits::eUniformTexelBuffer;
|
||||||
|
} else {
|
||||||
|
usage = vk::FormatFeatureFlagBits::eSampledImage | vk::FormatFeatureFlagBits::eTransferDst |
|
||||||
|
vk::FormatFeatureFlagBits::eTransferSrc;
|
||||||
|
if (attachable) {
|
||||||
|
usage |= IsZetaFormat(pixel_format) ? vk::FormatFeatureFlagBits::eDepthStencilAttachment
|
||||||
|
: vk::FormatFeatureFlagBits::eColorAttachment;
|
||||||
|
}
|
||||||
|
if (storage) {
|
||||||
|
usage |= vk::FormatFeatureFlagBits::eStorageImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {device.GetSupportedFormat(tuple.format, usage, format_type), attachable, storage};
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::ShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage) {
|
vk::ShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage) {
|
||||||
|
@ -215,7 +255,8 @@ vk::ShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::PrimitiveTopology PrimitiveTopology(Maxwell::PrimitiveTopology topology) {
|
vk::PrimitiveTopology PrimitiveTopology([[maybe_unused]] const VKDevice& device,
|
||||||
|
Maxwell::PrimitiveTopology topology) {
|
||||||
switch (topology) {
|
switch (topology) {
|
||||||
case Maxwell::PrimitiveTopology::Points:
|
case Maxwell::PrimitiveTopology::Points:
|
||||||
return vk::PrimitiveTopology::ePointList;
|
return vk::PrimitiveTopology::ePointList;
|
||||||
|
@ -227,6 +268,13 @@ vk::PrimitiveTopology PrimitiveTopology(Maxwell::PrimitiveTopology topology) {
|
||||||
return vk::PrimitiveTopology::eTriangleList;
|
return vk::PrimitiveTopology::eTriangleList;
|
||||||
case Maxwell::PrimitiveTopology::TriangleStrip:
|
case Maxwell::PrimitiveTopology::TriangleStrip:
|
||||||
return vk::PrimitiveTopology::eTriangleStrip;
|
return vk::PrimitiveTopology::eTriangleStrip;
|
||||||
|
case Maxwell::PrimitiveTopology::TriangleFan:
|
||||||
|
return vk::PrimitiveTopology::eTriangleFan;
|
||||||
|
case Maxwell::PrimitiveTopology::Quads:
|
||||||
|
// TODO(Rodrigo): Use VK_PRIMITIVE_TOPOLOGY_QUAD_LIST_EXT whenever it releases
|
||||||
|
return vk::PrimitiveTopology::eTriangleList;
|
||||||
|
case Maxwell::PrimitiveTopology::Patches:
|
||||||
|
return vk::PrimitiveTopology::ePatchList;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unimplemented topology={}", static_cast<u32>(topology));
|
UNIMPLEMENTED_MSG("Unimplemented topology={}", static_cast<u32>(topology));
|
||||||
return {};
|
return {};
|
||||||
|
@ -236,37 +284,111 @@ vk::PrimitiveTopology PrimitiveTopology(Maxwell::PrimitiveTopology topology) {
|
||||||
vk::Format VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size) {
|
vk::Format VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Maxwell::VertexAttribute::Type::SignedNorm:
|
case Maxwell::VertexAttribute::Type::SignedNorm:
|
||||||
|
switch (size) {
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8:
|
||||||
|
return vk::Format::eR8Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8:
|
||||||
|
return vk::Format::eR8G8Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8A8Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16:
|
||||||
|
return vk::Format::eR16Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16:
|
||||||
|
return vk::Format::eR16G16Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16A16Snorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_10_10_10_2:
|
||||||
|
return vk::Format::eA2B10G10R10SnormPack32;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Maxwell::VertexAttribute::Type::UnsignedNorm:
|
case Maxwell::VertexAttribute::Type::UnsignedNorm:
|
||||||
switch (size) {
|
switch (size) {
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8:
|
||||||
|
return vk::Format::eR8Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8:
|
||||||
|
return vk::Format::eR8G8Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8Unorm;
|
||||||
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
|
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
|
||||||
return vk::Format::eR8G8B8A8Unorm;
|
return vk::Format::eR8G8B8A8Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16:
|
||||||
|
return vk::Format::eR16Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16:
|
||||||
|
return vk::Format::eR16G16Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16Unorm;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16A16Unorm;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Maxwell::VertexAttribute::Type::SignedInt:
|
case Maxwell::VertexAttribute::Type::SignedInt:
|
||||||
break;
|
switch (size) {
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16A16Sint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8:
|
||||||
|
return vk::Format::eR8Sint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8:
|
||||||
|
return vk::Format::eR8G8Sint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8Sint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8A8Sint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_32:
|
||||||
|
return vk::Format::eR32Sint;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
case Maxwell::VertexAttribute::Type::UnsignedInt:
|
case Maxwell::VertexAttribute::Type::UnsignedInt:
|
||||||
switch (size) {
|
switch (size) {
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8:
|
||||||
|
return vk::Format::eR8Uint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8:
|
||||||
|
return vk::Format::eR8G8Uint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8Uint;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8_8_8:
|
||||||
|
return vk::Format::eR8G8B8A8Uint;
|
||||||
case Maxwell::VertexAttribute::Size::Size_32:
|
case Maxwell::VertexAttribute::Size::Size_32:
|
||||||
return vk::Format::eR32Uint;
|
return vk::Format::eR32Uint;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Maxwell::VertexAttribute::Type::UnsignedScaled:
|
case Maxwell::VertexAttribute::Type::UnsignedScaled:
|
||||||
|
switch (size) {
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_8_8:
|
||||||
|
return vk::Format::eR8G8Uscaled;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Maxwell::VertexAttribute::Type::SignedScaled:
|
case Maxwell::VertexAttribute::Type::SignedScaled:
|
||||||
break;
|
break;
|
||||||
case Maxwell::VertexAttribute::Type::Float:
|
case Maxwell::VertexAttribute::Type::Float:
|
||||||
switch (size) {
|
switch (size) {
|
||||||
case Maxwell::VertexAttribute::Size::Size_32_32_32_32:
|
|
||||||
return vk::Format::eR32G32B32A32Sfloat;
|
|
||||||
case Maxwell::VertexAttribute::Size::Size_32_32_32:
|
|
||||||
return vk::Format::eR32G32B32Sfloat;
|
|
||||||
case Maxwell::VertexAttribute::Size::Size_32_32:
|
|
||||||
return vk::Format::eR32G32Sfloat;
|
|
||||||
case Maxwell::VertexAttribute::Size::Size_32:
|
case Maxwell::VertexAttribute::Size::Size_32:
|
||||||
return vk::Format::eR32Sfloat;
|
return vk::Format::eR32Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_32_32:
|
||||||
|
return vk::Format::eR32G32Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_32_32_32:
|
||||||
|
return vk::Format::eR32G32B32Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_32_32_32_32:
|
||||||
|
return vk::Format::eR32G32B32A32Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16:
|
||||||
|
return vk::Format::eR16Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16:
|
||||||
|
return vk::Format::eR16G16Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16Sfloat;
|
||||||
|
case Maxwell::VertexAttribute::Size::Size_16_16_16_16:
|
||||||
|
return vk::Format::eR16G16B16A16Sfloat;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -308,11 +430,14 @@ vk::CompareOp ComparisonOp(Maxwell::ComparisonOp comparison) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::IndexType IndexFormat(Maxwell::IndexFormat index_format) {
|
vk::IndexType IndexFormat(const VKDevice& device, Maxwell::IndexFormat index_format) {
|
||||||
switch (index_format) {
|
switch (index_format) {
|
||||||
case Maxwell::IndexFormat::UnsignedByte:
|
case Maxwell::IndexFormat::UnsignedByte:
|
||||||
UNIMPLEMENTED_MSG("Vulkan does not support native u8 index format");
|
if (!device.IsExtIndexTypeUint8Supported()) {
|
||||||
return vk::IndexType::eUint16;
|
UNIMPLEMENTED_MSG("Native uint8 indices are not supported on this device");
|
||||||
|
return vk::IndexType::eUint16;
|
||||||
|
}
|
||||||
|
return vk::IndexType::eUint8EXT;
|
||||||
case Maxwell::IndexFormat::UnsignedShort:
|
case Maxwell::IndexFormat::UnsignedShort:
|
||||||
return vk::IndexType::eUint16;
|
return vk::IndexType::eUint16;
|
||||||
case Maxwell::IndexFormat::UnsignedInt:
|
case Maxwell::IndexFormat::UnsignedInt:
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "video_core/engines/maxwell_3d.h"
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
#include "video_core/renderer_vulkan/declarations.h"
|
#include "video_core/renderer_vulkan/declarations.h"
|
||||||
|
@ -23,24 +22,31 @@ vk::Filter Filter(Tegra::Texture::TextureFilter filter);
|
||||||
|
|
||||||
vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter);
|
vk::SamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter);
|
||||||
|
|
||||||
vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode);
|
vk::SamplerAddressMode WrapMode(Tegra::Texture::WrapMode wrap_mode,
|
||||||
|
Tegra::Texture::TextureFilter filter);
|
||||||
|
|
||||||
vk::CompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func);
|
vk::CompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func);
|
||||||
|
|
||||||
} // namespace Sampler
|
} // namespace Sampler
|
||||||
|
|
||||||
std::pair<vk::Format, bool> SurfaceFormat(const VKDevice& device, FormatType format_type,
|
struct FormatInfo {
|
||||||
PixelFormat pixel_format);
|
vk::Format format;
|
||||||
|
bool attachable;
|
||||||
|
bool storage;
|
||||||
|
};
|
||||||
|
|
||||||
|
FormatInfo SurfaceFormat(const VKDevice& device, FormatType format_type, PixelFormat pixel_format);
|
||||||
|
|
||||||
vk::ShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage);
|
vk::ShaderStageFlagBits ShaderStage(Tegra::Engines::ShaderType stage);
|
||||||
|
|
||||||
vk::PrimitiveTopology PrimitiveTopology(Maxwell::PrimitiveTopology topology);
|
vk::PrimitiveTopology PrimitiveTopology(const VKDevice& device,
|
||||||
|
Maxwell::PrimitiveTopology topology);
|
||||||
|
|
||||||
vk::Format VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size);
|
vk::Format VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size);
|
||||||
|
|
||||||
vk::CompareOp ComparisonOp(Maxwell::ComparisonOp comparison);
|
vk::CompareOp ComparisonOp(Maxwell::ComparisonOp comparison);
|
||||||
|
|
||||||
vk::IndexType IndexFormat(Maxwell::IndexFormat index_format);
|
vk::IndexType IndexFormat(const VKDevice& device, Maxwell::IndexFormat index_format);
|
||||||
|
|
||||||
vk::StencilOp StencilOp(Maxwell::StencilOp stencil_op);
|
vk::StencilOp StencilOp(Maxwell::StencilOp stencil_op);
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,10 @@ UniqueSampler VKSamplerCache::CreateSampler(const Tegra::Texture::TSCEntry& tsc)
|
||||||
{}, MaxwellToVK::Sampler::Filter(tsc.mag_filter),
|
{}, MaxwellToVK::Sampler::Filter(tsc.mag_filter),
|
||||||
MaxwellToVK::Sampler::Filter(tsc.min_filter),
|
MaxwellToVK::Sampler::Filter(tsc.min_filter),
|
||||||
MaxwellToVK::Sampler::MipmapMode(tsc.mipmap_filter),
|
MaxwellToVK::Sampler::MipmapMode(tsc.mipmap_filter),
|
||||||
MaxwellToVK::Sampler::WrapMode(tsc.wrap_u), MaxwellToVK::Sampler::WrapMode(tsc.wrap_v),
|
MaxwellToVK::Sampler::WrapMode(tsc.wrap_u, tsc.mag_filter),
|
||||||
MaxwellToVK::Sampler::WrapMode(tsc.wrap_p), tsc.GetLodBias(), has_anisotropy,
|
MaxwellToVK::Sampler::WrapMode(tsc.wrap_v, tsc.mag_filter),
|
||||||
max_anisotropy, tsc.depth_compare_enabled,
|
MaxwellToVK::Sampler::WrapMode(tsc.wrap_p, tsc.mag_filter), tsc.GetLodBias(),
|
||||||
|
has_anisotropy, max_anisotropy, tsc.depth_compare_enabled,
|
||||||
MaxwellToVK::Sampler::DepthCompareFunction(tsc.depth_compare_func), tsc.GetMinLod(),
|
MaxwellToVK::Sampler::DepthCompareFunction(tsc.depth_compare_func), tsc.GetMinLod(),
|
||||||
tsc.GetMaxLod(), vk_border_color.value_or(vk::BorderColor::eFloatTransparentBlack),
|
tsc.GetMaxLod(), vk_border_color.value_or(vk::BorderColor::eFloatTransparentBlack),
|
||||||
unnormalized_coords);
|
unnormalized_coords);
|
||||||
|
|
Loading…
Reference in a new issue