Skip to content

Commit 9cfe7a7

Browse files
committed
GPU (Windows): rewrites with D3DKMT APIs
... which aligns to WSL impl
1 parent 604aacb commit 9cfe7a7

2 files changed

Lines changed: 249 additions & 374 deletions

File tree

src/detection/gpu/d3dkmthk.h

Lines changed: 7 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ typedef struct _D3DKMT_SEGMENTSIZEINFO {
9999

100100
typedef struct _D3DKMT_ADAPTERTYPE {
101101
union {
102-
struct
103-
{
102+
struct {
104103
UINT RenderSupported : 1; // WDDM 1.2, Windows 8
105104
UINT DisplaySupported : 1;
106105
UINT SoftwareDevice : 1;
@@ -181,8 +180,11 @@ typedef enum _KMTQUERYADAPTERINFOTYPE {
181180
KMTQAITYPE_NODEMETADATA = 25, // WDDM 2.0, Windows 10
182181
KMTQAITYPE_PHYSICALADAPTERDEVICEIDS = 31,
183182
KMTQAITYPE_QUERY_ADAPTER_UNIQUE_GUID = 60, // WDDM 2.4, Windows 10 (1803)
184-
// This reports the GUID string used by the adapter's registry key (DirectX and Video)
183+
184+
KMTQAITYPE_NODEPERFDATA = 61,
185+
KMTQAITYPE_ADAPTERPERFDATA = 62,
185186
} KMTQUERYADAPTERINFOTYPE;
187+
// `KMTQAITYPE_QUERY_ADAPTER_UNIQUE_GUID` reports the GUID string used by the adapter's registry key (DirectX and Video)
186188

187189
typedef struct _D3DKMT_QUERYADAPTERINFO {
188190
D3DKMT_HANDLE hAdapter;
@@ -199,20 +201,9 @@ typedef enum _D3DKMT_MEMORY_SEGMENT_GROUP {
199201
} D3DKMT_MEMORY_SEGMENT_GROUP;
200202

201203
typedef enum _D3DKMT_QUERYSTATISTICS_TYPE {
202-
D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER = 10, // WDDM 2.4, Windows 10 April 2018 Update (version 1803)
203204
D3DKMT_QUERYSTATISTICS_SEGMENT_GROUP_USAGE = 17, // WDDM 3.1, Windows 11 2022 Update (version 22H2)
204-
D3DKMT_QUERYSTATISTICS_NODE2 = 18,
205205
} D3DKMT_QUERYSTATISTICS_TYPE;
206206

207-
typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER {
208-
ULONG PhysicalAdapterIndex;
209-
} D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER;
210-
211-
typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_NODE2 {
212-
UINT16 PhysicalAdapterIndex;
213-
UINT16 NodeOrdinal;
214-
} D3DKMT_QUERYSTATISTICS_QUERY_NODE2;
215-
216207
typedef struct _D3DKMT_ADAPTER_PERFDATA {
217208
UINT32 PhysicalAdapterIndex; // in: The physical adapter index, in an LDA chain
218209
D3DKMT_ALIGN64 ULONGLONG MemoryFrequency; // out: Clock frequency of the memory in hertz
@@ -226,33 +217,6 @@ typedef struct _D3DKMT_ADAPTER_PERFDATA {
226217
UCHAR PowerStateOverride; // out: Overrides dxgkrnls power view of linked adapters.
227218
} D3DKMT_ADAPTER_PERFDATA;
228219

229-
typedef struct _D3DKMT_ADAPTER_PERFDATACAPS {
230-
UINT32 PhysicalAdapterIndex; // in: The physical adapter index, in an LDA chain
231-
D3DKMT_ALIGN64 ULONGLONG MaxMemoryBandwidth; // out: Max memory bandwidth in bytes for 1 second
232-
D3DKMT_ALIGN64 ULONGLONG MaxPCIEBandwidth; // out: Max pcie bandwidth in bytes for 1 second
233-
ULONG MaxFanRPM; // out: Max fan rpm
234-
ULONG TemperatureMax; // out: Max temperature before damage levels
235-
ULONG TemperatureWarning; // out: The temperature level where throttling begins.
236-
} D3DKMT_ADAPTER_PERFDATACAPS;
237-
238-
#define DXGK_MAX_GPUVERSION_NAME_LENGTH 32
239-
240-
typedef struct _D3DKMT_GPUVERSION {
241-
UINT32 PhysicalAdapterIndex; // in: The physical adapter index, in an LDA chain
242-
WCHAR BiosVersion[DXGK_MAX_GPUVERSION_NAME_LENGTH]; // out: The gpu bios version
243-
WCHAR GpuArchitecture[DXGK_MAX_GPUVERSION_NAME_LENGTH]; // out: The gpu architectures name.
244-
} D3DKMT_GPUVERSION;
245-
246-
typedef struct _D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION {
247-
D3DKMT_ADAPTER_PERFDATA AdapterPerfData;
248-
D3DKMT_ADAPTER_PERFDATACAPS AdapterPerfDataCaps;
249-
D3DKMT_GPUVERSION GpuVersion;
250-
} D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION;
251-
252-
typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION {
253-
D3DKMT_ALIGN64 UINT64 Reserved[34];
254-
} D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION;
255-
256220
typedef struct _D3DKMT_NODE_PERFDATA {
257221
UINT32 NodeOrdinal; // in: Node ordinal of the requested engine.
258222
UINT32 PhysicalAdapterIndex; // in: The physical adapter index, in an LDA chain
@@ -266,13 +230,6 @@ typedef struct _D3DKMT_NODE_PERFDATA {
266230
D3DKMT_ALIGN64 ULONGLONG MaxTransitionLatency; // out: Max transition latency to change the frequency in 100 nanoseconds
267231
} D3DKMT_NODE_PERFDATA;
268232

269-
typedef struct _D3DKMT_QUERYSTATISTICS_NODE_INFORMATION {
270-
D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION GlobalInformation; // Global statistics
271-
D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION SystemInformation; // Statistics for system thread
272-
D3DKMT_NODE_PERFDATA NodePerfData;
273-
UINT32 Reserved[3];
274-
} D3DKMT_QUERYSTATISTICS_NODE_INFORMATION;
275-
276233
typedef struct _D3DKMT_QUERYSTATISTICS_MEMORY_USAGE {
277234
D3DKMT_ALIGN64 UINT64 AllocatedBytes;
278235
D3DKMT_ALIGN64 UINT64 FreeBytes;
@@ -282,8 +239,6 @@ typedef struct _D3DKMT_QUERYSTATISTICS_MEMORY_USAGE {
282239
} D3DKMT_QUERYSTATISTICS_MEMORY_USAGE;
283240

284241
typedef union _D3DKMT_QUERYSTATISTICS_RESULT {
285-
D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION PhysAdapterInformation;
286-
D3DKMT_QUERYSTATISTICS_NODE_INFORMATION NodeInformation;
287242
D3DKMT_QUERYSTATISTICS_MEMORY_USAGE SegmentGroupUsageInformation;
288243
uint8_t Padding[776];
289244
} D3DKMT_QUERYSTATISTICS_RESULT;
@@ -300,9 +255,7 @@ typedef struct _D3DKMT_QUERYSTATISTICS {
300255
D3DKMT_QUERYSTATISTICS_RESULT QueryResult; // out: requested data
301256

302257
union {
303-
D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER QueryPhysAdapter; // in: id of physical adapter to get statistics for
304258
D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT_GROUP_USAGE QuerySegmentGroupUsage;
305-
D3DKMT_QUERYSTATISTICS_QUERY_NODE2 QueryNode2; // in: id of node to get statistics for
306259
};
307260
} D3DKMT_QUERYSTATISTICS;
308261
static_assert(sizeof(D3DKMT_QUERYSTATISTICS) ==
@@ -328,10 +281,10 @@ typedef enum {
328281
DXGK_ENGINE_TYPE_VIDEO_CODEC,
329282
DXGK_ENGINE_TYPE_MAX
330283
} DXGK_ENGINE_TYPE;
284+
331285
typedef struct _DXGK_NODEMETADATA_FLAGS {
332286
union {
333-
struct
334-
{
287+
struct {
335288
UINT ContextSchedulingSupported : 1; // WDDM 2.2
336289
UINT RingBufferFenceRelease : 1; // WDDM 2.5
337290
UINT SupportTrackedWorkload : 1;

0 commit comments

Comments
 (0)