// Minimal OpenXR bring-up for questshock's immersive Quest build. Keeps the
// game's own rendering untouched (see android/engine-patches/
// 12-android-openxr-present.patch) - this module only owns the OpenXR
// instance/session/swapchain and the final "submit a quad layer instead of
// presenting to a window" step. No stereo rendering, no controller input
// yet (see the plan's steps B/C/D for those) - the game composite is shown
// as a single flat quad floating in front of the viewer.
#ifndef QUESTSHOCK_XR_SESSION_H
#define QUESTSHOCK_XR_SESSION_H

#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// Call once, right after init_opengl() (OpenGL.cc) has created and made
// current the GL context SDL/gl4es already use - creates the OpenXR
// instance/session sharing that same EGL display/context, plus one
// swapchain sized to the game's logical resolution (game_width/height, i.e.
// grd_cap->w/h - see Shock.c's InitSDL()). Returns false if OpenXR bring-up
// failed (e.g. no runtime installed) - callers should fall back to the
// existing window-present path in that case.
bool xr_init(int game_width, int game_height);

// Pumps XR session-state events. Call once per frame, before
// xr_frame_begin(). Must still be called even when xr_init() returned
// false (no-op in that case).
void xr_poll_events(void);

// True once the session has reached a state where frames are expected
// (XR_SESSION_STATE_SYNCHRONIZED or later) - i.e. it's safe/required to
// start calling xr_frame_begin()/xr_frame_end() each frame.
bool xr_is_session_running(void);

// Begins the XR frame (xrWaitFrame/xrBeginFrame) and, if the runtime wants
// this frame rendered, acquires the next swapchain image and binds its
// framebuffer as the current render target - ready for the caller to draw
// into exactly as it would have drawn to the default framebuffer. Returns
// true if the caller should draw this frame; xr_frame_end() must be called
// unconditionally afterward either way (a begun XR frame must always be
// ended, rendered or not).
bool xr_frame_begin(void);

// Releases the swapchain image (if one was acquired this frame) and
// submits it as a single XrCompositionLayerQuad positioned in front of the
// local reference space's origin, then ends the XR frame.
void xr_frame_end(void);

void xr_shutdown(void);

#ifdef __cplusplus
}
#endif

#endif
