VK: Add INI options to disable some vendor checks, and to disable the shader cache.

This commit is contained in:
Henrik Rydgård 2018-12-11 00:22:16 +01:00
parent b282d83258
commit 25b2ba013b
4 changed files with 16 additions and 4 deletions

View File

@ -605,6 +605,8 @@ static ConfigSetting graphicsSettings[] = {
#ifdef _WIN32
ConfigSetting("D3D11Device", &g_Config.sD3D11Device, "", true, false),
#endif
ConfigSetting("VendorChecksEnabled", &g_Config.bVendorChecksEnabled, true, false, false),
ConfigSetting("ShaderCacheEnabled", &g_Config.bShaderCacheEnabled, true, false, false),
ReportedConfigSetting("RenderingMode", &g_Config.iRenderingMode, &DefaultRenderingMode, true, true),
ConfigSetting("SoftwareRenderer", &g_Config.bSoftwareRendering, false, true, true),
ReportedConfigSetting("HardwareTransform", &g_Config.bHardwareTransform, true, true, true),

View File

@ -131,6 +131,8 @@ public:
bool bSoftwareRendering;
bool bHardwareTransform; // only used in the GLES backend
bool bSoftwareSkinning; // may speed up some games
bool bVendorChecksEnabled;
bool bShaderCacheEnabled;
int iRenderingMode; // 0 = non-buffered rendering 1 = buffered rendering
int iTexFiltering; // 1 = off , 2 = nearest , 3 = linear , 4 = linear(CG)

View File

@ -86,7 +86,9 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_
bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT);
bool hasStencilOutput = stencilToAlpha != REPLACE_ALPHA_NO || id.Bit(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE) == 0;
bool isAdreno = vulkanVendorId == VULKAN_VENDOR_QUALCOMM;
// TODO: This is a bug affecting shader cache generality - we CANNOT check anything but the shader ID and (indirectly) the game ID in here really.
// Need to move this check somehow to the shader ID generator. That's tricky though because it's generic...
bool isAdreno = vulkanVendorId == VULKAN_VENDOR_QUALCOMM && g_Config.bVendorChecksEnabled;
if (earlyFragmentTests) {
WRITE(p, "layout (early_fragment_tests) in;\n");

View File

@ -101,7 +101,7 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw)
// Load shader cache.
std::string discID = g_paramSFO.GetDiscID();
if (discID.size()) {
if (discID.size() && g_Config.bShaderCacheEnabled) {
File::CreateFullPath(GetSysDirectory(DIRECTORY_APP_CACHE));
shaderCachePath_ = GetSysDirectory(DIRECTORY_APP_CACHE) + "/" + discID + ".vkshadercache";
shaderCacheLoaded_ = false;
@ -201,6 +201,10 @@ void GPU_Vulkan::CheckGPUFeatures() {
break;
}
// Might enable this later - in the first round we are mostly looking at depth/stencil/discard.
// if (g_Config.bDisableVendorChecks)
// features |= GPU_SUPPORTS_ACCURATE_DEPTH;
// Mandatory features on Vulkan, which may be checked in "centralized" code
features |= GPU_SUPPORTS_TEXTURE_LOD_CONTROL;
features |= GPU_SUPPORTS_FBO;
@ -224,7 +228,7 @@ void GPU_Vulkan::CheckGPUFeatures() {
// We thought we had a bug here on nVidia but turns out we accidentally #ifdef-ed out crucial
// code on Android.
case VULKAN_VENDOR_INTEL:
// Workaround for Intel driver bug.
// Workaround for Intel driver bug. TODO: Re-enable after some driver version
break;
case VULKAN_VENDOR_AMD:
// See issue #10074, and also #10065 (AMD) and #10109 for the choice of the driver version to check for
@ -235,6 +239,8 @@ void GPU_Vulkan::CheckGPUFeatures() {
features |= GPU_SUPPORTS_DUALSOURCE_BLEND;
break;
}
if (!g_Config.bVendorChecksEnabled)
features |= GPU_SUPPORTS_DUALSOURCE_BLEND;
}
if (vulkan_->GetFeaturesEnabled().logicOp) {
features |= GPU_SUPPORTS_LOGIC_OP;
@ -501,7 +507,7 @@ void GPU_Vulkan::DeviceLost() {
while (!IsReady()) {
sleep_ms(10);
}
if (!shaderCachePath_.empty()) {
if (!shaderCachePath_.empty() && g_Config.bShaderCacheEnabled) {
SaveCache(shaderCachePath_);
}
DestroyDeviceObjects();