FramebufferManager: Use D24S8 on Adreno when using Vulkan
D32F clears are broken on Adreno, which resulted in smeared geometry across the screen.
This commit is contained in:
parent
3323265d91
commit
dae161e138
|
@ -108,7 +108,8 @@ static BugInfo m_known_bugs[] = {
|
||||||
-1.0, true},
|
-1.0, true},
|
||||||
{API_VULKAN, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN,
|
{API_VULKAN, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN,
|
||||||
BUG_BROKEN_CLEAR_LOADOP_RENDERPASS, -1.0, -1.0, true},
|
BUG_BROKEN_CLEAR_LOADOP_RENDERPASS, -1.0, -1.0, true},
|
||||||
};
|
{API_VULKAN, OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM, Family::UNKNOWN, BUG_BROKEN_D32F_CLEAR,
|
||||||
|
-1.0, -1.0, true}};
|
||||||
|
|
||||||
static std::map<Bug, BugInfo> m_bugs;
|
static std::map<Bug, BugInfo> m_bugs;
|
||||||
|
|
||||||
|
|
|
@ -269,6 +269,13 @@ enum Bug
|
||||||
// Started Version: 1.7
|
// Started Version: 1.7
|
||||||
// Ended Version: 1.10
|
// Ended Version: 1.10
|
||||||
BUG_BROKEN_CLEAR_LOADOP_RENDERPASS,
|
BUG_BROKEN_CLEAR_LOADOP_RENDERPASS,
|
||||||
|
|
||||||
|
// BUG: 32-bit depth clears are broken in the Adreno Vulkan driver, and have no effect.
|
||||||
|
// To work around this, we use a D24_S8 buffer instead, which results in a loss of accuracy.
|
||||||
|
// We still resolve this to a R32F texture, as there is no 24-bit format.
|
||||||
|
// Started version: -1
|
||||||
|
// Ended version: -1
|
||||||
|
BUG_BROKEN_D32F_CLEAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Initializes our internal vendor, device family, and driver version
|
// Initializes our internal vendor, device family, and driver version
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "VideoCommon/AbstractTexture.h"
|
#include "VideoCommon/AbstractTexture.h"
|
||||||
|
#include "VideoCommon/DriverDetails.h"
|
||||||
#include "VideoCommon/RenderBase.h"
|
#include "VideoCommon/RenderBase.h"
|
||||||
|
|
||||||
std::unique_ptr<FramebufferManagerBase> g_framebuffer_manager;
|
std::unique_ptr<FramebufferManagerBase> g_framebuffer_manager;
|
||||||
|
@ -17,5 +18,11 @@ FramebufferManagerBase::~FramebufferManagerBase() = default;
|
||||||
|
|
||||||
AbstractTextureFormat FramebufferManagerBase::GetEFBDepthFormat()
|
AbstractTextureFormat FramebufferManagerBase::GetEFBDepthFormat()
|
||||||
{
|
{
|
||||||
return AbstractTextureFormat::D32F;
|
// 32-bit depth clears are broken in the Adreno Vulkan driver, and have no effect.
|
||||||
|
// To work around this, we use a D24_S8 buffer instead, which results in a loss of accuracy.
|
||||||
|
// We still resolve this to a R32F texture, as there is no 24-bit format.
|
||||||
|
if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_D32F_CLEAR))
|
||||||
|
return AbstractTextureFormat::D24_S8;
|
||||||
|
else
|
||||||
|
return AbstractTextureFormat::D32F;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue