#ifndef _D3DKMT_H #define _D3DKMT_H // D3D definitions typedef ULONG D3DKMT_HANDLE; typedef struct _D3DKMT_OPENADAPTERFROMDEVICENAME { _In_ PCWSTR pDeviceName; _Out_ D3DKMT_HANDLE hAdapter; _Out_ LUID AdapterLuid; } D3DKMT_OPENADAPTERFROMDEVICENAME; typedef struct _D3DKMT_CLOSEADAPTER { _In_ D3DKMT_HANDLE hAdapter; } D3DKMT_CLOSEADAPTER; typedef enum _D3DKMT_QUERYRESULT_PREEMPTION_ATTEMPT_RESULT { D3DKMT_PreemptionAttempt = 0, D3DKMT_PreemptionAttemptSuccess = 1, D3DKMT_PreemptionAttemptMissNoCommand = 2, D3DKMT_PreemptionAttemptMissNotEnabled = 3, D3DKMT_PreemptionAttemptMissNextFence = 4, D3DKMT_PreemptionAttemptMissPagingCommand = 5, D3DKMT_PreemptionAttemptMissSplittedCommand = 6, D3DKMT_PreemptionAttemptMissFenceCommand= 7, D3DKMT_PreemptionAttemptMissRenderPendingFlip = 8, D3DKMT_PreemptionAttemptMissNotMakingProgress = 9, D3DKMT_PreemptionAttemptMissLessPriority = 10, D3DKMT_PreemptionAttemptMissRemainingQuantum = 11, D3DKMT_PreemptionAttemptMissRemainingPreemptionQuantum = 12, D3DKMT_PreemptionAttemptMissAlreadyPreempting = 13, D3DKMT_PreemptionAttemptMissGlobalBlock = 14, D3DKMT_PreemptionAttemptMissAlreadyRunning = 15, D3DKMT_PreemptionAttemptStatisticsMax } D3DKMT_QUERYRESULT_PREEMPTION_ATTEMPT_RESULT; typedef enum _D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE { D3DKMT_ClientRenderBuffer = 0, D3DKMT_ClientPagingBuffer = 1, D3DKMT_SystemPagingBuffer = 2, D3DKMT_SystemPreemptionBuffer = 3, D3DKMT_DmaPacketTypeMax } D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE; typedef enum _D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE { D3DKMT_RenderCommandBuffer = 0, D3DKMT_DeferredCommandBuffer = 1, D3DKMT_SystemCommandBuffer = 2, D3DKMT_MmIoFlipCommandBuffer = 3, D3DKMT_WaitCommandBuffer = 4, D3DKMT_SignalCommandBuffer = 5, D3DKMT_DeviceCommandBuffer = 6, D3DKMT_SoftwareCommandBuffer = 7, D3DKMT_QueuePacketTypeMax } D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE; typedef enum _D3DKMT_QUERYSTATISTICS_ALLOCATION_PRIORITY_CLASS { D3DKMT_AllocationPriorityClassMinimum = 0, D3DKMT_AllocationPriorityClassLow = 1, D3DKMT_AllocationPriorityClassNormal = 2, D3DKMT_AllocationPriorityClassHigh = 3, D3DKMT_AllocationPriorityClassMaximum = 4, D3DKMT_MaxAllocationPriorityClass } D3DKMT_QUERYSTATISTICS_ALLOCATION_PRIORITY_CLASS; #define D3DKMT_QUERYSTATISTICS_SEGMENT_PREFERENCE_MAX 5 typedef struct _D3DKMT_QUERYSTATISTICS_COUNTER { ULONG Count; ULONGLONG Bytes; } D3DKMT_QUERYSTATISTICS_COUNTER; typedef struct _D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION { ULONG PacketSubmited; ULONG PacketCompleted; ULONG PacketPreempted; ULONG PacketFaulted; } D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION { ULONG PacketSubmited; ULONG PacketCompleted; } D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_PACKET_INFORMATION { D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket[D3DKMT_QueuePacketTypeMax]; D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION DmaPacket[D3DKMT_DmaPacketTypeMax]; } D3DKMT_QUERYSTATISTICS_PACKET_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_PREEMPTION_INFORMATION { ULONG PreemptionCounter[D3DKMT_PreemptionAttemptStatisticsMax]; } D3DKMT_QUERYSTATISTICS_PREEMPTION_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION { LARGE_INTEGER RunningTime; // 100ns ULONG ContextSwitch; D3DKMT_QUERYSTATISTICS_PREEMPTION_INFORMATION PreemptionStatistics; D3DKMT_QUERYSTATISTICS_PACKET_INFORMATION PacketStatistics; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_NODE_INFORMATION { D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION GlobalInformation; // global D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION SystemInformation; // system thread ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_NODE_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION { ULONG Frame; ULONG CancelledFrame; ULONG QueuedPresent; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_VIDPNSOURCE_INFORMATION { D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION GlobalInformation; // global D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION SystemInformation; // system thread ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_VIDPNSOURCE_INFORMATION; typedef struct _D3DKMT_QUERYSTATSTICS_REFERENCE_DMA_BUFFER { ULONG NbCall; ULONG NbAllocationsReferenced; ULONG MaxNbAllocationsReferenced; ULONG NbNULLReference; ULONG NbWriteReference; ULONG NbRenamedAllocationsReferenced; ULONG NbIterationSearchingRenamedAllocation; ULONG NbLockedAllocationReferenced; ULONG NbAllocationWithValidPrepatchingInfoReferenced; ULONG NbAllocationWithInvalidPrepatchingInfoReferenced; ULONG NbDMABufferSuccessfullyPrePatched; ULONG NbPrimariesReferencesOverflow; ULONG NbAllocationWithNonPreferredResources; ULONG NbAllocationInsertedInMigrationTable; } D3DKMT_QUERYSTATSTICS_REFERENCE_DMA_BUFFER; typedef struct _D3DKMT_QUERYSTATSTICS_RENAMING { ULONG NbAllocationsRenamed; ULONG NbAllocationsShrinked; ULONG NbRenamedBuffer; ULONG MaxRenamingListLength; ULONG NbFailuresDueToRenamingLimit; ULONG NbFailuresDueToCreateAllocation; ULONG NbFailuresDueToOpenAllocation; ULONG NbFailuresDueToLowResource; ULONG NbFailuresDueToNonRetiredLimit; } D3DKMT_QUERYSTATSTICS_RENAMING; typedef struct _D3DKMT_QUERYSTATSTICS_PREPRATION { ULONG BroadcastStall; ULONG NbDMAPrepared; ULONG NbDMAPreparedLongPath; ULONG ImmediateHighestPreparationPass; D3DKMT_QUERYSTATISTICS_COUNTER AllocationsTrimmed; } D3DKMT_QUERYSTATSTICS_PREPRATION; typedef struct _D3DKMT_QUERYSTATSTICS_PAGING_FAULT { D3DKMT_QUERYSTATISTICS_COUNTER Faults; D3DKMT_QUERYSTATISTICS_COUNTER FaultsFirstTimeAccess; D3DKMT_QUERYSTATISTICS_COUNTER FaultsReclaimed; D3DKMT_QUERYSTATISTICS_COUNTER FaultsMigration; D3DKMT_QUERYSTATISTICS_COUNTER FaultsIncorrectResource; D3DKMT_QUERYSTATISTICS_COUNTER FaultsLostContent; D3DKMT_QUERYSTATISTICS_COUNTER FaultsEvicted; D3DKMT_QUERYSTATISTICS_COUNTER AllocationsMEM_RESET; D3DKMT_QUERYSTATISTICS_COUNTER AllocationsUnresetSuccess; D3DKMT_QUERYSTATISTICS_COUNTER AllocationsUnresetFail; ULONG AllocationsUnresetSuccessRead; ULONG AllocationsUnresetFailRead; D3DKMT_QUERYSTATISTICS_COUNTER Evictions; D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToPreparation; D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToLock; D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToClose; D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToPurge; D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToSuspendCPUAccess; } D3DKMT_QUERYSTATSTICS_PAGING_FAULT; typedef struct _D3DKMT_QUERYSTATSTICS_PAGING_TRANSFER { ULONGLONG BytesFilled; ULONGLONG BytesDiscarded; ULONGLONG BytesMappedIntoAperture; ULONGLONG BytesUnmappedFromAperture; ULONGLONG BytesTransferredFromMdlToMemory; ULONGLONG BytesTransferredFromMemoryToMdl; ULONGLONG BytesTransferredFromApertureToMemory; ULONGLONG BytesTransferredFromMemoryToAperture; } D3DKMT_QUERYSTATSTICS_PAGING_TRANSFER; typedef struct _D3DKMT_QUERYSTATSTICS_SWIZZLING_RANGE { ULONG NbRangesAcquired; ULONG NbRangesReleased; } D3DKMT_QUERYSTATSTICS_SWIZZLING_RANGE; typedef struct _D3DKMT_QUERYSTATSTICS_LOCKS { ULONG NbLocks; ULONG NbLocksWaitFlag; ULONG NbLocksDiscardFlag; ULONG NbLocksNoOverwrite; ULONG NbLocksNoReadSync; ULONG NbLocksLinearization; ULONG NbComplexLocks; } D3DKMT_QUERYSTATSTICS_LOCKS; typedef struct _D3DKMT_QUERYSTATSTICS_ALLOCATIONS { D3DKMT_QUERYSTATISTICS_COUNTER Created; D3DKMT_QUERYSTATISTICS_COUNTER Destroyed; D3DKMT_QUERYSTATISTICS_COUNTER Opened; D3DKMT_QUERYSTATISTICS_COUNTER Closed; D3DKMT_QUERYSTATISTICS_COUNTER MigratedSuccess; D3DKMT_QUERYSTATISTICS_COUNTER MigratedFail; D3DKMT_QUERYSTATISTICS_COUNTER MigratedAbandoned; } D3DKMT_QUERYSTATSTICS_ALLOCATIONS; typedef struct _D3DKMT_QUERYSTATSTICS_TERMINATIONS { D3DKMT_QUERYSTATISTICS_COUNTER TerminatedShared; D3DKMT_QUERYSTATISTICS_COUNTER TerminatedNonShared; D3DKMT_QUERYSTATISTICS_COUNTER DestroyedShared; D3DKMT_QUERYSTATISTICS_COUNTER DestroyedNonShared; } D3DKMT_QUERYSTATSTICS_TERMINATIONS; typedef struct _D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION { ULONG NbSegments; ULONG NodeCount; ULONG VidPnSourceCount; ULONG VSyncEnabled; ULONG TdrDetectedCount; LONGLONG ZeroLengthDmaBuffers; ULONGLONG RestartedPeriod; D3DKMT_QUERYSTATSTICS_REFERENCE_DMA_BUFFER ReferenceDmaBuffer; D3DKMT_QUERYSTATSTICS_RENAMING Renaming; D3DKMT_QUERYSTATSTICS_PREPRATION Preparation; D3DKMT_QUERYSTATSTICS_PAGING_FAULT PagingFault; D3DKMT_QUERYSTATSTICS_PAGING_TRANSFER PagingTransfer; D3DKMT_QUERYSTATSTICS_SWIZZLING_RANGE SwizzlingRange; D3DKMT_QUERYSTATSTICS_LOCKS Locks; D3DKMT_QUERYSTATSTICS_ALLOCATIONS Allocations; D3DKMT_QUERYSTATSTICS_TERMINATIONS Terminations; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_SYSTEM_MEMORY { ULONGLONG BytesAllocated; ULONGLONG BytesReserved; ULONG SmallAllocationBlocks; ULONG LargeAllocationBlocks; ULONGLONG WriteCombinedBytesAllocated; ULONGLONG WriteCombinedBytesReserved; ULONGLONG CachedBytesAllocated; ULONGLONG CachedBytesReserved; ULONGLONG SectionBytesAllocated; ULONGLONG SectionBytesReserved; } D3DKMT_QUERYSTATISTICS_SYSTEM_MEMORY; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_INFORMATION { ULONG NodeCount; ULONG VidPnSourceCount; D3DKMT_QUERYSTATISTICS_SYSTEM_MEMORY SystemMemory; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_PROCESS_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_DMA_BUFFER { D3DKMT_QUERYSTATISTICS_COUNTER Size; ULONG AllocationListBytes; ULONG PatchLocationListBytes; } D3DKMT_QUERYSTATISTICS_DMA_BUFFER; typedef struct _D3DKMT_QUERYSTATISTICS_COMMITMENT_DATA { ULONG64 TotalBytesEvictedFromProcess; ULONG64 BytesBySegmentPreference[D3DKMT_QUERYSTATISTICS_SEGMENT_PREFERENCE_MAX]; } D3DKMT_QUERYSTATISTICS_COMMITMENT_DATA; typedef struct _D3DKMT_QUERYSTATISTICS_POLICY { ULONGLONG PreferApertureForRead[D3DKMT_MaxAllocationPriorityClass]; ULONGLONG PreferAperture[D3DKMT_MaxAllocationPriorityClass]; ULONGLONG MemResetOnPaging; ULONGLONG RemovePagesFromWorkingSetOnPaging; ULONGLONG MigrationEnabled; } D3DKMT_QUERYSTATISTICS_POLICY; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER_INFORMATION { ULONG NbSegments; ULONG NodeCount; ULONG VidPnSourceCount; ULONG VirtualMemoryUsage; D3DKMT_QUERYSTATISTICS_DMA_BUFFER DmaBuffer; D3DKMT_QUERYSTATISTICS_COMMITMENT_DATA CommitmentData; D3DKMT_QUERYSTATISTICS_POLICY _Policy; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_MEMORY { ULONGLONG TotalBytesEvicted; ULONG AllocsCommitted; ULONG AllocsResident; } D3DKMT_QUERYSTATISTICS_MEMORY; typedef struct _D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_V1 { ULONG CommitLimit; ULONG BytesCommitted; ULONG BytesResident; D3DKMT_QUERYSTATISTICS_MEMORY Memory; ULONG Aperture; // boolean ULONGLONG TotalBytesEvictedByPriority[D3DKMT_MaxAllocationPriorityClass]; ULONG64 SystemMemoryEndAddress; struct { ULONG64 PreservedDuringStandby : 1; ULONG64 PreservedDuringHibernate : 1; ULONG64 PartiallyPreservedDuringHibernate : 1; ULONG64 Reserved : 61; } PowerFlags; ULONG64 Reserved[7]; } D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_V1; typedef struct _D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION { ULONGLONG CommitLimit; ULONGLONG BytesCommitted; ULONGLONG BytesResident; D3DKMT_QUERYSTATISTICS_MEMORY Memory; ULONG Aperture; // boolean ULONGLONG TotalBytesEvictedByPriority[D3DKMT_MaxAllocationPriorityClass]; ULONG64 SystemMemoryEndAddress; struct { ULONG64 PreservedDuringStandby : 1; ULONG64 PreservedDuringHibernate : 1; ULONG64 PartiallyPreservedDuringHibernate : 1; ULONG64 Reserved : 61; } PowerFlags; ULONG64 Reserved[6]; } D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION; typedef struct _D3DKMT_QUERYSTATISTICS_VIDEO_MEMORY { ULONG AllocsCommitted; D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentInP[D3DKMT_QUERYSTATISTICS_SEGMENT_PREFERENCE_MAX]; D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentInNonPreferred; ULONGLONG TotalBytesEvictedDueToPreparation; } D3DKMT_QUERYSTATISTICS_VIDEO_MEMORY; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_POLICY { ULONGLONG UseMRU; } D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_POLICY; typedef struct _D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_INFORMATION { ULONGLONG BytesCommitted; ULONGLONG MaximumWorkingSet; ULONGLONG MinimumWorkingSet; ULONG NbReferencedAllocationEvictedInPeriod; D3DKMT_QUERYSTATISTICS_VIDEO_MEMORY VideoMemory; D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_POLICY _Policy; ULONG64 Reserved[8]; } D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_INFORMATION; typedef enum _D3DKMT_QUERYSTATISTICS_TYPE { D3DKMT_QUERYSTATISTICS_ADAPTER = 0, D3DKMT_QUERYSTATISTICS_PROCESS = 1, D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER = 2, D3DKMT_QUERYSTATISTICS_SEGMENT = 3, D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT = 4, D3DKMT_QUERYSTATISTICS_NODE = 5, D3DKMT_QUERYSTATISTICS_PROCESS_NODE = 6, D3DKMT_QUERYSTATISTICS_VIDPNSOURCE = 7, D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE = 8 } D3DKMT_QUERYSTATISTICS_TYPE; typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT { ULONG SegmentId; } D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT; typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_NODE { ULONG NodeId; } D3DKMT_QUERYSTATISTICS_QUERY_NODE; typedef struct _D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE { ULONG VidPnSourceId; } D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE; typedef union _D3DKMT_QUERYSTATISTICS_RESULT { D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION AdapterInformation; D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_V1 SegmentInformationV1; // WIN7 D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION SegmentInformation; // WIN8 D3DKMT_QUERYSTATISTICS_NODE_INFORMATION NodeInformation; D3DKMT_QUERYSTATISTICS_VIDPNSOURCE_INFORMATION VidPnSourceInformation; D3DKMT_QUERYSTATISTICS_PROCESS_INFORMATION ProcessInformation; D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER_INFORMATION ProcessAdapterInformation; D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_INFORMATION ProcessSegmentInformation; D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION ProcessNodeInformation; D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION ProcessVidPnSourceInformation; } D3DKMT_QUERYSTATISTICS_RESULT; typedef struct _D3DKMT_QUERYSTATISTICS { _In_ D3DKMT_QUERYSTATISTICS_TYPE Type; _In_ LUID AdapterLuid; _In_opt_ HANDLE hProcess; _Out_ D3DKMT_QUERYSTATISTICS_RESULT QueryResult; union { _In_ D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT QuerySegment; _In_ D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT QueryProcessSegment; _In_ D3DKMT_QUERYSTATISTICS_QUERY_NODE QueryNode; _In_ D3DKMT_QUERYSTATISTICS_QUERY_NODE QueryProcessNode; _In_ D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE QueryVidPnSource; _In_ D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE QueryProcessVidPnSource; }; } D3DKMT_QUERYSTATISTICS; // Function pointers typedef _Check_return_ NTSTATUS (APIENTRY *PFND3DKMT_OPENADAPTERFROMDEVICENAME)(_Inout_ D3DKMT_OPENADAPTERFROMDEVICENAME *); typedef _Check_return_ NTSTATUS (APIENTRY *PFND3DKMT_CLOSEADAPTER)(_In_ const D3DKMT_CLOSEADAPTER *); typedef _Check_return_ NTSTATUS (APIENTRY *PFND3DKMT_QUERYSTATISTICS)(_In_ const D3DKMT_QUERYSTATISTICS *); #endif