|
@@ -106,6 +106,43 @@ bool IsASTCSupported() {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static bool HasSlowSoftwareAstc(std::string_view vendor_name, std::string_view renderer) {
|
|
|
|
|
+// ifdef for Unix reduces string comparisons for non-Windows drivers, and Intel
|
|
|
|
|
+#ifdef YUZU_UNIX
|
|
|
|
|
+ // Sorted vaguely by how likely a vendor is to appear
|
|
|
|
|
+ if (vendor_name == "AMD") {
|
|
|
|
|
+ // RadeonSI
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vendor_name == "Intel") {
|
|
|
|
|
+ // Must be inside YUZU_UNIX ifdef as the Windows driver uses the same vendor string
|
|
|
|
|
+ // iris, crocus
|
|
|
|
|
+ const bool is_intel_dg = (renderer.find("DG") != std::string_view::npos);
|
|
|
|
|
+ return is_intel_dg;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vendor_name == "nouveau") {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vendor_name == "X.Org") {
|
|
|
|
|
+ // R600
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+#endif
|
|
|
|
|
+ if (vendor_name == "Collabora Ltd") {
|
|
|
|
|
+ // Zink
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vendor_name == "Microsoft Corporation") {
|
|
|
|
|
+ // d3d12
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vendor_name == "Mesa/X.org") {
|
|
|
|
|
+ // llvmpipe, softpipe, virgl
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
[[nodiscard]] bool IsDebugToolAttached(std::span<const std::string_view> extensions) {
|
|
[[nodiscard]] bool IsDebugToolAttached(std::span<const std::string_view> extensions) {
|
|
|
const bool nsight = std::getenv("NVTX_INJECTION64_PATH") || std::getenv("NSIGHT_LAUNCHED");
|
|
const bool nsight = std::getenv("NVTX_INJECTION64_PATH") || std::getenv("NSIGHT_LAUNCHED");
|
|
|
return nsight || HasExtension(extensions, "GL_EXT_debug_tool") ||
|
|
return nsight || HasExtension(extensions, "GL_EXT_debug_tool") ||
|
|
@@ -120,12 +157,16 @@ Device::Device(Core::Frontend::EmuWindow& emu_window) {
|
|
|
}
|
|
}
|
|
|
vendor_name = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
|
|
vendor_name = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
|
|
|
const std::string_view version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
|
|
const std::string_view version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
|
|
|
|
|
+ const std::string_view renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
|
|
|
const std::vector extensions = GetExtensions();
|
|
const std::vector extensions = GetExtensions();
|
|
|
|
|
|
|
|
const bool is_nvidia = vendor_name == "NVIDIA Corporation";
|
|
const bool is_nvidia = vendor_name == "NVIDIA Corporation";
|
|
|
const bool is_amd = vendor_name == "ATI Technologies Inc.";
|
|
const bool is_amd = vendor_name == "ATI Technologies Inc.";
|
|
|
const bool is_intel = vendor_name == "Intel";
|
|
const bool is_intel = vendor_name == "Intel";
|
|
|
|
|
|
|
|
|
|
+ const bool has_slow_software_astc =
|
|
|
|
|
+ !is_nvidia && !is_amd && HasSlowSoftwareAstc(vendor_name, renderer);
|
|
|
|
|
+
|
|
|
#ifdef __unix__
|
|
#ifdef __unix__
|
|
|
constexpr bool is_linux = true;
|
|
constexpr bool is_linux = true;
|
|
|
#else
|
|
#else
|
|
@@ -152,7 +193,7 @@ Device::Device(Core::Frontend::EmuWindow& emu_window) {
|
|
|
has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array;
|
|
has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array;
|
|
|
has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted");
|
|
has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted");
|
|
|
has_texture_shadow_lod = HasExtension(extensions, "GL_EXT_texture_shadow_lod");
|
|
has_texture_shadow_lod = HasExtension(extensions, "GL_EXT_texture_shadow_lod");
|
|
|
- has_astc = IsASTCSupported();
|
|
|
|
|
|
|
+ has_astc = !has_slow_software_astc && IsASTCSupported();
|
|
|
has_variable_aoffi = TestVariableAoffi();
|
|
has_variable_aoffi = TestVariableAoffi();
|
|
|
has_component_indexing_bug = is_amd;
|
|
has_component_indexing_bug = is_amd;
|
|
|
has_precise_bug = TestPreciseBug();
|
|
has_precise_bug = TestPreciseBug();
|