summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlat9nq <22451773+lat9nq@users.noreply.github.com>2021-03-21 01:25:45 -0400
committerlat9nq <22451773+lat9nq@users.noreply.github.com>2021-03-21 01:25:45 -0400
commit538f097f97a5cbf350aecbdec4ed08f27693358c (patch)
tree55eeb81350f4a9f57b8349cad6d319f691786b42 /src
parentd3a4a192fe26e251f521f0311b2d712f5db9918e (diff)
gl_device: Block async shaders on AMD and Intel
Currently, the Windows versions of the Intel OpenGL driver and the AMD proprietary OpenGL driver do not properly support (or in fact degrade) when asynchronous shader compilation is enabled. This blocks specifically those drivers from using this feature. This affects AMDGPU-PRO on Linux, and AMD's and Intel's OpenGL drivers on Windows.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index 1ae5f1d62..ba59414a7 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -210,6 +210,12 @@ Device::Device() {
const bool is_amd = vendor == "ATI Technologies Inc.";
const bool is_intel = vendor == "Intel";
+#ifdef __linux__
+ const bool is_linux = true;
+#else
+ const bool is_linux = false;
+#endif
+
bool disable_fast_buffer_sub_data = false;
if (is_nvidia && version == "4.6.0 NVIDIA 443.24") {
LOG_WARNING(
@@ -249,7 +255,9 @@ Device::Device() {
GLAD_GL_NV_gpu_program5 && GLAD_GL_NV_compute_program5 &&
GLAD_GL_NV_transform_feedback && GLAD_GL_NV_transform_feedback2;
- use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue();
+ // Blocks AMD and Intel OpenGL drivers on Windows from using asynchronous shader compilation.
+ use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue() &&
+ !(is_amd || (is_intel && !is_linux));
use_driver_cache = is_nvidia;
LOG_INFO(Render_OpenGL, "Renderer_VariableAOFFI: {}", has_variable_aoffi);
@@ -261,6 +269,10 @@ Device::Device() {
if (Settings::values.use_assembly_shaders.GetValue() && !use_assembly_shaders) {
LOG_ERROR(Render_OpenGL, "Assembly shaders enabled but not supported");
}
+
+ if (Settings::values.use_asynchronous_shaders.GetValue() && !use_asynchronous_shaders) {
+ LOG_WARNING(Render_OpenGL, "Asynchronous shader compilation enabled but not supported");
+ }
}
Device::Device(std::nullptr_t) {