Skip to content

Commit

Permalink
VideoCommon: Gate Multi-Threaded Shader Pre-Compilation behind a bug …
Browse files Browse the repository at this point in the history
…entry
  • Loading branch information
DevJPM authored and unknown committed Nov 22, 2021
1 parent 61cfd86 commit 613c456
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
15 changes: 15 additions & 0 deletions Source/Core/VideoCommon/DriverDetails.cpp
Expand Up @@ -131,6 +131,21 @@ constexpr BugInfo m_known_bugs[] = {
-1.0, -1.0, true},
{API_VULKAN, OS_OSX, VENDOR_ATI, DRIVER_PORTABILITY, Family::UNKNOWN,
BUG_BROKEN_SUBGROUP_INVOCATION_ID, -1.0, -1.0, true},
// Default cases for broken MT precompilation
// Default cases get replaced by known-good places during init
{API_OPENGL, OS_ALL, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, true},
{API_VULKAN, OS_ALL, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, true},
// known good cases for broken MT precompilation
{API_OPENGL, OS_OSX, VENDOR_NVIDIA, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, false},
{API_VULKAN, OS_OSX, VENDOR_NVIDIA, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, false},
{API_OPENGL, OS_WINDOWS, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, false},
{API_VULKAN, OS_WINDOWS, VENDOR_ALL, DRIVER_ALL, Family::UNKNOWN,
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION, -1.0, -1.0, false},
};

static std::map<Bug, BugInfo> m_bugs;
Expand Down
8 changes: 8 additions & 0 deletions Source/Core/VideoCommon/DriverDetails.h
Expand Up @@ -314,6 +314,14 @@ enum Bug
// Started version: -1
// Ended version: -1
BUG_BROKEN_SUBGROUP_INVOCATION_ID,

// BUG: Multi-threaded shader pre-compilation sometimes crashes
// Used primarily in Videoconfig.cpp's GetNumAutoShaderPreCompilerThreads()
// refer to https://github.com/dolphin-emu/dolphin/pull/9414 for initial validation coverage
// All untested platforms will report as having this bug as to avoid crashes
// Note that things should highly likely work out fine on D3D
// so we didn't extend the Bug API to also support D3D
BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION
};

// Initializes our internal vendor, device family, and driver version
Expand Down
12 changes: 11 additions & 1 deletion Source/Core/VideoCommon/VideoConfig.cpp
Expand Up @@ -10,6 +10,7 @@
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/Movie.h"
#include "VideoCommon/DriverDetails.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/VideoCommon.h"
#include "VideoCommon/VideoConfig.h"
Expand Down Expand Up @@ -204,8 +205,17 @@ u32 VideoConfig::GetShaderPrecompilerThreads() const
if (!backend_info.bSupportsBackgroundCompiling)
return 0;

const bool bugDatabaseSupported =
backend_info.api_type == APIType::OpenGL || backend_info.api_type == APIType::Vulkan;
// DirectX has always worked in our tests in PR#9414
const bool multiThreadingWorking =
!bugDatabaseSupported ||
!DriverDetails::HasBug(DriverDetails::BUG_BROKEN_MULTITHREADED_SHADER_PRECOMPILATION);

if (iShaderPrecompilerThreads >= 0)
return static_cast<u32>(iShaderPrecompilerThreads);
else
else if (multiThreadingWorking)
return GetNumAutoShaderPreCompilerThreads();
else
return 1;
}

0 comments on commit 613c456

Please sign in to comment.