diff options
| author | Stenzek <stenzek@gmail.com> | 2018-03-16 23:10:22 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2018-03-26 01:57:41 +1000 |
| commit | 2f1a7cbee1ffecdd25ebc206ceab55ef934b7256 (patch) | |
| tree | 1cbf78b64fbf293ede3a9bd47e586a0d4bb03a6b /Source/Core/VideoCommon/VertexManagerBase.cpp | |
| parent | 5c83e18fbd3606587e71a7f1cc54e4cf6473609f (diff) | |
Implement "Skip" ubershader mode
Skip ubershader mode works the same as hybrid ubershaders in that the
shaders are compiled asynchronously. However, instead of using the
ubershader to draw the object, it skips it entirely until the
specialized shader is made available.
This mode will likely result in broken effects where a game creates an
EFB copy, and does not redraw it every frame. Therefore, it is not a
recommended option, however, it may result in better performance on
low-end systems.
Diffstat (limited to 'Source/Core/VideoCommon/VertexManagerBase.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/VertexManagerBase.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index b54b8060b9..8364b039c5 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -566,13 +566,25 @@ void VertexManagerBase::UpdatePipelineObject() m_current_pipeline_object = nullptr; m_pipeline_config_changed = false; - if (g_ActiveConfig.iUberShaderMode == UberShaderMode::Disabled) + switch (g_ActiveConfig.iShaderCompilationMode) + { + case ShaderCompilationMode::Synchronous: { // Ubershaders disabled? Block and compile the specialized shader. m_current_pipeline_object = g_shader_cache->GetPipelineForUid(m_current_pipeline_config); - return; } - else if (g_ActiveConfig.iUberShaderMode == UberShaderMode::Hybrid) + break; + + case ShaderCompilationMode::SynchronousUberShaders: + { + // Exclusive ubershader mode, always use ubershaders. + m_current_pipeline_object = + g_shader_cache->GetUberPipelineForUid(m_current_uber_pipeline_config); + } + break; + + case ShaderCompilationMode::AsynchronousUberShaders: + case ShaderCompilationMode::AsynchronousSkipRendering: { // Can we background compile shaders? If so, get the pipeline asynchronously. auto res = g_shader_cache->GetPipelineForUidAsync(m_current_pipeline_config); @@ -582,8 +594,20 @@ void VertexManagerBase::UpdatePipelineObject() m_current_pipeline_object = *res; return; } - } - // Exclusive ubershader mode, or hybrid and shaders are still compiling. - m_current_pipeline_object = g_shader_cache->GetUberPipelineForUid(m_current_uber_pipeline_config); + if (g_ActiveConfig.iShaderCompilationMode == ShaderCompilationMode::AsynchronousUberShaders) + { + // Specialized shaders not ready, use the ubershaders. + m_current_pipeline_object = + g_shader_cache->GetUberPipelineForUid(m_current_uber_pipeline_config); + } + else + { + // Ensure we try again next draw. Otherwise, if no registers change between frames, the + // object will never be drawn, even when the shader is ready. + m_pipeline_config_changed = true; + } + } + break; + } } |
