Skip to content

Commit 5185619

Browse files
OpenXRUtilities: added AllocateOpenXRSwapchainImageData function
1 parent 614188a commit 5185619

File tree

6 files changed

+143
-0
lines changed

6 files changed

+143
-0
lines changed

Graphics/GraphicsTools/interface/OpenXRUtilities.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@ XrDebugUtilsMessengerEXT DILIGENT_GLOBAL_FUNCTION(CreateOpenXRDebugUtilsMessenge
6868
/// Destroys OpenXR debug utils messenger.
6969
void DILIGENT_GLOBAL_FUNCTION(DestroyOpenXRDebugUtilsMessenger)(XrDebugUtilsMessengerEXT xrDebugUtilsMessenger);
7070

71+
/// Allocates OpenXR swapchain image data, i.e. an array of appropriate structures for each device
72+
/// type (XrSwapchainImageVulkanKHR, XrSwapchainImageD3D11KHR, etc.).
73+
///
74+
/// \param [in] DeviceType - Type of the render device.
75+
/// \param [out] ImageCount - Number of images in the swapchain returned by OpenXR.
76+
/// \param [out] ppSwapchainImageData - Address of the memory location where the pointer to the data blob
77+
/// containing the swapchain image data will be stored.
78+
///
79+
/// \remarks The data blob data pointer should be passed to xrEnumerateSwapchainImages:
80+
///
81+
/// uint32_t SwapchainImageCount = 0;
82+
/// xrEnumerateSwapchainImages(xrSwapchain, 0, &SwapchainImageCount, nullptr);
83+
/// RefCntAutoPtr<IDataBlob> pSwapchainImageData;
84+
/// AllocateOpenXRSwapchainImageData(m_DeviceType, SwapchainImageCount, &pSwapchainImageData);
85+
/// xrEnumerateSwapchainImages(xrSwapchain, SwapchainImageCount, &SwapchainImageCount,
86+
/// pSwapchainImageData->GetDataPtr<XrSwapchainImageBaseHeader>());
87+
///
88+
void DILIGENT_GLOBAL_FUNCTION(AllocateOpenXRSwapchainImageData)(RENDER_DEVICE_TYPE DeviceType,
89+
Uint32 ImageCount,
90+
IDataBlob** ppSwapchainImageData);
91+
7192
#include "../../../Primitives/interface/UndefRefMacro.h"
7293

7394
DILIGENT_END_NAMESPACE // namespace Diligent

Graphics/GraphicsTools/src/OpenXRUtilities.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,36 @@ namespace Diligent
3535
void GetOpenXRGraphicsBindingD3D11(IRenderDevice* pDevice,
3636
IDeviceContext* pContext,
3737
IDataBlob** ppGraphicsBinding);
38+
39+
void AllocateOpenXRSwapchainImageDataD3D11(Uint32 ImageCount,
40+
IDataBlob** ppSwapchainImageData);
3841
#endif
3942

4043
#if D3D12_SUPPORTED
4144
void GetOpenXRGraphicsBindingD3D12(IRenderDevice* pDevice,
4245
IDeviceContext* pContext,
4346
IDataBlob** ppGraphicsBinding);
47+
48+
void AllocateOpenXRSwapchainImageDataD3D12(Uint32 ImageCount,
49+
IDataBlob** ppSwapchainImageData);
4450
#endif
4551

4652
#if GL_SUPPORTED || GLES_SUPPORTED
4753
void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
4854
IDeviceContext* pContext,
4955
IDataBlob** ppGraphicsBinding);
56+
57+
void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
58+
IDataBlob** ppSwapchainImageData);
5059
#endif
5160

5261
#if VULKAN_SUPPORTED
5362
void GetOpenXRGraphicsBindingVk(IRenderDevice* pDevice,
5463
IDeviceContext* pContext,
5564
IDataBlob** ppGraphicsBinding);
65+
66+
void AllocateOpenXRSwapchainImageDataVk(Uint32 ImageCount,
67+
IDataBlob** ppSwapchainImageData);
5668
#endif
5769

5870

@@ -111,6 +123,48 @@ void GetOpenXRGraphicsBinding(IRenderDevice* pDevice,
111123
}
112124
}
113125

126+
void AllocateOpenXRSwapchainImageData(RENDER_DEVICE_TYPE DeviceType,
127+
Uint32 ImageCount,
128+
IDataBlob** ppSwapchainImageData)
129+
{
130+
if (ppSwapchainImageData == nullptr)
131+
{
132+
UNEXPECTED("ppSwapchainImageData must not be null");
133+
return;
134+
}
135+
136+
switch (DeviceType)
137+
{
138+
#if D3D11_SUPPORTED
139+
case RENDER_DEVICE_TYPE_D3D11:
140+
AllocateOpenXRSwapchainImageDataD3D11(ImageCount, ppSwapchainImageData);
141+
break;
142+
#endif
143+
144+
#if D3D12_SUPPORTED
145+
case RENDER_DEVICE_TYPE_D3D12:
146+
AllocateOpenXRSwapchainImageDataD3D12(ImageCount, ppSwapchainImageData);
147+
break;
148+
#endif
149+
150+
#if GL_SUPPORTED || GLES_SUPPORTED
151+
case RENDER_DEVICE_TYPE_GL:
152+
case RENDER_DEVICE_TYPE_GLES:
153+
AllocateOpenXRSwapchainImageDataGL(ImageCount, ppSwapchainImageData);
154+
break;
155+
#endif
156+
157+
#if VULKAN_SUPPORTED
158+
case RENDER_DEVICE_TYPE_VULKAN:
159+
AllocateOpenXRSwapchainImageDataVk(ImageCount, ppSwapchainImageData);
160+
break;
161+
#endif
162+
163+
default:
164+
UNSUPPORTED("Unsupported device type");
165+
}
166+
}
167+
114168
static XrBool32 OpenXRMessageCallbackFunction(XrDebugUtilsMessageSeverityFlagsEXT xrMessageSeverity,
115169
XrDebugUtilsMessageTypeFlagsEXT xrMessageType,
116170
const XrDebugUtilsMessengerCallbackDataEXT* pCallbackData,
@@ -233,4 +287,11 @@ extern "C"
233287
{
234288
Diligent::DestroyOpenXRDebugUtilsMessenger(debugUtilsMessenger);
235289
}
290+
291+
void Dilgent_AllocateOpenXRSwapchainImageData(Diligent::RENDER_DEVICE_TYPE DeviceType,
292+
Diligent::Uint32 ImageCount,
293+
Diligent::IDataBlob** ppSwapchainImageData)
294+
{
295+
Diligent::AllocateOpenXRSwapchainImageData(DeviceType, ImageCount, ppSwapchainImageData);
296+
}
236297
}

Graphics/GraphicsTools/src/OpenXRUtilitiesD3D11.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,18 @@ void GetOpenXRGraphicsBindingD3D11(IRenderDevice* pDevice,
5959
*ppGraphicsBinding = pDataBlob.Detach();
6060
}
6161

62+
void AllocateOpenXRSwapchainImageDataD3D11(Uint32 ImageCount,
63+
IDataBlob** ppSwapchainImageData)
64+
{
65+
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageD3D11KHR) * ImageCount)};
66+
for (Uint32 i = 0; i < ImageCount; ++i)
67+
{
68+
XrSwapchainImageD3D11KHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageD3D11KHR>()[i]};
69+
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR;
70+
Image.next = nullptr;
71+
}
72+
73+
*ppSwapchainImageData = pDataBlob.Detach();
74+
}
75+
6276
} // namespace Diligent

Graphics/GraphicsTools/src/OpenXRUtilitiesD3D12.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,18 @@ void GetOpenXRGraphicsBindingD3D12(IRenderDevice* pDevice,
6464
*ppGraphicsBinding = pDataBlob.Detach();
6565
}
6666

67+
void AllocateOpenXRSwapchainImageDataD3D12(Uint32 ImageCount,
68+
IDataBlob** ppSwapchainImageData)
69+
{
70+
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageD3D12KHR) * ImageCount)};
71+
for (Uint32 i = 0; i < ImageCount; ++i)
72+
{
73+
XrSwapchainImageD3D12KHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageD3D12KHR>()[i]};
74+
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR;
75+
Image.next = nullptr;
76+
}
77+
78+
*ppSwapchainImageData = pDataBlob.Detach();
79+
}
80+
6781
} // namespace Diligent

Graphics/GraphicsTools/src/OpenXRUtilitiesGL.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@
2525
*/
2626

2727
#include "OpenXRUtilities.h"
28+
2829
#include "DebugUtilities.hpp"
30+
#include "DataBlobImpl.hpp"
31+
32+
#define XR_USE_GRAPHICS_API_OPENGL
33+
#include <openxr/openxr_platform.h>
2934

3035
namespace Diligent
3136
{
@@ -37,4 +42,18 @@ void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
3742
UNSUPPORTED("Not yet implemented");
3843
}
3944

45+
void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
46+
IDataBlob** ppSwapchainImageData)
47+
{
48+
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageOpenGLKHR) * ImageCount)};
49+
for (Uint32 i = 0; i < ImageCount; ++i)
50+
{
51+
XrSwapchainImageOpenGLKHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageOpenGLKHR>()[i]};
52+
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
53+
Image.next = nullptr;
54+
}
55+
56+
*ppSwapchainImageData = pDataBlob.Detach();
57+
}
58+
4059
} // namespace Diligent

Graphics/GraphicsTools/src/OpenXRUtilitiesVk.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,18 @@ void GetOpenXRGraphicsBindingVk(IRenderDevice* pDevice,
6363
*ppGraphicsBinding = pDataBlob.Detach();
6464
}
6565

66+
void AllocateOpenXRSwapchainImageDataVk(Uint32 ImageCount,
67+
IDataBlob** ppSwapchainImageData)
68+
{
69+
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageVulkanKHR) * ImageCount)};
70+
for (Uint32 i = 0; i < ImageCount; ++i)
71+
{
72+
XrSwapchainImageVulkanKHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageVulkanKHR>()[i]};
73+
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR;
74+
Image.next = nullptr;
75+
}
76+
77+
*ppSwapchainImageData = pDataBlob.Detach();
78+
}
79+
6680
} // namespace Diligent

0 commit comments

Comments
 (0)