Skip to content

Commit

Permalink
OpenXRUtilities: added AllocateOpenXRSwapchainImageData function
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMostDiligent committed Dec 8, 2024
1 parent 614188a commit 5185619
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 0 deletions.
21 changes: 21 additions & 0 deletions Graphics/GraphicsTools/interface/OpenXRUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,27 @@ XrDebugUtilsMessengerEXT DILIGENT_GLOBAL_FUNCTION(CreateOpenXRDebugUtilsMessenge
/// Destroys OpenXR debug utils messenger.
void DILIGENT_GLOBAL_FUNCTION(DestroyOpenXRDebugUtilsMessenger)(XrDebugUtilsMessengerEXT xrDebugUtilsMessenger);

/// Allocates OpenXR swapchain image data, i.e. an array of appropriate structures for each device
/// type (XrSwapchainImageVulkanKHR, XrSwapchainImageD3D11KHR, etc.).
///
/// \param [in] DeviceType - Type of the render device.
/// \param [out] ImageCount - Number of images in the swapchain returned by OpenXR.
/// \param [out] ppSwapchainImageData - Address of the memory location where the pointer to the data blob
/// containing the swapchain image data will be stored.
///
/// \remarks The data blob data pointer should be passed to xrEnumerateSwapchainImages:
///
/// uint32_t SwapchainImageCount = 0;
/// xrEnumerateSwapchainImages(xrSwapchain, 0, &SwapchainImageCount, nullptr);
/// RefCntAutoPtr<IDataBlob> pSwapchainImageData;
/// AllocateOpenXRSwapchainImageData(m_DeviceType, SwapchainImageCount, &pSwapchainImageData);
/// xrEnumerateSwapchainImages(xrSwapchain, SwapchainImageCount, &SwapchainImageCount,
/// pSwapchainImageData->GetDataPtr<XrSwapchainImageBaseHeader>());
///
void DILIGENT_GLOBAL_FUNCTION(AllocateOpenXRSwapchainImageData)(RENDER_DEVICE_TYPE DeviceType,
Uint32 ImageCount,
IDataBlob** ppSwapchainImageData);

#include "../../../Primitives/interface/UndefRefMacro.h"

DILIGENT_END_NAMESPACE // namespace Diligent
61 changes: 61 additions & 0 deletions Graphics/GraphicsTools/src/OpenXRUtilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,36 @@ namespace Diligent
void GetOpenXRGraphicsBindingD3D11(IRenderDevice* pDevice,
IDeviceContext* pContext,
IDataBlob** ppGraphicsBinding);

void AllocateOpenXRSwapchainImageDataD3D11(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData);
#endif

#if D3D12_SUPPORTED
void GetOpenXRGraphicsBindingD3D12(IRenderDevice* pDevice,
IDeviceContext* pContext,
IDataBlob** ppGraphicsBinding);

void AllocateOpenXRSwapchainImageDataD3D12(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData);
#endif

#if GL_SUPPORTED || GLES_SUPPORTED
void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
IDeviceContext* pContext,
IDataBlob** ppGraphicsBinding);

void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData);
#endif

#if VULKAN_SUPPORTED
void GetOpenXRGraphicsBindingVk(IRenderDevice* pDevice,
IDeviceContext* pContext,
IDataBlob** ppGraphicsBinding);

void AllocateOpenXRSwapchainImageDataVk(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData);
#endif


Expand Down Expand Up @@ -111,6 +123,48 @@ void GetOpenXRGraphicsBinding(IRenderDevice* pDevice,
}
}

void AllocateOpenXRSwapchainImageData(RENDER_DEVICE_TYPE DeviceType,
Uint32 ImageCount,
IDataBlob** ppSwapchainImageData)
{
if (ppSwapchainImageData == nullptr)
{
UNEXPECTED("ppSwapchainImageData must not be null");
return;
}

switch (DeviceType)
{
#if D3D11_SUPPORTED
case RENDER_DEVICE_TYPE_D3D11:
AllocateOpenXRSwapchainImageDataD3D11(ImageCount, ppSwapchainImageData);
break;
#endif

#if D3D12_SUPPORTED
case RENDER_DEVICE_TYPE_D3D12:
AllocateOpenXRSwapchainImageDataD3D12(ImageCount, ppSwapchainImageData);
break;
#endif

#if GL_SUPPORTED || GLES_SUPPORTED
case RENDER_DEVICE_TYPE_GL:
case RENDER_DEVICE_TYPE_GLES:
AllocateOpenXRSwapchainImageDataGL(ImageCount, ppSwapchainImageData);
break;
#endif

#if VULKAN_SUPPORTED
case RENDER_DEVICE_TYPE_VULKAN:
AllocateOpenXRSwapchainImageDataVk(ImageCount, ppSwapchainImageData);
break;
#endif

default:
UNSUPPORTED("Unsupported device type");
}
}

static XrBool32 OpenXRMessageCallbackFunction(XrDebugUtilsMessageSeverityFlagsEXT xrMessageSeverity,
XrDebugUtilsMessageTypeFlagsEXT xrMessageType,
const XrDebugUtilsMessengerCallbackDataEXT* pCallbackData,
Expand Down Expand Up @@ -233,4 +287,11 @@ extern "C"
{
Diligent::DestroyOpenXRDebugUtilsMessenger(debugUtilsMessenger);
}

void Dilgent_AllocateOpenXRSwapchainImageData(Diligent::RENDER_DEVICE_TYPE DeviceType,
Diligent::Uint32 ImageCount,
Diligent::IDataBlob** ppSwapchainImageData)
{
Diligent::AllocateOpenXRSwapchainImageData(DeviceType, ImageCount, ppSwapchainImageData);
}
}
14 changes: 14 additions & 0 deletions Graphics/GraphicsTools/src/OpenXRUtilitiesD3D11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,18 @@ void GetOpenXRGraphicsBindingD3D11(IRenderDevice* pDevice,
*ppGraphicsBinding = pDataBlob.Detach();
}

void AllocateOpenXRSwapchainImageDataD3D11(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData)
{
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageD3D11KHR) * ImageCount)};
for (Uint32 i = 0; i < ImageCount; ++i)
{
XrSwapchainImageD3D11KHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageD3D11KHR>()[i]};
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR;
Image.next = nullptr;
}

*ppSwapchainImageData = pDataBlob.Detach();
}

} // namespace Diligent
14 changes: 14 additions & 0 deletions Graphics/GraphicsTools/src/OpenXRUtilitiesD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,18 @@ void GetOpenXRGraphicsBindingD3D12(IRenderDevice* pDevice,
*ppGraphicsBinding = pDataBlob.Detach();
}

void AllocateOpenXRSwapchainImageDataD3D12(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData)
{
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageD3D12KHR) * ImageCount)};
for (Uint32 i = 0; i < ImageCount; ++i)
{
XrSwapchainImageD3D12KHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageD3D12KHR>()[i]};
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR;
Image.next = nullptr;
}

*ppSwapchainImageData = pDataBlob.Detach();
}

} // namespace Diligent
19 changes: 19 additions & 0 deletions Graphics/GraphicsTools/src/OpenXRUtilitiesGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@
*/

#include "OpenXRUtilities.h"

#include "DebugUtilities.hpp"
#include "DataBlobImpl.hpp"

#define XR_USE_GRAPHICS_API_OPENGL
#include <openxr/openxr_platform.h>

namespace Diligent
{
Expand All @@ -37,4 +42,18 @@ void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
UNSUPPORTED("Not yet implemented");
}

void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData)
{
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageOpenGLKHR) * ImageCount)};
for (Uint32 i = 0; i < ImageCount; ++i)
{
XrSwapchainImageOpenGLKHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageOpenGLKHR>()[i]};
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
Image.next = nullptr;
}

*ppSwapchainImageData = pDataBlob.Detach();
}

} // namespace Diligent
14 changes: 14 additions & 0 deletions Graphics/GraphicsTools/src/OpenXRUtilitiesVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,18 @@ void GetOpenXRGraphicsBindingVk(IRenderDevice* pDevice,
*ppGraphicsBinding = pDataBlob.Detach();
}

void AllocateOpenXRSwapchainImageDataVk(Uint32 ImageCount,
IDataBlob** ppSwapchainImageData)
{
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageVulkanKHR) * ImageCount)};
for (Uint32 i = 0; i < ImageCount; ++i)
{
XrSwapchainImageVulkanKHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageVulkanKHR>()[i]};
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR;
Image.next = nullptr;
}

*ppSwapchainImageData = pDataBlob.Detach();
}

} // namespace Diligent

0 comments on commit 5185619

Please sign in to comment.