diff options
| author | 2021-12-27 23:59:32 -0500 | |
|---|---|---|
| committer | 2021-12-29 19:03:50 -0500 | |
| commit | b84d429c2ec59e54a89d9d4e34b0df9f22172e8f (patch) | |
| tree | e275b74a6fb2d16219697cbad38925e2e660e058 /src/video_core | |
| parent | emit_glsl_integer: Use negation work around (diff) | |
| download | yuzu-b84d429c2ec59e54a89d9d4e34b0df9f22172e8f.tar.gz yuzu-b84d429c2ec59e54a89d9d4e34b0df9f22172e8f.tar.xz yuzu-b84d429c2ec59e54a89d9d4e34b0df9f22172e8f.zip | |
glsl_context_get_set: Add alternative cbuf type for broken drivers
some drivers have a bug bitwise converting floating point cbuf values to uint variables. This adds a workaround for these drivers to make all cbufs uint and convert to floating point as needed.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_device.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_device.h | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 1 |
3 files changed, 8 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index 0764ea6e0..32736126f 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp | |||
| @@ -182,17 +182,12 @@ Device::Device() { | |||
| 182 | shader_backend = Settings::ShaderBackend::GLSL; | 182 | shader_backend = Settings::ShaderBackend::GLSL; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | if (shader_backend == Settings::ShaderBackend::GLSL && is_nvidia && | 185 | if (shader_backend == Settings::ShaderBackend::GLSL && is_nvidia) { |
| 186 | !Settings::values.renderer_debug) { | ||
| 187 | const std::string_view driver_version = version.substr(13); | 186 | const std::string_view driver_version = version.substr(13); |
| 188 | const int version_major = | 187 | const int version_major = |
| 189 | std::atoi(driver_version.substr(0, driver_version.find(".")).data()); | 188 | std::atoi(driver_version.substr(0, driver_version.find(".")).data()); |
| 190 | |||
| 191 | if (version_major >= 495) { | 189 | if (version_major >= 495) { |
| 192 | LOG_WARNING(Render_OpenGL, "NVIDIA drivers 495 and later causes significant problems " | 190 | has_cbuf_ftou_bug = true; |
| 193 | "with yuzu. Forcing GLASM as a mitigation."); | ||
| 194 | shader_backend = Settings::ShaderBackend::GLASM; | ||
| 195 | use_assembly_shaders = true; | ||
| 196 | } | 191 | } |
| 197 | } | 192 | } |
| 198 | 193 | ||
diff --git a/src/video_core/renderer_opengl/gl_device.h b/src/video_core/renderer_opengl/gl_device.h index de9e41659..fe53ef991 100644 --- a/src/video_core/renderer_opengl/gl_device.h +++ b/src/video_core/renderer_opengl/gl_device.h | |||
| @@ -152,6 +152,10 @@ public: | |||
| 152 | return need_fastmath_off; | 152 | return need_fastmath_off; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | bool HasCbufFtouBug() const { | ||
| 156 | return has_cbuf_ftou_bug; | ||
| 157 | } | ||
| 158 | |||
| 155 | Settings::ShaderBackend GetShaderBackend() const { | 159 | Settings::ShaderBackend GetShaderBackend() const { |
| 156 | return shader_backend; | 160 | return shader_backend; |
| 157 | } | 161 | } |
| @@ -200,6 +204,7 @@ private: | |||
| 200 | bool has_sparse_texture_2{}; | 204 | bool has_sparse_texture_2{}; |
| 201 | bool warp_size_potentially_larger_than_guest{}; | 205 | bool warp_size_potentially_larger_than_guest{}; |
| 202 | bool need_fastmath_off{}; | 206 | bool need_fastmath_off{}; |
| 207 | bool has_cbuf_ftou_bug{}; | ||
| 203 | 208 | ||
| 204 | std::string vendor_name; | 209 | std::string vendor_name; |
| 205 | }; | 210 | }; |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 29c6e1a5f..1efcc3562 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -214,6 +214,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo | |||
| 214 | .has_broken_fp16_float_controls = false, | 214 | .has_broken_fp16_float_controls = false, |
| 215 | .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), | 215 | .has_gl_component_indexing_bug = device.HasComponentIndexingBug(), |
| 216 | .has_gl_precise_bug = device.HasPreciseBug(), | 216 | .has_gl_precise_bug = device.HasPreciseBug(), |
| 217 | .has_gl_cbuf_ftou_bug = device.HasCbufFtouBug(), | ||
| 217 | .ignore_nan_fp_comparisons = true, | 218 | .ignore_nan_fp_comparisons = true, |
| 218 | .gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(), | 219 | .gl_max_compute_smem_size = device.GetMaxComputeSharedMemorySize(), |
| 219 | }, | 220 | }, |