3131namespace Diligent
3232{
3333
34- #if DILIGENT_USE_OPENXR
35-
36- # if D3D11_SUPPORTED
34+ #if D3D11_SUPPORTED
3735void GetOpenXRGraphicsBindingD3D11 (IRenderDevice* pDevice,
3836 IDeviceContext* pContext,
3937 IDataBlob** ppGraphicsBinding);
40- # endif
38+ #endif
4139
42- # if D3D12_SUPPORTED
40+ #if D3D12_SUPPORTED
4341void GetOpenXRGraphicsBindingD3D12 (IRenderDevice* pDevice,
4442 IDeviceContext* pContext,
4543 IDataBlob** ppGraphicsBinding);
46- # endif
44+ #endif
4745
48- # if GL_SUPPORTED || GLES_SUPPORTED
46+ #if GL_SUPPORTED || GLES_SUPPORTED
4947void GetOpenXRGraphicsBindingGL (IRenderDevice* pDevice,
5048 IDeviceContext* pContext,
5149 IDataBlob** ppGraphicsBinding);
52- # endif
50+ #endif
5351
54- # if VULKAN_SUPPORTED
52+ #if VULKAN_SUPPORTED
5553void GetOpenXRGraphicsBindingVk (IRenderDevice* pDevice,
5654 IDeviceContext* pContext,
5755 IDataBlob** ppGraphicsBinding);
58- # endif
59-
6056#endif
6157
58+
6259void GetOpenXRGraphicsBinding (IRenderDevice* pDevice,
6360 IDeviceContext* pContext,
6461 IDataBlob** ppGraphicsBinding)
6562{
66- #if DILIGENT_USE_OPENXR
6763 if (pDevice == nullptr )
6864 {
6965 UNEXPECTED (" pDevice must not be null" );
@@ -85,37 +81,136 @@ void GetOpenXRGraphicsBinding(IRenderDevice* pDevice,
8581 RENDER_DEVICE_TYPE DevType = pDevice->GetDeviceInfo ().Type ;
8682 switch (DevType)
8783 {
88- # if D3D11_SUPPORTED
84+ #if D3D11_SUPPORTED
8985 case RENDER_DEVICE_TYPE_D3D11:
9086 GetOpenXRGraphicsBindingD3D11 (pDevice, pContext, ppGraphicsBinding);
9187 break ;
92- # endif
88+ #endif
9389
94- # if D3D12_SUPPORTED
90+ #if D3D12_SUPPORTED
9591 case RENDER_DEVICE_TYPE_D3D12:
9692 GetOpenXRGraphicsBindingD3D12 (pDevice, pContext, ppGraphicsBinding);
9793 break ;
98- # endif
94+ #endif
9995
100- # if GL_SUPPORTED || GLES_SUPPORTED
96+ #if GL_SUPPORTED || GLES_SUPPORTED
10197 case RENDER_DEVICE_TYPE_GL:
10298 case RENDER_DEVICE_TYPE_GLES:
10399 GetOpenXRGraphicsBindingGL (pDevice, pContext, ppGraphicsBinding);
104100 break ;
105- # endif
101+ #endif
106102
107- # if VULKAN_SUPPORTED
103+ #if VULKAN_SUPPORTED
108104 case RENDER_DEVICE_TYPE_VULKAN:
109105 GetOpenXRGraphicsBindingVk (pDevice, pContext, ppGraphicsBinding);
110106 break ;
111- # endif
107+ #endif
112108
113109 default :
114110 UNSUPPORTED (" Unsupported device type" );
115111 }
116- #else
117- UNSUPPORTED (" OpenXR is not supported" );
118- #endif
112+ }
113+
114+ static XrBool32 OpenXRMessageCallbackFunction (XrDebugUtilsMessageSeverityFlagsEXT xrMessageSeverity,
115+ XrDebugUtilsMessageTypeFlagsEXT xrMessageType,
116+ const XrDebugUtilsMessengerCallbackDataEXT* pCallbackData,
117+ void * pUserData)
118+ {
119+ DEBUG_MESSAGE_SEVERITY MessageSeverity = DEBUG_MESSAGE_SEVERITY_INFO;
120+ if (xrMessageSeverity & XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
121+ {
122+ MessageSeverity = DEBUG_MESSAGE_SEVERITY_ERROR;
123+ }
124+ else if (xrMessageSeverity & XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
125+ {
126+ MessageSeverity = DEBUG_MESSAGE_SEVERITY_WARNING;
127+ }
128+
129+ std::string MessageTypeStr;
130+ if (xrMessageType & XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT)
131+ {
132+ MessageTypeStr += " GEN" ;
133+ }
134+ if (xrMessageType & XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT)
135+ {
136+ if (!MessageTypeStr.empty ())
137+ {
138+ MessageTypeStr += " ," ;
139+ }
140+ MessageTypeStr += " SPEC" ;
141+ }
142+ if (xrMessageType & XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT)
143+ {
144+ if (!MessageTypeStr.empty ())
145+ {
146+ MessageTypeStr += " ," ;
147+ }
148+ MessageTypeStr += " PERF" ;
149+ }
150+
151+ const char * FunctionName = (pCallbackData->functionName ) ? pCallbackData->functionName : " " ;
152+ const char * MessageId = (pCallbackData->messageId ) ? pCallbackData->messageId : " " ;
153+ const char * Message = (pCallbackData->message ) ? pCallbackData->message : " " ;
154+
155+ LOG_DEBUG_MESSAGE (MessageSeverity, ' [' , MessageTypeStr, " ] " , FunctionName, MessageId, " - " , Message);
156+
157+ return XrBool32{};
158+ }
159+
160+
161+ PFN_xrDestroyDebugUtilsMessengerEXT xrDestroyDebugUtilsMessengerEXT = nullptr ;
162+
163+ XrDebugUtilsMessengerEXT CreateOpenXRDebugUtilsMessenger (XrInstance xrInstance)
164+ {
165+ PFN_xrCreateDebugUtilsMessengerEXT xrCreateDebugUtilsMessengerEXT;
166+ if (XR_FAILED (xrGetInstanceProcAddr (xrInstance, " xrCreateDebugUtilsMessengerEXT" , (PFN_xrVoidFunction*)&xrCreateDebugUtilsMessengerEXT)))
167+ {
168+ LOG_ERROR_MESSAGE (" Failed to get xrCreateDebugUtilsMessengerEXT function pointer." );
169+ return {};
170+ }
171+ VERIFY_EXPR (xrCreateDebugUtilsMessengerEXT);
172+
173+ if (XR_FAILED (xrGetInstanceProcAddr (xrInstance, " xrDestroyDebugUtilsMessengerEXT" , (PFN_xrVoidFunction*)&xrDestroyDebugUtilsMessengerEXT)))
174+ {
175+ LOG_ERROR_MESSAGE (" Failed to get xrDestroyDebugUtilsMessengerEXT function pointer." );
176+ return {};
177+ }
178+ VERIFY_EXPR (xrDestroyDebugUtilsMessengerEXT);
179+
180+ // Fill out a XrDebugUtilsMessengerCreateInfoEXT structure specifying all severities and types.
181+ // Set the userCallback to OpenXRMessageCallbackFunction().
182+ XrDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT};
183+ debugUtilsMessengerCI.messageSeverities =
184+ XR_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
185+ XR_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
186+ XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
187+ XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
188+ debugUtilsMessengerCI.messageTypes =
189+ XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
190+ XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
191+ XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT |
192+ XR_DEBUG_UTILS_MESSAGE_TYPE_CONFORMANCE_BIT_EXT;
193+
194+ debugUtilsMessengerCI.userCallback = (PFN_xrDebugUtilsMessengerCallbackEXT)OpenXRMessageCallbackFunction;
195+ debugUtilsMessengerCI.userData = nullptr ;
196+
197+ XrDebugUtilsMessengerEXT debugUtilsMessenger{};
198+ // Finally create and return the XrDebugUtilsMessengerEXT.
199+ if (XR_FAILED (xrCreateDebugUtilsMessengerEXT (xrInstance, &debugUtilsMessengerCI, &debugUtilsMessenger)))
200+ {
201+ LOG_ERROR_MESSAGE (" Failed to create OpenXR debug utils messenger." );
202+ return {};
203+ }
204+
205+ return debugUtilsMessenger;
206+ }
207+
208+ void DestroyOpenXRDebugUtilsMessenger (XrDebugUtilsMessengerEXT debugUtilsMessenger)
209+ {
210+ if (xrDestroyDebugUtilsMessengerEXT)
211+ {
212+ xrDestroyDebugUtilsMessengerEXT (debugUtilsMessenger);
213+ }
119214}
120215
121216} // namespace Diligent
@@ -128,4 +223,14 @@ extern "C"
128223 {
129224 Diligent::GetOpenXRGraphicsBinding (pDevice, pContext, ppGraphicsBinding);
130225 }
226+
227+ XrDebugUtilsMessengerEXT Diligent_CreateOpenXRDebugUtilsMessenger (XrInstance xrInstance, XrDebugUtilsMessengerEXT* pDebugUtilsMessenger)
228+ {
229+ return Diligent::CreateOpenXRDebugUtilsMessenger (xrInstance);
230+ }
231+
232+ void Diligent_DestroyOpenXRDebugUtilsMessenger (XrDebugUtilsMessengerEXT debugUtilsMessenger)
233+ {
234+ Diligent::DestroyOpenXRDebugUtilsMessenger (debugUtilsMessenger);
235+ }
131236}
0 commit comments