Skip to content

Commit ed41511

Browse files
GraphicsTools: added CreateOpenXRDebugUtilsMessenger and DestroyOpenXRDebugUtilsMessenger functions
1 parent a50a3aa commit ed41511

File tree

3 files changed

+141
-25
lines changed

3 files changed

+141
-25
lines changed

Graphics/GraphicsTools/CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ set(INTERFACE
1313
interface/GraphicsUtilities.h
1414
interface/MapHelper.hpp
1515
interface/OffScreenSwapChain.hpp
16-
interface/OpenXRUtilities.h
1716
interface/ResourceRegistry.hpp
1817
interface/ScopedDebugGroup.hpp
1918
interface/GPUCompletionAwaitQueue.hpp
@@ -44,7 +43,6 @@ set(SOURCE
4443
src/GraphicsUtilitiesVk.cpp
4544
src/GraphicsUtilitiesWebGPU.cpp
4645
src/OffScreenSwapChain.cpp
47-
src/OpenXRUtilities.cpp
4846
src/ScopedQueryHelper.cpp
4947
src/ScreenCapture.cpp
5048
src/ShaderSourceFactoryUtils.cpp
@@ -77,6 +75,11 @@ else()
7775
set(RENDER_STATE_CACHE_SUPPORTED FALSE CACHE INTERNAL "Render state cache is not supported")
7876
endif()
7977

78+
if(DILIGENT_USE_OPENXR)
79+
list(APPEND SOURCE src/OpenXRUtilities.cpp)
80+
list(APPEND INTERFACE interface/OpenXRUtilities.h)
81+
endif()
82+
8083
set(DEPENDENCIES)
8184

8285
if(D3D11_SUPPORTED)

Graphics/GraphicsTools/interface/OpenXRUtilities.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include "../../GraphicsEngine/interface/DeviceContext.h"
3434
#include "../../Primitives/interface/DataBlob.h"
3535

36+
#include <openxr/openxr.h>
37+
3638
DILIGENT_BEGIN_NAMESPACE(Diligent)
3739

3840
#include "../../../Primitives/interface/DefineRefMacro.h"
@@ -60,6 +62,12 @@ void DILIGENT_GLOBAL_FUNCTION(GetOpenXRGraphicsBinding)(IRenderDevice* pDevice,
6062
IDeviceContext* pContext,
6163
IDataBlob** ppGraphicsBinding);
6264

65+
/// Creates OpenXR debug utils messenger.
66+
XrDebugUtilsMessengerEXT DILIGENT_GLOBAL_FUNCTION(CreateOpenXRDebugUtilsMessenger)(XrInstance xrInstance);
67+
68+
/// Destroys OpenXR debug utils messenger.
69+
void DILIGENT_GLOBAL_FUNCTION(DestroyOpenXRDebugUtilsMessenger)(XrDebugUtilsMessengerEXT xrDebugUtilsMessenger);
70+
6371
#include "../../../Primitives/interface/UndefRefMacro.h"
6472

6573
DILIGENT_END_NAMESPACE // namespace Diligent

Graphics/GraphicsTools/src/OpenXRUtilities.cpp

Lines changed: 128 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,39 +31,35 @@
3131
namespace Diligent
3232
{
3333

34-
#if DILIGENT_USE_OPENXR
35-
36-
# if D3D11_SUPPORTED
34+
#if D3D11_SUPPORTED
3735
void GetOpenXRGraphicsBindingD3D11(IRenderDevice* pDevice,
3836
IDeviceContext* pContext,
3937
IDataBlob** ppGraphicsBinding);
40-
# endif
38+
#endif
4139

42-
# if D3D12_SUPPORTED
40+
#if D3D12_SUPPORTED
4341
void 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
4947
void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
5048
IDeviceContext* pContext,
5149
IDataBlob** ppGraphicsBinding);
52-
# endif
50+
#endif
5351

54-
# if VULKAN_SUPPORTED
52+
#if VULKAN_SUPPORTED
5553
void GetOpenXRGraphicsBindingVk(IRenderDevice* pDevice,
5654
IDeviceContext* pContext,
5755
IDataBlob** ppGraphicsBinding);
58-
# endif
59-
6056
#endif
6157

58+
6259
void 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

Comments
 (0)