68 std::string *r_requirement_info)
const override
70 int gl_major_version, gl_minor_version;
73 gl_major_version = ctx_gl.m_contextMajorVersion;
74 gl_minor_version = ctx_gl.m_contextMinorVersion;
75#elif defined(WITH_GHOST_X11) || defined(WITH_GHOST_WAYLAND)
78 gl_major_version = ctx_gl.m_contextMajorVersion;
79 gl_minor_version = ctx_gl.m_contextMinorVersion;
81# if defined(WITH_GHOST_X11)
84 gl_major_version = ctx_gl.m_contextMajorVersion;
85 gl_minor_version = ctx_gl.m_contextMinorVersion;
89 static PFN_xrGetOpenGLGraphicsRequirementsKHR s_xrGetOpenGLGraphicsRequirementsKHR_fn =
92 XrGraphicsRequirementsOpenGLKHR gpu_requirements = {XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR};
93 const XrVersion gl_version = XR_MAKE_VERSION(gl_major_version, gl_minor_version, 0);
101 s_xrGetOpenGLGraphicsRequirementsKHR_fn =
nullptr;
103 if (!s_xrGetOpenGLGraphicsRequirementsKHR_fn &&
105 xrGetInstanceProcAddr(instance,
106 "xrGetOpenGLGraphicsRequirementsKHR",
107 (PFN_xrVoidFunction *)&s_xrGetOpenGLGraphicsRequirementsKHR_fn)))
109 s_xrGetOpenGLGraphicsRequirementsKHR_fn =
nullptr;
113 s_xrGetOpenGLGraphicsRequirementsKHR_fn(instance, system_id, &gpu_requirements);
115 if (r_requirement_info) {
116 std::ostringstream strstream;
117 strstream <<
"Min OpenGL version "
118 << XR_VERSION_MAJOR(gpu_requirements.minApiVersionSupported) <<
"."
119 << XR_VERSION_MINOR(gpu_requirements.minApiVersionSupported) << std::endl;
120 strstream <<
"Max OpenGL version "
121 << XR_VERSION_MAJOR(gpu_requirements.maxApiVersionSupported) <<
"."
122 << XR_VERSION_MINOR(gpu_requirements.maxApiVersionSupported) << std::endl;
124 *r_requirement_info = strstream.str();
127 return (gl_version >= gpu_requirements.minApiVersionSupported) &&
128 (gl_version <= gpu_requirements.maxApiVersionSupported);
133 XrSystemId )
override
135#if defined(WITH_GHOST_X11) || defined(WITH_GHOST_WAYLAND)
139 const bool is_ctx_egl =
dynamic_cast<GHOST_ContextEGL *
>(&ghost_ctx) !=
nullptr;
142 const bool is_wayland = (
143# if defined(WITH_GHOST_WAYLAND)
151# if defined(WITH_GHOST_WAYLAND)
153 oxr_binding.wl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR;
156 GHOST_ASSERT(
false,
"Unexpected State: logical error, unreachable!");
160# if defined(WITH_GHOST_X11)
162 oxr_binding.egl.type = XR_TYPE_GRAPHICS_BINDING_EGL_MNDX;
163# if XR_CURRENT_API_VERSION >= XR_MAKE_VERSION(1, 0, 29)
164 oxr_binding.egl.getProcAddress =
reinterpret_cast<PFN_xrEglGetProcAddressMNDX
>(
167 oxr_binding.egl.getProcAddress =
reinterpret_cast<PFNEGLGETPROCADDRESSPROC
>(
174 GHOST_ASSERT(
false,
"Unexpected State: built with only WAYLAND and no System found!");
179# if defined(WITH_GHOST_X11)
181 XVisualInfo *visual_info = glXGetVisualFromFBConfig(ctx_glx.m_display, ctx_glx.m_fbconfig);
183 oxr_binding.glx.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR;
192 GHOST_ASSERT(
false,
"Unexpected State: built without X11 and no EGL context is available!");
198 oxr_binding.wgl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR;
204 glGenFramebuffers(1, &m_fbo);
208 GHOST_TXrSwapchainFormat &r_format,
209 bool &r_is_srgb_format)
const override
211 std::vector<int64_t> gpu_binding_formats = {
231 r_format = GHOST_kXrSwapchainFormatRGB10_A2;
234 r_format = GHOST_kXrSwapchainFormatRGBA16;
237 r_format = GHOST_kXrSwapchainFormatRGBA16F;
240 case GL_SRGB8_ALPHA8:
241 r_format = GHOST_kXrSwapchainFormatRGBA8;
244 r_is_srgb_format = (*
result == GL_SRGB8_ALPHA8);
247 r_format = GHOST_kXrSwapchainFormatRGBA8;
248 r_is_srgb_format =
false;
256 std::vector<XrSwapchainImageOpenGLKHR> ogl_images(image_count);
257 std::vector<XrSwapchainImageBaseHeader *> base_images;
261 for (XrSwapchainImageOpenGLKHR &image : ogl_images) {
262 image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
263 base_images.push_back(
reinterpret_cast<XrSwapchainImageBaseHeader *
>(&image));
267 m_image_cache.push_back(std::move(ogl_images));
274 const GHOST_XrDrawViewInfo &draw_info)
override
276 XrSwapchainImageOpenGLKHR &ogl_swapchain_image =
reinterpret_cast<XrSwapchainImageOpenGLKHR &
>(
279 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
281 glFramebufferTexture2D(
282 GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ogl_swapchain_image.image, 0);
284 glBlitFramebuffer(draw_info.ofsx,
286 draw_info.ofsx + draw_info.width,
287 draw_info.ofsy + draw_info.height,
290 draw_info.ofsx + draw_info.width,
291 draw_info.ofsy + draw_info.height,
295 glBindFramebuffer(GL_FRAMEBUFFER, 0);