summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-06-06 02:56:42 -0300
committerGravatar ReinUsesLisp2020-06-06 02:56:42 -0300
commite78d681a6cabc3a3a3380fadd06f98f7ff7cb665 (patch)
tree5575cba3da917e6e7282b414dd6cbb094eb3d24c /src
parentMerge pull request #4013 from ReinUsesLisp/skip-no-xfb (diff)
downloadyuzu-e78d681a6cabc3a3a3380fadd06f98f7ff7cb665.tar.gz
yuzu-e78d681a6cabc3a3a3380fadd06f98f7ff7cb665.tar.xz
yuzu-e78d681a6cabc3a3a3380fadd06f98f7ff7cb665.zip
gl_device: Black list NVIDIA 443.24 for fast buffer uploads
Skip fast buffer uploads on Nvidia 443.24 Vulkan beta driver on OpenGL. This driver throws the following error when calling BufferSubData or BufferData on buffers that are candidates for fast constant buffer uploads. This is the equivalens to push constants on Vulkan, except that they can access the full buffer. The error: Unknown internal debug message. The NVIDIA OpenGL driver has encountered an out of memory error. This application might behave inconsistently and fail. If this error persists on future drivers, we might have to look deeper into this issue. For now, we can black list it and log it as a temporary solution.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index b772c37d9..a14641b97 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -185,12 +185,20 @@ bool IsASTCSupported() {
185Device::Device() 185Device::Device()
186 : max_uniform_buffers{BuildMaxUniformBuffers()}, base_bindings{BuildBaseBindings()} { 186 : max_uniform_buffers{BuildMaxUniformBuffers()}, base_bindings{BuildBaseBindings()} {
187 const std::string_view vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); 187 const std::string_view vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
188 const auto renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER)); 188 const std::string_view version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
189 const std::vector extensions = GetExtensions(); 189 const std::vector extensions = GetExtensions();
190 190
191 const bool is_nvidia = vendor == "NVIDIA Corporation"; 191 const bool is_nvidia = vendor == "NVIDIA Corporation";
192 const bool is_amd = vendor == "ATI Technologies Inc."; 192 const bool is_amd = vendor == "ATI Technologies Inc.";
193 193
194 bool disable_fast_buffer_sub_data = false;
195 if (is_nvidia && version == "4.6.0 NVIDIA 443.24") {
196 LOG_WARNING(
197 Render_OpenGL,
198 "Beta driver 443.24 is known to have issues. There might be performance issues.");
199 disable_fast_buffer_sub_data = true;
200 }
201
194 uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT); 202 uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
195 shader_storage_alignment = GetInteger<std::size_t>(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT); 203 shader_storage_alignment = GetInteger<std::size_t>(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT);
196 max_vertex_attributes = GetInteger<u32>(GL_MAX_VERTEX_ATTRIBS); 204 max_vertex_attributes = GetInteger<u32>(GL_MAX_VERTEX_ATTRIBS);
@@ -204,7 +212,7 @@ Device::Device()
204 has_variable_aoffi = TestVariableAoffi(); 212 has_variable_aoffi = TestVariableAoffi();
205 has_component_indexing_bug = is_amd; 213 has_component_indexing_bug = is_amd;
206 has_precise_bug = TestPreciseBug(); 214 has_precise_bug = TestPreciseBug();
207 has_fast_buffer_sub_data = is_nvidia; 215 has_fast_buffer_sub_data = is_nvidia && !disable_fast_buffer_sub_data;
208 use_assembly_shaders = Settings::values.use_assembly_shaders && GLAD_GL_NV_gpu_program5 && 216 use_assembly_shaders = Settings::values.use_assembly_shaders && GLAD_GL_NV_gpu_program5 &&
209 GLAD_GL_NV_compute_program5; 217 GLAD_GL_NV_compute_program5;
210 218