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
3556namespace Diligent
3657{
@@ -45,11 +66,11 @@ void GetOpenXRGraphicsBindingGL(IRenderDevice* pDevice,
4566void 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,
6081void 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