diff options
author | bunnei <bunneidev@gmail.com> | 2020-06-24 17:40:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-24 17:40:30 +0200 |
commit | 0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c (patch) | |
tree | 4d4ae082c57945c29cad70d1afb258e8d17df717 /src/video_core/renderer_opengl/gl_device.cpp | |
parent | Merge pull request #4083 from Morph1984/B10G11R11F (diff) | |
parent | buffer_cache: Use buffer methods instead of cache virtual methods (diff) | |
download | yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.gz yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.bz2 yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.lz yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.xz yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.zst yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.zip |
Diffstat (limited to 'src/video_core/renderer_opengl/gl_device.cpp')
-rw-r--r-- | src/video_core/renderer_opengl/gl_device.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index 1011c7738..447a19595 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp @@ -188,16 +188,32 @@ bool IsASTCSupported() { return true; } +/// @brief Returns true when a GL_RENDERER is a Turing GPU +/// @param renderer GL_RENDERER string +bool IsTuring(std::string_view renderer) { + static constexpr std::array<std::string_view, 12> TURING_GPUS = { + "GTX 1650", "GTX 1660", "RTX 2060", "RTX 2070", + "RTX 2080", "TITAN RTX", "Quadro RTX 3000", "Quadro RTX 4000", + "Quadro RTX 5000", "Quadro RTX 6000", "Quadro RTX 8000", "Tesla T4", + }; + return std::any_of(TURING_GPUS.begin(), TURING_GPUS.end(), + [renderer](std::string_view candidate) { + return renderer.find(candidate) != std::string_view::npos; + }); +} + } // Anonymous namespace Device::Device() : max_uniform_buffers{BuildMaxUniformBuffers()}, base_bindings{BuildBaseBindings()} { const std::string_view vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); + const std::string_view renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER)); const std::string_view version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); const std::vector extensions = GetExtensions(); const bool is_nvidia = vendor == "NVIDIA Corporation"; const bool is_amd = vendor == "ATI Technologies Inc."; + const bool is_turing = is_nvidia && IsTuring(renderer); bool disable_fast_buffer_sub_data = false; if (is_nvidia && version == "4.6.0 NVIDIA 443.24") { @@ -221,8 +237,16 @@ Device::Device() has_variable_aoffi = TestVariableAoffi(); has_component_indexing_bug = is_amd; has_precise_bug = TestPreciseBug(); - has_fast_buffer_sub_data = is_nvidia && !disable_fast_buffer_sub_data; has_nv_viewport_array2 = GLAD_GL_NV_viewport_array2; + + // At the moment of writing this, only Nvidia's driver optimizes BufferSubData on exclusive + // uniform buffers as "push constants" + has_fast_buffer_sub_data = is_nvidia && !disable_fast_buffer_sub_data; + + // Nvidia's driver on Turing GPUs randomly crashes when the buffer is made resident, or on + // DeleteBuffers. Disable unified memory on these devices. + has_vertex_buffer_unified_memory = GLAD_GL_NV_vertex_buffer_unified_memory && !is_turing; + use_assembly_shaders = Settings::values.use_assembly_shaders && GLAD_GL_NV_gpu_program5 && GLAD_GL_NV_compute_program5 && GLAD_GL_NV_transform_feedback && GLAD_GL_NV_transform_feedback2; |