e0a2e1f4bf
build / build (push) Successful in 2m44s
- opengl_end_frame() bound framebuffer 0 on Android, which has no valid target there (real presentation goes through the OpenXR swapchain's own FBOs) - gl4es reported this every frame. Skip it there. - render_hack_cameras() re-entered opengl_start_frame()/opengl_end_frame() for camera-monitor renders that never touch the GL screen; excluded them to match use_opengl()'s existing behavior. Also drains a stray error left by xrPollEvent(). - ChangeScreenSize() never called opengl_resize() on Android, freezing the 3D render target at launch size after an in-game resolution change; and xr_get_game_resolution() used the swapchain's fixed size instead of the current screen resolution, misplacing the laser-pointer cursor after such a change. - Removes all temporary bisection diagnostics added while tracking down the GL_INVALID_OPERATION source.
46 lines
1.9 KiB
Diff
46 lines
1.9 KiB
Diff
--- a/src/GameSrc/frsetup.c
|
|
+++ b/src/GameSrc/frsetup.c
|
|
@@ -635,7 +635,27 @@
|
|
uchar old_cam_type;
|
|
int detail;
|
|
|
|
+#ifdef __ANDROID__
|
|
+ // should_opengl_swap() (unlike use_opengl(), see its own
|
|
+ // FR_PICKUPM_MASK|FR_HACKCAM_MASK exclusion just below and the
|
|
+ // matching one used for the STEREO_SUPPORT path in fr_send_view()
|
|
+ // below) doesn't know which _fr context is currently being prepared -
|
|
+ // it's a frame-level check, also used by Shock.c's SDLDraw() to pick
|
|
+ // the frame's overall compositing path. render_hack_cameras() (see
|
|
+ // render.c) calls fr_rend() - and so this function - a second time per
|
|
+ // real frame for each active hack-camera monitor, rendering into a
|
|
+ // private software (FR_DOUBLEB_MASK) canvas rather than the actual
|
|
+ // GL-backed screen. Without this exclusion, opengl_start_frame() runs
|
|
+ // again mid-frame for that render even though its own polygon draw
|
|
+ // calls correctly stay on the software path (use_opengl() already
|
|
+ // excludes them) - re-entering the OpenXR swapchain/framebuffer setup
|
|
+ // a second time before the first call's frame has ended. Not known to
|
|
+ // be exercised on desktop (no OpenXR swapchain there), so this fix is
|
|
+ // kept Android-only rather than changing should_opengl_swap() itself.
|
|
+ if (should_opengl_swap() && !(_fr_curflags & (FR_PICKUPM_MASK | FR_HACKCAM_MASK))) {
|
|
+#else
|
|
if(should_opengl_swap()) {
|
|
+#endif
|
|
opengl_start_frame();
|
|
}
|
|
|
|
@@ -823,7 +843,14 @@
|
|
|
|
g3_end_frame();
|
|
|
|
+#ifdef __ANDROID__
|
|
+ // Mirrors the same fix in fr_start_view() above - see its comment.
|
|
+ // opengl_start_frame()/opengl_end_frame() must stay paired per real
|
|
+ // GL frame, so this exclusion has to match that one exactly.
|
|
+ if (should_opengl_swap() && !(_fr_curflags & (FR_PICKUPM_MASK | FR_HACKCAM_MASK))) {
|
|
+#else
|
|
if(should_opengl_swap()) {
|
|
+#endif
|
|
opengl_end_frame();
|
|
}
|
|
|