1 module directx.dxgidebug;
2 
3 public import directx.dxgi;
4 
5 alias DXGI_DEBUG_RLO_FLAGS = DWORD;
6 enum : DXGI_DEBUG_RLO_FLAGS {
7     DXGI_DEBUG_RLO_SUMMARY = 0x1,
8     DXGI_DEBUG_RLO_DETAIL  = 0x2,
9     DXGI_DEBUG_RLO_ALL     = 0x3
10 }
11 
12 alias GUID DXGI_DEBUG_ID;
13 
14 __gshared DXGI_DEBUG_ALL  = GUID(0xe48ae283, 0xda80, 0x490b, [0x87, 0xe6, 0x43, 0xe9, 0xa9, 0xcf, 0xda, 0x08]);
15 __gshared DXGI_DEBUG_DX   = GUID(0x35cdd7fc, 0x13b2, 0x421d, [0xa5, 0xd7, 0x7e, 0x44, 0x51, 0x28, 0x7d, 0x64]);
16 __gshared DXGI_DEBUG_DXGI = GUID(0x25cddaa4, 0xb1c6, 0x47e1, [0xac, 0x3e, 0x98, 0x87, 0x5b, 0x5a, 0x2e, 0x2a]);
17 __gshared DXGI_DEBUG_APP  = GUID(0x06cd6e01, 0x4219, 0x4ebd, [0x87, 0x09, 0x27, 0xed, 0x23, 0x36, 0x0c, 0x62]);
18 
19 alias DXGI_INFO_QUEUE_MESSAGE_CATEGORY = DWORD;
20 enum : DXGI_INFO_QUEUE_MESSAGE_CATEGORY {
21     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_UNKNOWN	    = 0,
22     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_MISCELLANEOUS	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_UNKNOWN + 1,
23     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_INITIALIZATION	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_MISCELLANEOUS + 1,
24     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_CLEANUP	    = DXGI_INFO_QUEUE_MESSAGE_CATEGORY_INITIALIZATION + 1,
25     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_COMPILATION	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_CLEANUP + 1,
26     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_CREATION	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_COMPILATION + 1,
27     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_SETTING	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_CREATION + 1,
28     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_GETTING	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_SETTING + 1,
29     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_RESOURCE_MANIPULATION	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_STATE_GETTING + 1,
30     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_EXECUTION	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_RESOURCE_MANIPULATION + 1,
31     DXGI_INFO_QUEUE_MESSAGE_CATEGORY_SHADER	= DXGI_INFO_QUEUE_MESSAGE_CATEGORY_EXECUTION + 1
32 }
33 
34 alias DXGI_INFO_QUEUE_MESSAGE_SEVERITY = DWORD;
35 enum : DXGI_INFO_QUEUE_MESSAGE_SEVERITY {
36     DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION	= 0,
37     DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR		= DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION + 1,
38     DXGI_INFO_QUEUE_MESSAGE_SEVERITY_WARNING	= DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR + 1,
39     DXGI_INFO_QUEUE_MESSAGE_SEVERITY_INFO		= DXGI_INFO_QUEUE_MESSAGE_SEVERITY_WARNING + 1,
40     DXGI_INFO_QUEUE_MESSAGE_SEVERITY_MESSAGE	= DXGI_INFO_QUEUE_MESSAGE_SEVERITY_INFO + 1
41 }
42 
43 alias int DXGI_INFO_QUEUE_MESSAGE_ID;
44 
45 enum DXGI_INFO_QUEUE_MESSAGE_ID_STRING_FROM_APPLICATION = 0;
46 struct DXGI_INFO_QUEUE_MESSAGE {
47     DXGI_DEBUG_ID                    Producer;
48     DXGI_INFO_QUEUE_MESSAGE_CATEGORY Category;
49     DXGI_INFO_QUEUE_MESSAGE_SEVERITY Severity;
50     DXGI_INFO_QUEUE_MESSAGE_ID       ID;
51     const(char)*                     pDescription;
52     SIZE_T                           DescriptionByteLength;
53 }
54 
55 struct DXGI_INFO_QUEUE_FILTER_DESC {
56     UINT NumCategories;
57     DXGI_INFO_QUEUE_MESSAGE_CATEGORY* pCategoryList;
58     UINT NumSeverities;
59     DXGI_INFO_QUEUE_MESSAGE_SEVERITY* pSeverityList;
60     UINT NumIDs;
61     DXGI_INFO_QUEUE_MESSAGE_ID* pIDList;
62 }
63 
64 struct DXGI_INFO_QUEUE_FILTER {
65     DXGI_INFO_QUEUE_FILTER_DESC AllowList;
66     DXGI_INFO_QUEUE_FILTER_DESC DenyList;
67 }
68 
69 enum DXGI_INFO_QUEUE_DEFAULT_MESSAGE_COUNT_LIMIT = 1024;
70 
71 __gshared _DXGIGetDebugInterface DXGIGetDebugInterface;
72 
73 extern (Windows) {
74     alias _DXGIGetDebugInterface = HRESULT function(REFIID riid, void** ppDebug);
75 }
76 
77 mixin(uuid!(IDXGIInfoQueue, "D67441C7-672A-476f-9E82-CD55B44949CE"));
78 extern (C++) interface IDXGIInfoQueue : IUnknown {
79     HRESULT SetMessageCountLimit(DXGI_DEBUG_ID Producer,
80                                  UINT64 MessageCountLimit);
81 
82     void ClearStoredMessages(DXGI_DEBUG_ID Producer);
83 
84     HRESULT GetMessage(DXGI_DEBUG_ID Producer,
85                        UINT64 MessageIndex,
86                        DXGI_INFO_QUEUE_MESSAGE *pMessage,
87                        SIZE_T* pMessageByteLength);
88 
89     UINT64 GetNumStoredMessagesAllowedByRetrievalFilters(DXGI_DEBUG_ID Producer);
90 
91     UINT64 GetNumStoredMessages(DXGI_DEBUG_ID Producer);
92 
93     UINT64 GetNumMessagesDiscardedByMessageCountLimit(DXGI_DEBUG_ID Producer);
94 
95     UINT64 GetMessageCountLimit(DXGI_DEBUG_ID Producer);
96 
97     UINT64 GetNumMessagesAllowedByStorageFilter(DXGI_DEBUG_ID Producer);
98 
99     UINT64 GetNumMessagesDeniedByStorageFilter(DXGI_DEBUG_ID Producer);
100 
101     HRESULT AddStorageFilterEntries(DXGI_DEBUG_ID Producer,
102                                     DXGI_INFO_QUEUE_FILTER* pFilter);
103 
104     HRESULT GetStorageFilter(DXGI_DEBUG_ID Producer,
105                              DXGI_INFO_QUEUE_FILTER *pFilter,
106                              SIZE_T* pFilterByteLength);
107 
108     void ClearStorageFilter(DXGI_DEBUG_ID Producer);
109 
110     HRESULT PushEmptyStorageFilter(DXGI_DEBUG_ID Producer);
111 
112     HRESULT PushDenyAllStorageFilter(DXGI_DEBUG_ID Producer);
113 
114     HRESULT PushCopyOfStorageFilter(DXGI_DEBUG_ID Producer);
115 
116     HRESULT PushStorageFilter(DXGI_DEBUG_ID Producer,
117                               DXGI_INFO_QUEUE_FILTER* pFilter);
118 
119     void PopStorageFilter(DXGI_DEBUG_ID Producer);
120 
121     UINT GetStorageFilterStackSize(DXGI_DEBUG_ID Producer);
122 
123     HRESULT AddRetrievalFilterEntries(DXGI_DEBUG_ID Producer,
124                                       DXGI_INFO_QUEUE_FILTER* pFilter);
125 
126     HRESULT GetRetrievalFilter(DXGI_DEBUG_ID Producer,
127                                DXGI_INFO_QUEUE_FILTER *pFilter,
128                                SIZE_T* pFilterByteLength);
129 
130     void ClearRetrievalFilter(DXGI_DEBUG_ID Producer);
131 
132     HRESULT PushEmptyRetrievalFilter(DXGI_DEBUG_ID Producer);
133 
134     HRESULT PushDenyAllRetrievalFilter(DXGI_DEBUG_ID Producer);
135 
136     HRESULT PushCopyOfRetrievalFilter(DXGI_DEBUG_ID Producer);
137 
138     HRESULT PushRetrievalFilter(DXGI_DEBUG_ID Producer,
139                                 DXGI_INFO_QUEUE_FILTER* pFilter);
140 
141     void PopRetrievalFilter(DXGI_DEBUG_ID Producer);
142 
143     UINT GetRetrievalFilterStackSize(DXGI_DEBUG_ID Producer);
144 
145     HRESULT AddMessage(DXGI_DEBUG_ID Producer,
146                        DXGI_INFO_QUEUE_MESSAGE_CATEGORY Category,
147                        DXGI_INFO_QUEUE_MESSAGE_SEVERITY Severity,
148                        DXGI_INFO_QUEUE_MESSAGE_ID ID,
149                        LPCSTR pDescription);
150 
151     HRESULT AddApplicationMessage(DXGI_INFO_QUEUE_MESSAGE_SEVERITY Severity,
152                                   LPCSTR pDescription);
153 
154     HRESULT SetBreakOnCategory(DXGI_DEBUG_ID Producer,
155                                DXGI_INFO_QUEUE_MESSAGE_CATEGORY Category,
156                                BOOL bEnable);
157 
158     HRESULT SetBreakOnSeverity(DXGI_DEBUG_ID Producer,
159                                DXGI_INFO_QUEUE_MESSAGE_SEVERITY Severity,
160                                BOOL bEnable);
161 
162     HRESULT SetBreakOnID(DXGI_DEBUG_ID Producer,
163                          DXGI_INFO_QUEUE_MESSAGE_ID ID,
164                          BOOL bEnable);
165 
166     BOOL GetBreakOnCategory(DXGI_DEBUG_ID Producer,
167                             DXGI_INFO_QUEUE_MESSAGE_CATEGORY Category);
168 
169     BOOL GetBreakOnSeverity(DXGI_DEBUG_ID Producer,
170                             DXGI_INFO_QUEUE_MESSAGE_SEVERITY Severity);
171 
172     BOOL GetBreakOnID(DXGI_DEBUG_ID Producer,
173                       DXGI_INFO_QUEUE_MESSAGE_ID ID);
174 
175     void SetMuteDebugOutput(DXGI_DEBUG_ID Producer, BOOL bMute);
176 
177     BOOL GetMuteDebugOutput(DXGI_DEBUG_ID Producer);
178 }
179 
180 mixin(uuid!(IDXGIDebug, "119E7452-DE9E-40fe-8806-88F90C12B441"));
181 extern (C++) interface IDXGIDebug : IUnknown {
182     HRESULT ReportLiveObjects(GUID apiid, DXGI_DEBUG_RLO_FLAGS flags);
183 }
184 
185 mixin(uuid!(IDXGIDebug1, "c5a05f0c-16f2-4adf-9f4d-a8c4d58ac550"));
186 extern (C++) interface IDXGIDebug1 : IDXGIDebug {
187     void EnableLeakTrackingForThread();
188     void DisableLeakTrackingForThread();
189     BOOL IsLeakTrackingEnabledForThread();
190 }