Skip to content

Commit 85594d2

Browse files
committed
GPU (Windows): restores Win8.1 support
1 parent 14cd933 commit 85594d2

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

src/detection/gpu/d3dkmthk.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ typedef union {
4040
} LARGE_INTEGER;
4141
typedef int32_t NTSTATUS; // 0 for success, -1 for failure
4242
# define NT_SUCCESS(Status) ((NTSTATUS) (Status) >= 0)
43+
# define _In_range_(low, hi)
4344
#endif
4445

4546
#define D3DKMT_ALIGN64 __attribute__((aligned(8)))
46-
#define MAX_ENUM_ADAPTERS 16
4747

4848
typedef struct D3DKMT_HANDLE {
4949
union {
@@ -68,6 +68,12 @@ typedef struct _D3DKMT_ADAPTERINFO {
6868
BOOL bPrecisePresentRegionsPreferred;
6969
} D3DKMT_ADAPTERINFO;
7070

71+
#define MAX_ENUM_ADAPTERS 16
72+
typedef struct _D3DKMT_ENUMADAPTERS {
73+
_In_range_(0, MAX_ENUM_ADAPTERS) ULONG NumAdapters;
74+
D3DKMT_ADAPTERINFO Adapters[MAX_ENUM_ADAPTERS];
75+
} D3DKMT_ENUMADAPTERS;
76+
7177
typedef struct _D3DKMT_ENUMADAPTERS2 {
7278
ULONG NumAdapters; // in/out: On input, the count of the pAdapters array buffer. On output, the number of adapters enumerated.
7379
D3DKMT_ADAPTERINFO* pAdapters; // out: Array of enumerated adapters containing NumAdapters elements
@@ -319,7 +325,8 @@ static_assert(sizeof(D3DKMT_NODEMETADATA) == 0x4E, "D3DKMT_NODEMETADATA structur
319325
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTOpenAdapterFromLuid(_Inout_ CONST D3DKMT_OPENADAPTERFROMLUID*);
320326
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTQueryAdapterInfo(_Inout_ CONST D3DKMT_QUERYADAPTERINFO*);
321327
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTCloseAdapter(_In_ CONST D3DKMT_CLOSEADAPTER*);
322-
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters2(_Inout_ D3DKMT_ENUMADAPTERS2*);
328+
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters(_Inout_ CONST D3DKMT_ENUMADAPTERS*);
329+
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters2(_Inout_ CONST D3DKMT_ENUMADAPTERS2*);
323330
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTQueryStatistics(_In_ CONST D3DKMT_QUERYSTATISTICS*);
324331

325332
#else

src/detection/gpu/gpu_windows.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,24 @@ ffGPUDetectWsl2
7474
}
7575
#endif
7676

77+
#if FF_WIN81_COMPAT
78+
D3DKMT_ENUMADAPTERS enumAdapters = {};
79+
D3DKMT_ADAPTERINFO* const adapters = enumAdapters.Adapters;
80+
NTSTATUS status = D3DKMTEnumAdapters(&enumAdapters);
81+
#else
7782
D3DKMT_ADAPTERINFO adapters[64];
7883
D3DKMT_ENUMADAPTERS2 enumAdapters = {
7984
.NumAdapters = ARRAY_SIZE(adapters),
8085
.pAdapters = adapters,
8186
};
8287
NTSTATUS status = D3DKMTEnumAdapters2(&enumAdapters);
88+
#endif
8389
if (!NT_SUCCESS(status)) {
84-
FF_DEBUG("D3DKMTEnumAdapters2 failed: %s", ffDebugNtStatus(status));
90+
FF_DEBUG("D3DKMTEnumAdapters(2) failed: %s", ffDebugNtStatus(status));
8591
return "Failed to enumerate adapters with D3DKMTEnumAdapters2";
8692
}
8793

88-
FF_DEBUG("D3DKMTEnumAdapters2 succeeded, adapter count: %" PRIu32, (uint32_t) enumAdapters.NumAdapters);
94+
FF_DEBUG("D3DKMTEnumAdapters(2) succeeded, adapter count: %" PRIu32, (uint32_t) enumAdapters.NumAdapters);
8995

9096
for (uint32_t i = 0; i < enumAdapters.NumAdapters; i++) {
9197
const D3DKMT_ADAPTERINFO* adapter = &adapters[i];

0 commit comments

Comments
 (0)