Skip to content

Commit 34cdfd2

Browse files
OpenXRUtils: implemented GetOpenXRSwapchainImageGL
1 parent 7266a60 commit 34cdfd2

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

Graphics/GraphicsTools/src/OpenXRUtilitiesGL.cpp

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,29 @@
2929
#include "DebugUtilities.hpp"
3030
#include "DataBlobImpl.hpp"
3131

32-
#define XR_USE_GRAPHICS_API_OPENGL
33-
#include <openxr/openxr_platform.h>
32+
#if GL_SUPPORTED
33+
34+
# define XR_USE_GRAPHICS_API_OPENGL
35+
# include <openxr/openxr_platform.h>
36+
37+
using XrSwapchainImageGL = XrSwapchainImageOpenGLKHR;
38+
constexpr XrStructureType XR_TYPE_SWAPCHAIN_IMAGE_GL = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
39+
40+
#elif GLES_SUPPORTED
41+
42+
typedef unsigned int EGLenum;
43+
44+
# define XR_USE_GRAPHICS_API_OPENGL_ES
45+
# include <openxr/openxr_platform.h>
46+
47+
using XrSwapchainImageGL = XrSwapchainImageOpenGLESKHR;
48+
constexpr XrStructureType XR_TYPE_SWAPCHAIN_IMAGE_GL = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR;
49+
50+
#else
51+
# error Neither GL_SUPPORTED nor GLES_SUPPORTED is defined
52+
#endif
53+
54+
#include "RenderDeviceGL.h"
3455

3556
namespace Diligent
3657
{
@@ -45,11 +66,11 @@ void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
4566
void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
4667
IDataBlob** ppSwapchainImageData)
4768
{
48-
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageOpenGLKHR) * ImageCount)};
69+
RefCntAutoPtr<DataBlobImpl> pDataBlob{DataBlobImpl::Create(sizeof(XrSwapchainImageGL) * ImageCount)};
4970
for (Uint32 i = 0; i < ImageCount; ++i)
5071
{
51-
XrSwapchainImageOpenGLKHR& Image{pDataBlob->GetDataPtr<XrSwapchainImageOpenGLKHR>()[i]};
52-
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
72+
XrSwapchainImageGL& Image{pDataBlob->GetDataPtr<XrSwapchainImageGL>()[i]};
73+
Image.type = XR_TYPE_SWAPCHAIN_IMAGE_GL;
5374
Image.next = nullptr;
5475
}
5576

@@ -60,9 +81,28 @@ void AllocateOpenXRSwapchainImageDataGL(Uint32 ImageCount,
6081
void GetOpenXRSwapchainImageGL(IRenderDevice* pDevice,
6182
const XrSwapchainImageBaseHeader* ImageData,
6283
Uint32 ImageIndex,
84+
const TextureDesc& TexDesc,
6385
ITexture** ppImage)
6486
{
65-
UNSUPPORTED("Not yet implemented");
87+
const XrSwapchainImageGL* ImageGL = reinterpret_cast<const XrSwapchainImageGL*>(ImageData);
88+
89+
if (ImageData->type != XR_TYPE_SWAPCHAIN_IMAGE_GL || ImageGL[ImageIndex].type != XR_TYPE_SWAPCHAIN_IMAGE_GL)
90+
{
91+
UNEXPECTED("Unexpected swapchain image type");
92+
return;
93+
}
94+
95+
uint32_t image = ImageGL[ImageIndex].image;
96+
if (image == 0)
97+
{
98+
UNEXPECTED("OpenGL image is null");
99+
return;
100+
}
101+
102+
RefCntAutoPtr<IRenderDeviceGL> pDeviceGL{pDevice, IID_RenderDeviceGL};
103+
VERIFY_EXPR(pDeviceGL != nullptr);
104+
105+
pDeviceGL->CreateTextureFromGLHandle(image, 0, TexDesc, RESOURCE_STATE_UNDEFINED, ppImage);
66106
}
67107

68108
} // namespace Diligent

0 commit comments

Comments
 (0)