VideoBackends:Metal: Use DriverDetails for bugs
This commit is contained in:
parent
716c0980d7
commit
a5ef9dfd53
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "Common/MsgHandler.h"
|
#include "Common/MsgHandler.h"
|
||||||
|
|
||||||
|
#include "VideoCommon/DriverDetails.h"
|
||||||
#include "VideoCommon/Spirv.h"
|
#include "VideoCommon/Spirv.h"
|
||||||
|
|
||||||
Metal::DeviceFeatures Metal::g_features;
|
Metal::DeviceFeatures Metal::g_features;
|
||||||
|
@ -81,6 +82,21 @@ void Metal::Util::PopulateBackendInfoAdapters(VideoConfig* config,
|
||||||
|
|
||||||
void Metal::Util::PopulateBackendInfoFeatures(VideoConfig* config, id<MTLDevice> device)
|
void Metal::Util::PopulateBackendInfoFeatures(VideoConfig* config, id<MTLDevice> device)
|
||||||
{
|
{
|
||||||
|
// Initialize DriverDetails first so we can use it later
|
||||||
|
DriverDetails::Vendor vendor = DriverDetails::VENDOR_UNKNOWN;
|
||||||
|
if ([[device name] containsString:@"NVIDIA"])
|
||||||
|
vendor = DriverDetails::VENDOR_NVIDIA;
|
||||||
|
else if ([[device name] containsString:@"AMD"])
|
||||||
|
vendor = DriverDetails::VENDOR_ATI;
|
||||||
|
else if ([[device name] containsString:@"Intel"])
|
||||||
|
vendor = DriverDetails::VENDOR_INTEL;
|
||||||
|
else if ([[device name] containsString:@"Apple"])
|
||||||
|
vendor = DriverDetails::VENDOR_APPLE;
|
||||||
|
const NSOperatingSystemVersion cocoa_ver = [[NSProcessInfo processInfo] operatingSystemVersion];
|
||||||
|
double version = cocoa_ver.majorVersion * 100 + cocoa_ver.minorVersion;
|
||||||
|
DriverDetails::Init(DriverDetails::API_METAL, vendor, DriverDetails::DRIVER_APPLE, version,
|
||||||
|
DriverDetails::Family::UNKNOWN);
|
||||||
|
|
||||||
#if TARGET_OS_OSX
|
#if TARGET_OS_OSX
|
||||||
config->backend_info.bSupportsDepthClamp = true;
|
config->backend_info.bSupportsDepthClamp = true;
|
||||||
config->backend_info.bSupportsST3CTextures = true;
|
config->backend_info.bSupportsST3CTextures = true;
|
||||||
|
@ -117,11 +133,10 @@ void Metal::Util::PopulateBackendInfoFeatures(VideoConfig* config, id<MTLDevice>
|
||||||
[device supportsFamily:MTLGPUFamilyMac2] || [device supportsFamily:MTLGPUFamilyApple6];
|
[device supportsFamily:MTLGPUFamilyMac2] || [device supportsFamily:MTLGPUFamilyApple6];
|
||||||
config->backend_info.bSupportsFramebufferFetch = [device supportsFamily:MTLGPUFamilyApple1];
|
config->backend_info.bSupportsFramebufferFetch = [device supportsFamily:MTLGPUFamilyApple1];
|
||||||
}
|
}
|
||||||
if ([[device name] containsString:@"AMD"])
|
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_SUBGROUP_INVOCATION_ID))
|
||||||
{
|
|
||||||
// Broken
|
|
||||||
g_features.subgroup_ops = false;
|
g_features.subgroup_ops = false;
|
||||||
}
|
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING))
|
||||||
|
config->backend_info.bSupportsDynamicSamplerIndexing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
|
|
@ -98,6 +98,8 @@ constexpr BugInfo m_known_bugs[] = {
|
||||||
BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true},
|
BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
{API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
||||||
BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true},
|
BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true},
|
||||||
|
{API_METAL, OS_OSX, VENDOR_INTEL, DRIVER_APPLE, Family::UNKNOWN,
|
||||||
|
BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true},
|
||||||
{API_OPENGL, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN,
|
{API_OPENGL, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN,
|
||||||
BUG_BROKEN_BITWISE_OP_NEGATION, -1.0, 108.4693462, true},
|
BUG_BROKEN_BITWISE_OP_NEGATION, -1.0, 108.4693462, true},
|
||||||
{API_VULKAN, OS_WINDOWS, VENDOR_ATI, DRIVER_ATI, Family::UNKNOWN, BUG_PRIMITIVE_RESTART, -1.0,
|
{API_VULKAN, OS_WINDOWS, VENDOR_ATI, DRIVER_ATI, Family::UNKNOWN, BUG_PRIMITIVE_RESTART, -1.0,
|
||||||
|
@ -120,6 +122,8 @@ constexpr BugInfo m_known_bugs[] = {
|
||||||
BUG_BROKEN_REVERSED_DEPTH_RANGE, -1.0, -1.0, true},
|
BUG_BROKEN_REVERSED_DEPTH_RANGE, -1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_OSX, VENDOR_ALL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
{API_VULKAN, OS_OSX, VENDOR_ALL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
||||||
BUG_BROKEN_REVERSED_DEPTH_RANGE, -1.0, -1.0, true},
|
BUG_BROKEN_REVERSED_DEPTH_RANGE, -1.0, -1.0, true},
|
||||||
|
{API_METAL, OS_OSX, VENDOR_ALL, DRIVER_APPLE, Family::UNKNOWN, BUG_BROKEN_REVERSED_DEPTH_RANGE,
|
||||||
|
-1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_SLOW_CACHED_READBACK_MEMORY,
|
{API_VULKAN, OS_ALL, VENDOR_ARM, DRIVER_ARM, Family::UNKNOWN, BUG_SLOW_CACHED_READBACK_MEMORY,
|
||||||
-1.0, -1.0, true},
|
-1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN,
|
{API_VULKAN, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN,
|
||||||
|
@ -130,6 +134,8 @@ constexpr BugInfo m_known_bugs[] = {
|
||||||
-1.0, -1.0, true},
|
-1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_OSX, VENDOR_ATI, DRIVER_PORTABILITY, Family::UNKNOWN,
|
{API_VULKAN, OS_OSX, VENDOR_ATI, DRIVER_PORTABILITY, Family::UNKNOWN,
|
||||||
BUG_BROKEN_SUBGROUP_INVOCATION_ID, -1.0, -1.0, true},
|
BUG_BROKEN_SUBGROUP_INVOCATION_ID, -1.0, -1.0, true},
|
||||||
|
{API_METAL, OS_OSX, VENDOR_ATI, DRIVER_APPLE, Family::UNKNOWN,
|
||||||
|
BUG_BROKEN_SUBGROUP_INVOCATION_ID, -1.0, -1.0, true},
|
||||||
{API_OPENGL, OS_ANDROID, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
|
{API_OPENGL, OS_ANDROID, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
|
||||||
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, true},
|
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_ANDROID, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
|
{API_VULKAN, OS_ANDROID, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
|
||||||
|
@ -140,8 +146,12 @@ constexpr BugInfo m_known_bugs[] = {
|
||||||
-1.0, -1.0, true},
|
-1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_OSX, VENDOR_APPLE, DRIVER_PORTABILITY, Family::UNKNOWN,
|
{API_VULKAN, OS_OSX, VENDOR_APPLE, DRIVER_PORTABILITY, Family::UNKNOWN,
|
||||||
BUG_BROKEN_DISCARD_WITH_EARLY_Z, -1.0, -1.0, true},
|
BUG_BROKEN_DISCARD_WITH_EARLY_Z, -1.0, -1.0, true},
|
||||||
|
{API_METAL, OS_OSX, VENDOR_APPLE, DRIVER_APPLE, Family::UNKNOWN,
|
||||||
|
BUG_BROKEN_DISCARD_WITH_EARLY_Z, -1.0, -1.0, true},
|
||||||
{API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
{API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN,
|
||||||
BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING, -1.0, -1.0, true},
|
BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING, -1.0, -1.0, true},
|
||||||
|
{API_METAL, OS_OSX, VENDOR_INTEL, DRIVER_APPLE, Family::UNKNOWN,
|
||||||
|
BUG_BROKEN_DYNAMIC_SAMPLER_INDEXING, -1.0, -1.0, true},
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<Bug, BugInfo> m_bugs;
|
static std::map<Bug, BugInfo> m_bugs;
|
||||||
|
|
|
@ -13,7 +13,8 @@ namespace DriverDetails
|
||||||
enum API
|
enum API
|
||||||
{
|
{
|
||||||
API_OPENGL = (1 << 0),
|
API_OPENGL = (1 << 0),
|
||||||
API_VULKAN = (1 << 1)
|
API_VULKAN = (1 << 1),
|
||||||
|
API_METAL = (1 << 2),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Enum of supported operating systems
|
// Enum of supported operating systems
|
||||||
|
@ -64,6 +65,7 @@ enum Driver
|
||||||
DRIVER_IMGTEC, // Official PowerVR driver
|
DRIVER_IMGTEC, // Official PowerVR driver
|
||||||
DRIVER_VIVANTE, // Official Vivante driver
|
DRIVER_VIVANTE, // Official Vivante driver
|
||||||
DRIVER_PORTABILITY, // Vulkan via Metal on macOS
|
DRIVER_PORTABILITY, // Vulkan via Metal on macOS
|
||||||
|
DRIVER_APPLE, // Metal on macOS
|
||||||
DRIVER_UNKNOWN // Unknown driver, default to official hardware driver
|
DRIVER_UNKNOWN // Unknown driver, default to official hardware driver
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -810,7 +810,7 @@ ShaderCode GeneratePixelShaderCode(APIType api_type, const ShaderHostConfig& hos
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// Framebuffer fetch is only supported by Metal, so ensure that we're running Vulkan (MoltenVK)
|
// Framebuffer fetch is only supported by Metal, so ensure that we're running Vulkan (MoltenVK)
|
||||||
// if we want to use it.
|
// if we want to use it.
|
||||||
if (api_type == APIType::Vulkan)
|
if (api_type == APIType::Vulkan || api_type == APIType::Metal)
|
||||||
{
|
{
|
||||||
if (!uid_data->no_dual_src)
|
if (!uid_data->no_dual_src)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue