mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 06:39:46 -06:00
OGL: Re-implement async shader compiling
This commit is contained in:
@ -102,8 +102,6 @@ static BugInfo m_known_bugs[] = {
|
||||
true},
|
||||
{API_OPENGL, OS_LINUX, VENDOR_MESA, DRIVER_I965, Family::UNKNOWN,
|
||||
BUG_SHARED_CONTEXT_SHADER_COMPILATION, -1.0, -1.0, true},
|
||||
{API_OPENGL, OS_LINUX, VENDOR_MESA, DRIVER_NOUVEAU, Family::UNKNOWN,
|
||||
BUG_SHARED_CONTEXT_SHADER_COMPILATION, -1.0, -1.0, true},
|
||||
{API_VULKAN, OS_ALL, VENDOR_NVIDIA, DRIVER_NVIDIA, Family::UNKNOWN, BUG_BROKEN_MSAA_CLEAR, -1.0,
|
||||
-1.0, true},
|
||||
{API_VULKAN, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN,
|
||||
|
@ -252,8 +252,10 @@ enum Bug
|
||||
// the negated value to a temporary variable then using that in the bitwise op.
|
||||
BUG_BROKEN_BITWISE_OP_NEGATION,
|
||||
|
||||
// Bug: Shaders are recompiled on the main thread after being previously compiled on
|
||||
// a worker thread on Mesa i965.
|
||||
// BUG: The GPU shader code appears to be context-specific on Mesa/i965.
|
||||
// This means that if we compiled the ubershaders asynchronously, they will be recompiled
|
||||
// on the main thread the first time they are used, causing stutter. For now, disable
|
||||
// asynchronous compilation on Mesa i965.
|
||||
// Started version: -1
|
||||
// Ended Version: -1
|
||||
BUG_SHARED_CONTEXT_SHADER_COMPILATION,
|
||||
|
@ -1027,3 +1027,8 @@ bool Renderer::UseVertexDepthRange() const
|
||||
// in the vertex shader.
|
||||
return fabs(xfmem.viewport.zRange) > 16777215.0f || fabs(xfmem.viewport.farZ) > 16777215.0f;
|
||||
}
|
||||
|
||||
std::unique_ptr<VideoCommon::AsyncShaderCompiler> Renderer::CreateAsyncShaderCompiler()
|
||||
{
|
||||
return std::make_unique<VideoCommon::AsyncShaderCompiler>();
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "Common/Flag.h"
|
||||
#include "Common/MathUtil.h"
|
||||
#include "VideoCommon/AVIDump.h"
|
||||
#include "VideoCommon/AsyncShaderCompiler.h"
|
||||
#include "VideoCommon/BPMemory.h"
|
||||
#include "VideoCommon/FPSCounter.h"
|
||||
#include "VideoCommon/RenderState.h"
|
||||
@ -189,6 +190,8 @@ public:
|
||||
void ResizeSurface(int new_width, int new_height);
|
||||
bool UseVertexDepthRange() const;
|
||||
|
||||
virtual std::unique_ptr<VideoCommon::AsyncShaderCompiler> CreateAsyncShaderCompiler();
|
||||
|
||||
virtual void Shutdown();
|
||||
|
||||
// Drawing utility shaders.
|
||||
|
@ -27,7 +27,7 @@ bool ShaderCache::Initialize()
|
||||
m_efb_multisamples = g_ActiveConfig.iMultisamples;
|
||||
|
||||
// Create the async compiler, and start the worker threads.
|
||||
m_async_shader_compiler = std::make_unique<VideoCommon::AsyncShaderCompiler>();
|
||||
m_async_shader_compiler = g_renderer->CreateAsyncShaderCompiler();
|
||||
m_async_shader_compiler->ResizeWorkerThreads(g_ActiveConfig.GetShaderPrecompilerThreads());
|
||||
|
||||
// Load shader and UID caches.
|
||||
|
@ -187,8 +187,7 @@ static u32 GetNumAutoShaderCompilerThreads()
|
||||
|
||||
u32 VideoConfig::GetShaderCompilerThreads() const
|
||||
{
|
||||
// videocommon shader cache is currently broken on OGL, needs multiple contexts.
|
||||
if (backend_info.api_type == APIType::OpenGL)
|
||||
if (!backend_info.bSupportsBackgroundCompiling)
|
||||
return 0;
|
||||
|
||||
if (iShaderCompilerThreads >= 0)
|
||||
@ -199,8 +198,7 @@ u32 VideoConfig::GetShaderCompilerThreads() const
|
||||
|
||||
u32 VideoConfig::GetShaderPrecompilerThreads() const
|
||||
{
|
||||
// videocommon shader cache is currently broken on OGL, needs multiple contexts.
|
||||
if (backend_info.api_type == APIType::OpenGL)
|
||||
if (!backend_info.bSupportsBackgroundCompiling)
|
||||
return 0;
|
||||
|
||||
if (iShaderPrecompilerThreads >= 0)
|
||||
|
@ -227,6 +227,7 @@ struct VideoConfig final
|
||||
bool bSupportsDynamicSamplerIndexing; // Needed by UberShaders, so must stay in VideoCommon
|
||||
bool bSupportsBPTCTextures;
|
||||
bool bSupportsFramebufferFetch; // Used as an alternative to dual-source blend on GLES
|
||||
bool bSupportsBackgroundCompiling;
|
||||
} backend_info;
|
||||
|
||||
// Utility
|
||||
|
Reference in New Issue
Block a user