|
@@ -26,6 +26,7 @@
|
|
#include <d3d9.h>
|
|
#include <d3d9.h>
|
|
#include "d3d11-subsystem.hpp"
|
|
#include "d3d11-subsystem.hpp"
|
|
#include <shellscalingapi.h>
|
|
#include <shellscalingapi.h>
|
|
|
|
+#include <d3dkmthk.h>
|
|
|
|
|
|
struct UnsupportedHWError : HRError {
|
|
struct UnsupportedHWError : HRError {
|
|
inline UnsupportedHWError(const char *str, HRESULT hr)
|
|
inline UnsupportedHWError(const char *str, HRESULT hr)
|
|
@@ -524,6 +525,44 @@ static bool set_priority(ID3D11Device *device)
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+
|
|
|
|
+static bool adapter_hags_enabled(DXGI_ADAPTER_DESC *desc)
|
|
|
|
+{
|
|
|
|
+ D3DKMT_OPENADAPTERFROMLUID d3dkmt_openluid{};
|
|
|
|
+ bool hags_enabled = false;
|
|
|
|
+ NTSTATUS res;
|
|
|
|
+
|
|
|
|
+ d3dkmt_openluid.AdapterLuid = desc->AdapterLuid;
|
|
|
|
+
|
|
|
|
+ res = D3DKMTOpenAdapterFromLuid(&d3dkmt_openluid);
|
|
|
|
+ if (FAILED(res)) {
|
|
|
|
+ blog(LOG_DEBUG, "Failed opening D3DKMT adapter: %x", res);
|
|
|
|
+ return hags_enabled;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ D3DKMT_WDDM_2_7_CAPS caps = {};
|
|
|
|
+ D3DKMT_QUERYADAPTERINFO args = {};
|
|
|
|
+ args.hAdapter = d3dkmt_openluid.hAdapter;
|
|
|
|
+ args.Type = KMTQAITYPE_WDDM_2_7_CAPS;
|
|
|
|
+ args.pPrivateDriverData = ∩︀
|
|
|
|
+ args.PrivateDriverDataSize = sizeof(caps);
|
|
|
|
+ res = D3DKMTQueryAdapterInfo(&args);
|
|
|
|
+
|
|
|
|
+ /* On Windows 10 pre-2004 this will fail, but HAGS isn't supported
|
|
|
|
+ * there anyway. */
|
|
|
|
+ if (SUCCEEDED(res))
|
|
|
|
+ hags_enabled = caps.HwSchEnabled;
|
|
|
|
+
|
|
|
|
+ D3DKMT_CLOSEADAPTER d3dkmt_close = {d3dkmt_openluid.hAdapter};
|
|
|
|
+ res = D3DKMTCloseAdapter(&d3dkmt_close);
|
|
|
|
+ if (FAILED(res)) {
|
|
|
|
+ blog(LOG_DEBUG, "Failed closing D3DKMT adapter %x: %x",
|
|
|
|
+ d3dkmt_openluid.hAdapter, res);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return hags_enabled;
|
|
|
|
+}
|
|
|
|
+
|
|
static bool CheckFormat(ID3D11Device *device, DXGI_FORMAT format)
|
|
static bool CheckFormat(ID3D11Device *device, DXGI_FORMAT format)
|
|
{
|
|
{
|
|
constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE2D |
|
|
constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE2D |
|
|
@@ -573,6 +612,13 @@ void gs_device::InitDevice(uint32_t adapterIdx)
|
|
blog(LOG_INFO, "DXGI increase maximum frame latency failed");
|
|
blog(LOG_INFO, "DXGI increase maximum frame latency failed");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Log HAGS status */
|
|
|
|
+ bool hags_enabled = adapter_hags_enabled(&desc);
|
|
|
|
+ if (hags_enabled) {
|
|
|
|
+ blog(LOG_WARNING,
|
|
|
|
+ "Hardware-Accelerated GPU Scheduling enabled on adapter!");
|
|
|
|
+ }
|
|
|
|
+
|
|
/* adjust gpu thread priority on non-intel GPUs */
|
|
/* adjust gpu thread priority on non-intel GPUs */
|
|
#if USE_GPU_PRIORITY
|
|
#if USE_GPU_PRIORITY
|
|
if (desc.VendorId != 0x8086 && !set_priority(device)) {
|
|
if (desc.VendorId != 0x8086 && !set_priority(device)) {
|