early-access version 3887
This commit is contained in:
parent
20b242bced
commit
eafc13082a
7 changed files with 31 additions and 9 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3886.
|
This is the source code for early-access 3887.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,10 @@ namespace Shader::Backend::SPIRV {
|
||||||
namespace {
|
namespace {
|
||||||
Id Image(EmitContext& ctx, IR::TextureInstInfo info) {
|
Id Image(EmitContext& ctx, IR::TextureInstInfo info) {
|
||||||
if (info.type == TextureType::Buffer) {
|
if (info.type == TextureType::Buffer) {
|
||||||
const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index.Value())};
|
const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)};
|
||||||
return def.id;
|
return def.id;
|
||||||
} else {
|
} else {
|
||||||
const ImageDefinition def{ctx.images.at(info.descriptor_index.Value())};
|
const ImageDefinition def{ctx.images.at(info.descriptor_index)};
|
||||||
return def.id;
|
return def.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,9 @@ std::pair<Id, Id> AtomicArgs(EmitContext& ctx) {
|
||||||
|
|
||||||
Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value,
|
Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value,
|
||||||
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) {
|
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) {
|
||||||
if (!index.IsImmediate()) {
|
if (!index.IsImmediate() || index.U32() != 0) {
|
||||||
// TODO: handle layers
|
// TODO: handle layers
|
||||||
throw NotImplementedException("Indirect image indexing");
|
throw NotImplementedException("Image indexing");
|
||||||
}
|
}
|
||||||
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
||||||
const Id image{Image(ctx, info)};
|
const Id image{Image(ctx, info)};
|
||||||
|
|
|
@ -1270,7 +1270,7 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) {
|
||||||
if (desc.count != 1) {
|
if (desc.count != 1) {
|
||||||
throw NotImplementedException("Array of image buffers");
|
throw NotImplementedException("Array of image buffers");
|
||||||
}
|
}
|
||||||
const auto format = GetImageFormat(desc.format);
|
const spv::ImageFormat format{GetImageFormat(desc.format)};
|
||||||
const Id image_type{TypeImage(U32[1], spv::Dim::Buffer, false, false, false, 2, format)};
|
const Id image_type{TypeImage(U32[1], spv::Dim::Buffer, false, false, false, 2, format)};
|
||||||
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
|
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
|
||||||
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
|
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
|
||||||
|
|
|
@ -185,7 +185,7 @@ struct FormatTuple {
|
||||||
{VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
|
{VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
|
||||||
{VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
|
{VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB
|
||||||
{VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
|
{VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB
|
||||||
{VK_FORMAT_R4G4B4A4_UNORM_PACK16}, // A4B4G4R4_UNORM
|
{VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT}, // A4B4G4R4_UNORM
|
||||||
{VK_FORMAT_R4G4_UNORM_PACK8}, // G4R4_UNORM
|
{VK_FORMAT_R4G4_UNORM_PACK8}, // G4R4_UNORM
|
||||||
{VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
|
{VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB
|
||||||
{VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
|
{VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB
|
||||||
|
|
|
@ -600,7 +600,7 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im
|
||||||
}
|
}
|
||||||
|
|
||||||
void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle,
|
void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle,
|
||||||
bool emulate_bgr565) {
|
bool emulate_bgr565, bool emulate_a4b4g4r4) {
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case PixelFormat::A1B5G5R5_UNORM:
|
case PixelFormat::A1B5G5R5_UNORM:
|
||||||
std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
|
std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed);
|
||||||
|
@ -616,6 +616,11 @@ void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4
|
||||||
case PixelFormat::G4R4_UNORM:
|
case PixelFormat::G4R4_UNORM:
|
||||||
std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed);
|
std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed);
|
||||||
break;
|
break;
|
||||||
|
case PixelFormat::A4B4G4R4_UNORM:
|
||||||
|
if (emulate_a4b4g4r4) {
|
||||||
|
std::ranges::reverse(swizzle);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1661,7 +1666,8 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
|
||||||
};
|
};
|
||||||
if (!info.IsRenderTarget()) {
|
if (!info.IsRenderTarget()) {
|
||||||
swizzle = info.Swizzle();
|
swizzle = info.Swizzle();
|
||||||
TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565());
|
TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565(),
|
||||||
|
!device->IsExt4444FormatsSupported());
|
||||||
if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
|
if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) {
|
||||||
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed);
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,11 @@ constexpr std::array VK_FORMAT_R32G32B32_SFLOAT{
|
||||||
VK_FORMAT_UNDEFINED,
|
VK_FORMAT_UNDEFINED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr std::array VK_FORMAT_A4B4G4R4_UNORM_PACK16{
|
||||||
|
VK_FORMAT_R4G4B4A4_UNORM_PACK16,
|
||||||
|
VK_FORMAT_UNDEFINED,
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace Alternatives
|
} // namespace Alternatives
|
||||||
|
|
||||||
enum class NvidiaArchitecture {
|
enum class NvidiaArchitecture {
|
||||||
|
@ -110,6 +115,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) {
|
||||||
return Alternatives::R8G8B8_SSCALED.data();
|
return Alternatives::R8G8B8_SSCALED.data();
|
||||||
case VK_FORMAT_R32G32B32_SFLOAT:
|
case VK_FORMAT_R32G32B32_SFLOAT:
|
||||||
return Alternatives::VK_FORMAT_R32G32B32_SFLOAT.data();
|
return Alternatives::VK_FORMAT_R32G32B32_SFLOAT.data();
|
||||||
|
case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
|
||||||
|
return Alternatives::VK_FORMAT_A4B4G4R4_UNORM_PACK16.data();
|
||||||
default:
|
default:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -238,6 +245,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
|
||||||
VK_FORMAT_R32_SINT,
|
VK_FORMAT_R32_SINT,
|
||||||
VK_FORMAT_R32_UINT,
|
VK_FORMAT_R32_UINT,
|
||||||
VK_FORMAT_R4G4B4A4_UNORM_PACK16,
|
VK_FORMAT_R4G4B4A4_UNORM_PACK16,
|
||||||
|
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,
|
||||||
VK_FORMAT_R4G4_UNORM_PACK8,
|
VK_FORMAT_R4G4_UNORM_PACK8,
|
||||||
VK_FORMAT_R5G5B5A1_UNORM_PACK16,
|
VK_FORMAT_R5G5B5A1_UNORM_PACK16,
|
||||||
VK_FORMAT_R5G6B5_UNORM_PACK16,
|
VK_FORMAT_R5G6B5_UNORM_PACK16,
|
||||||
|
|
|
@ -46,6 +46,7 @@ VK_DEFINE_HANDLE(VmaAllocator)
|
||||||
FEATURE(EXT, ExtendedDynamicState, EXTENDED_DYNAMIC_STATE, extended_dynamic_state) \
|
FEATURE(EXT, ExtendedDynamicState, EXTENDED_DYNAMIC_STATE, extended_dynamic_state) \
|
||||||
FEATURE(EXT, ExtendedDynamicState2, EXTENDED_DYNAMIC_STATE_2, extended_dynamic_state2) \
|
FEATURE(EXT, ExtendedDynamicState2, EXTENDED_DYNAMIC_STATE_2, extended_dynamic_state2) \
|
||||||
FEATURE(EXT, ExtendedDynamicState3, EXTENDED_DYNAMIC_STATE_3, extended_dynamic_state3) \
|
FEATURE(EXT, ExtendedDynamicState3, EXTENDED_DYNAMIC_STATE_3, extended_dynamic_state3) \
|
||||||
|
FEATURE(EXT, 4444Formats, 4444_FORMATS, format_a4b4g4r4) \
|
||||||
FEATURE(EXT, IndexTypeUint8, INDEX_TYPE_UINT8, index_type_uint8) \
|
FEATURE(EXT, IndexTypeUint8, INDEX_TYPE_UINT8, index_type_uint8) \
|
||||||
FEATURE(EXT, LineRasterization, LINE_RASTERIZATION, line_rasterization) \
|
FEATURE(EXT, LineRasterization, LINE_RASTERIZATION, line_rasterization) \
|
||||||
FEATURE(EXT, PrimitiveTopologyListRestart, PRIMITIVE_TOPOLOGY_LIST_RESTART, \
|
FEATURE(EXT, PrimitiveTopologyListRestart, PRIMITIVE_TOPOLOGY_LIST_RESTART, \
|
||||||
|
@ -101,6 +102,7 @@ VK_DEFINE_HANDLE(VmaAllocator)
|
||||||
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) \
|
||||||
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME) \
|
||||||
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) \
|
||||||
|
EXTENSION_NAME(VK_EXT_4444_FORMATS_EXTENSION_NAME) \
|
||||||
EXTENSION_NAME(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) \
|
||||||
EXTENSION_NAME(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) \
|
||||||
EXTENSION_NAME(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME) \
|
EXTENSION_NAME(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME) \
|
||||||
|
@ -151,6 +153,7 @@ VK_DEFINE_HANDLE(VmaAllocator)
|
||||||
FEATURE_NAME(depth_bias_control, leastRepresentableValueForceUnormRepresentation) \
|
FEATURE_NAME(depth_bias_control, leastRepresentableValueForceUnormRepresentation) \
|
||||||
FEATURE_NAME(depth_bias_control, depthBiasExact) \
|
FEATURE_NAME(depth_bias_control, depthBiasExact) \
|
||||||
FEATURE_NAME(extended_dynamic_state, extendedDynamicState) \
|
FEATURE_NAME(extended_dynamic_state, extendedDynamicState) \
|
||||||
|
FEATURE_NAME(format_a4b4g4r4, formatA4B4G4R4) \
|
||||||
FEATURE_NAME(index_type_uint8, indexTypeUint8) \
|
FEATURE_NAME(index_type_uint8, indexTypeUint8) \
|
||||||
FEATURE_NAME(primitive_topology_list_restart, primitiveTopologyListRestart) \
|
FEATURE_NAME(primitive_topology_list_restart, primitiveTopologyListRestart) \
|
||||||
FEATURE_NAME(provoking_vertex, provokingVertexLast) \
|
FEATURE_NAME(provoking_vertex, provokingVertexLast) \
|
||||||
|
@ -505,6 +508,11 @@ public:
|
||||||
return extensions.extended_dynamic_state3;
|
return extensions.extended_dynamic_state3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the device supports VK_EXT_4444_formats.
|
||||||
|
bool IsExt4444FormatsSupported() const {
|
||||||
|
return features.format_a4b4g4r4.formatA4B4G4R4;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the device supports VK_EXT_extended_dynamic_state3.
|
/// Returns true if the device supports VK_EXT_extended_dynamic_state3.
|
||||||
bool IsExtExtendedDynamicState3BlendingSupported() const {
|
bool IsExtExtendedDynamicState3BlendingSupported() const {
|
||||||
return dynamic_state3_blending;
|
return dynamic_state3_blending;
|
||||||
|
|
Loading…
Reference in a new issue