From 9f9b29b83354c775501603bc74a409d1d8f2b0ea Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Thu, 28 Dec 2023 17:48:33 +0100 Subject: [PATCH] rend: force Native Depth Interpolation for AMD gpus --- core/emulator.cpp | 3 +++ core/rend/dx11/dx11context.h | 5 +++++ core/rend/dx11/dx11context_lr.h | 5 +++++ core/rend/dx9/dxcontext.cpp | 1 + core/rend/dx9/dxcontext.h | 4 ++++ core/rend/vulkan/vk_context_lr.h | 3 +++ core/rend/vulkan/vulkan_context.h | 3 +++ core/wsi/context.h | 1 + core/wsi/gl_context.cpp | 10 ++++++++++ core/wsi/gl_context.h | 4 ++++ 10 files changed, 39 insertions(+) diff --git a/core/emulator.cpp b/core/emulator.cpp index 39f3b7567..1b4b2406f 100644 --- a/core/emulator.cpp +++ b/core/emulator.cpp @@ -43,6 +43,7 @@ #include "hw/pvr/pvr.h" #include "profiler/fc_profiler.h" #include "oslib/storage.h" +#include "wsi/context.h" #include settings_t settings; @@ -327,6 +328,8 @@ static void loadSpecialSettings() config::ForceFreePlay.override(false); } } + if (GraphicsContext::Instance()->isAMD()) + config::NativeDepthInterpolation.override(true); } void dc_reset(bool hard) diff --git a/core/rend/dx11/dx11context.h b/core/rend/dx11/dx11context.h index 8e8d909c0..9067d85cf 100644 --- a/core/rend/dx11/dx11context.h +++ b/core/rend/dx11/dx11context.h @@ -55,6 +55,9 @@ public: bool isIntel() const { return vendorId == VENDOR_INTEL; } + bool isAMD() override { + return vendorId == VENDOR_ATI || vendorId == VENDOR_AMD; + } void setFrameRendered() { frameRendered = true; @@ -97,6 +100,8 @@ private: pD3DCompile d3dcompiler = nullptr; static constexpr UINT VENDOR_INTEL = 0x8086; + static constexpr UINT VENDOR_ATI = 0x1002; + static constexpr UINT VENDOR_AMD = 0x1022; }; extern DX11Context theDX11Context; #endif diff --git a/core/rend/dx11/dx11context_lr.h b/core/rend/dx11/dx11context_lr.h index 00d5ffa0d..3a043a019 100644 --- a/core/rend/dx11/dx11context_lr.h +++ b/core/rend/dx11/dx11context_lr.h @@ -50,6 +50,9 @@ public: bool isIntel() const { return vendorId == VENDOR_INTEL; } + bool isAMD() override { + return vendorId == VENDOR_ATI || vendorId == VENDOR_AMD; + } DX11Shaders& getShaders() { return shaders; @@ -90,6 +93,8 @@ private: bool supportedTexFormats[5] {}; // indexed by TextureType enum static constexpr UINT VENDOR_INTEL = 0x8086; + static constexpr UINT VENDOR_ATI = 0x1002; + static constexpr UINT VENDOR_AMD = 0x1022; }; extern DX11Context theDX11Context; #endif diff --git a/core/rend/dx9/dxcontext.cpp b/core/rend/dx9/dxcontext.cpp index 7b94a9d0f..56da2f90d 100644 --- a/core/rend/dx9/dxcontext.cpp +++ b/core/rend/dx9/dxcontext.cpp @@ -89,6 +89,7 @@ bool DXContext::init(bool keepCurrentWindow) driverName = std::string(id.Description); driverVersion = std::to_string(id.DriverVersion.HighPart >> 16) + "." + std::to_string((u16)id.DriverVersion.HighPart) + "." + std::to_string(id.DriverVersion.LowPart >> 16) + "." + std::to_string((u16)id.DriverVersion.LowPart); + amd = id.VendorId == 0x1002 || id.VendorId == 0x1022; deviceReady = true; return true; diff --git a/core/rend/dx9/dxcontext.h b/core/rend/dx9/dxcontext.h index 9f62153b3..bb8c64e38 100644 --- a/core/rend/dx9/dxcontext.h +++ b/core/rend/dx9/dxcontext.h @@ -50,6 +50,9 @@ public: std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return amd; + } void setFrameRendered() { frameRendered = true; } @@ -69,6 +72,7 @@ private: bool frameRendered = false; std::string driverName; std::string driverVersion; + bool amd = false; bool deviceReady = false; }; extern DXContext theDXContext; diff --git a/core/rend/vulkan/vk_context_lr.h b/core/rend/vulkan/vk_context_lr.h index 97ef7ce0f..8fa3f9de9 100644 --- a/core/rend/vulkan/vk_context_lr.h +++ b/core/rend/vulkan/vk_context_lr.h @@ -82,6 +82,9 @@ public: + "." + std::to_string(VK_API_VERSION_MINOR(props.driverVersion)) + "." + std::to_string(VK_API_VERSION_PATCH(props.driverVersion)); } + bool isAMD() override { + return vendorID == VENDOR_ATI || vendorID == VENDOR_AMD; + } vk::Format GetDepthFormat() const { return depthFormat; } static VulkanContext *Instance() { return contextInstance; } bool SupportsSamplerAnisotropy() const { return samplerAnisotropy; } diff --git a/core/rend/vulkan/vulkan_context.h b/core/rend/vulkan/vulkan_context.h index 17764ddc5..f17fe4093 100644 --- a/core/rend/vulkan/vulkan_context.h +++ b/core/rend/vulkan/vulkan_context.h @@ -95,6 +95,9 @@ public: std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return vendorID == VENDOR_ATI || vendorID == VENDOR_AMD; + } vk::Format GetDepthFormat() const { return depthFormat; } static VulkanContext *Instance() { return contextInstance; } bool SupportsSamplerAnisotropy() const { return samplerAnisotropy; } diff --git a/core/wsi/context.h b/core/wsi/context.h index ec1891f0f..c7529a18b 100644 --- a/core/wsi/context.h +++ b/core/wsi/context.h @@ -33,6 +33,7 @@ public: virtual void resize() {} virtual std::string getDriverName() = 0; virtual std::string getDriverVersion() = 0; + virtual bool isAMD() = 0; virtual bool hasPerPixel() { return false; } void setWindow(void *window, void *display = nullptr) { diff --git a/core/wsi/gl_context.cpp b/core/wsi/gl_context.cpp index 8b2dfd330..302e7811e 100644 --- a/core/wsi/gl_context.cpp +++ b/core/wsi/gl_context.cpp @@ -46,6 +46,16 @@ void GLGraphicsContext::findGLVersion() driverName = p != nullptr ? p : "unknown"; p = (const char *)glGetString(GL_VERSION); driverVersion = p != nullptr ? p : "unknown"; + p = (const char *)glGetString(GL_VENDOR); + std::string vendor = p != nullptr ? p : ""; + if (vendor.substr(0, 4) == "ATI ") + amd = true; + else if (driverName.find(" ATI ") != std::string::npos + || driverName.find(" AMD ") != std::string::npos) + // mesa + amd = true; + else + amd = false; } void GLGraphicsContext::postInit() diff --git a/core/wsi/gl_context.h b/core/wsi/gl_context.h index fa7c2914d..a3f085a6c 100644 --- a/core/wsi/gl_context.h +++ b/core/wsi/gl_context.h @@ -50,6 +50,9 @@ public: std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return amd; + } void resetUIDriver(); bool hasPerPixel() override @@ -70,6 +73,7 @@ private: bool _isGLES = false; std::string driverName; std::string driverVersion; + bool amd = false; }; #if defined(LIBRETRO)