@@ -72,7 +72,8 @@ typedef struct _D3DKMT_ADAPTERTYPE
7272
7373typedef enum _KMTQUERYADAPTERINFOTYPE
7474{
75- KMTQAITYPE_ADAPTERTYPE = 15 ,
75+ KMTQAITYPE_ADAPTERTYPE = 15 , // WDDM 1.2, Windows 8
76+ KMTQAITYPE_NODEMETADATA = 25 , // WDDM 2.0, Windows 10
7677} KMTQUERYADAPTERINFOTYPE ;
7778typedef struct _D3DKMT_QUERYADAPTERINFO
7879{
@@ -82,16 +83,21 @@ typedef struct _D3DKMT_QUERYADAPTERINFO
8283 UINT PrivateDriverDataSize ;
8384} D3DKMT_QUERYADAPTERINFO ;
8485EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTQueryAdapterInfo (_Inout_ CONST D3DKMT_QUERYADAPTERINFO * );
85- #endif
8686
8787typedef enum _D3DKMT_QUERYSTATISTICS_TYPE
8888{
8989 D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER = 10 , // WDDM 2.4, Windows 10 April 2018 Update (version 1803)
90+ D3DKMT_QUERYSTATISTICS_NODE2 = 18 , // WDDM 3.1, Windows 11 2022 Update (version 22H2)
9091} D3DKMT_QUERYSTATISTICS_TYPE ;
9192typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER
9293{
9394 ULONG PhysicalAdapterIndex ;
9495} D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER ;
96+ typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_NODE2
97+ {
98+ UINT16 PhysicalAdapterIndex ;
99+ UINT16 NodeOrdinal ;
100+ } D3DKMT_QUERYSTATISTICS_QUERY_NODE2 ;
95101typedef struct _D3DKMT_ADAPTER_PERFDATA
96102{
97103 UINT32 PhysicalAdapterIndex ; // in: The physical adapter index, in an LDA chain
@@ -128,9 +134,32 @@ typedef struct _D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION
128134 D3DKMT_ADAPTER_PERFDATACAPS AdapterPerfDataCaps ;
129135 D3DKMT_GPUVERSION GpuVersion ;
130136} D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION ;
137+ typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION {
138+ D3DKMT_ALIGN64 UINT64 Reserved [34 ];
139+ } D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION ;
140+ typedef struct _D3DKMT_NODE_PERFDATA
141+ {
142+ UINT32 NodeOrdinal ; // in: Node ordinal of the requested engine.
143+ UINT32 PhysicalAdapterIndex ; // in: The physical adapter index, in an LDA chain
144+ D3DKMT_ALIGN64 ULONGLONG Frequency ; // out: Clock frequency of the engine in hertz
145+ D3DKMT_ALIGN64 ULONGLONG MaxFrequency ; // out: Max engine clock frequency
146+ D3DKMT_ALIGN64 ULONGLONG MaxFrequencyOC ;// out: Max engine over clock frequency
147+ ULONG Voltage ; // out: Voltage of the engine in milli volts mV
148+ ULONG VoltageMax ; // out: Max voltage levels in milli volts.
149+ ULONG VoltageMaxOC ; // out: Max voltage level while overclocked in milli volts.
150+ // WDDM 2.5
151+ D3DKMT_ALIGN64 ULONGLONG MaxTransitionLatency ; // out: Max transition latency to change the frequency in 100 nanoseconds
152+ } D3DKMT_NODE_PERFDATA ;
153+ typedef struct _D3DKMT_QUERYSTATISTICS_NODE_INFORMATION {
154+ D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION GlobalInformation ; //Global statistics
155+ D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION SystemInformation ; //Statistics for system thread
156+ D3DKMT_NODE_PERFDATA NodePerfData ;
157+ UINT32 Reserved [3 ];
158+ } D3DKMT_QUERYSTATISTICS_NODE_INFORMATION ;
131159typedef union _D3DKMT_QUERYSTATISTICS_RESULT
132160{
133- D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION PhysAdapterInformation ; // in: id of physical adapter to get statistics for
161+ D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION PhysAdapterInformation ;
162+ D3DKMT_QUERYSTATISTICS_NODE_INFORMATION NodeInformation ;
134163 uint8_t Padding [776 ];
135164} D3DKMT_QUERYSTATISTICS_RESULT ;
136165typedef struct _D3DKMT_QUERYSTATISTICS
@@ -142,8 +171,58 @@ typedef struct _D3DKMT_QUERYSTATISTICS
142171
143172 union
144173 {
145- D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER QueryPhysAdapter ;
174+ D3DKMT_QUERYSTATISTICS_QUERY_PHYSICAL_ADAPTER QueryPhysAdapter ; // in: id of physical adapter to get statistics for
175+ D3DKMT_QUERYSTATISTICS_QUERY_NODE2 QueryNode2 ; // in: id of node to get statistics for
146176 };
147177} D3DKMT_QUERYSTATISTICS ;
148178static_assert (sizeof (D3DKMT_QUERYSTATISTICS ) == 0x328 , "D3DKMT_QUERYSTATISTICS structure size mismatch" );
149179EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTQueryStatistics (_In_ CONST D3DKMT_QUERYSTATISTICS * );
180+
181+ #define DXGK_MAX_METADATA_NAME_LENGTH 32
182+ typedef enum
183+ {
184+ DXGK_ENGINE_TYPE_OTHER ,
185+ DXGK_ENGINE_TYPE_3D ,
186+ DXGK_ENGINE_TYPE_VIDEO_DECODE ,
187+ DXGK_ENGINE_TYPE_VIDEO_ENCODE ,
188+ DXGK_ENGINE_TYPE_VIDEO_PROCESSING ,
189+ DXGK_ENGINE_TYPE_SCENE_ASSEMBLY ,
190+ DXGK_ENGINE_TYPE_COPY ,
191+ DXGK_ENGINE_TYPE_OVERLAY ,
192+ DXGK_ENGINE_TYPE_CRYPTO ,
193+ DXGK_ENGINE_TYPE_VIDEO_CODEC ,
194+ DXGK_ENGINE_TYPE_MAX
195+ } DXGK_ENGINE_TYPE ;
196+ typedef struct _DXGK_NODEMETADATA_FLAGS
197+ {
198+ union
199+ {
200+ struct
201+ {
202+ UINT ContextSchedulingSupported : 1 ; // WDDM 2.2
203+ UINT RingBufferFenceRelease : 1 ; // WDDM 2.5
204+ UINT SupportTrackedWorkload : 1 ;
205+ UINT UserModeSubmission : 1 ;
206+ UINT SupportBuildTestCommandBuffer : 1 ; // WDDM 3.2
207+ UINT Reserved : 11 ;
208+ UINT MaxInFlightHwQueueBuffers : 16 ;
209+ };
210+ UINT32 Value ;
211+ };
212+ } DXGK_NODEMETADATA_FLAGS ;
213+ typedef struct _DXGK_NODEMETADATA
214+ {
215+ DXGK_ENGINE_TYPE EngineType ;
216+ WCHAR FriendlyName [DXGK_MAX_METADATA_NAME_LENGTH ];
217+ DXGK_NODEMETADATA_FLAGS Flags ; // WDDM 2.2
218+ BOOLEAN GpuMmuSupported ; // WDDM 2.0 ???
219+ BOOLEAN IoMmuSupported ;
220+ } __attribute__((packed )) DXGK_NODEMETADATA ;
221+ typedef struct _D3DKMT_NODEMETADATA
222+ {
223+ _In_ UINT NodeOrdinalAndAdapterIndex ; // WDDMv2: High word is physical adapter index, low word is node ordinal
224+ _Out_ DXGK_NODEMETADATA NodeData ;
225+ } __attribute__((packed )) D3DKMT_NODEMETADATA ;
226+ static_assert (sizeof (D3DKMT_NODEMETADATA ) == 0x4E , "D3DKMT_NODEMETADATA structure size mismatch" );
227+
228+ #endif
0 commit comments