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