From b5e677b9f5e265916e16201a74feaff9752ef2c6 Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Sat, 20 Dec 2025 11:06:32 -0500 Subject: [PATCH] some more real3d tweaks --- Src/Graphics/New3D/New3D.cpp | 63 +++ Src/Graphics/New3D/R3DFrameBuffers.cpp | 25 +- Src/Graphics/New3D/R3DShaderTriangles.h | 66 ++- android/app/src/main/cpp/CMakeLists.txt | 28 +- logcat_2025-12-19_17-27-07.txt | 519 ++++++++++++++++++++++++ 5 files changed, 671 insertions(+), 30 deletions(-) create mode 100644 logcat_2025-12-19_17-27-07.txt diff --git a/Src/Graphics/New3D/New3D.cpp b/Src/Graphics/New3D/New3D.cpp index 8542768..46ee521 100644 --- a/Src/Graphics/New3D/New3D.cpp +++ b/Src/Graphics/New3D/New3D.cpp @@ -407,6 +407,42 @@ void CNew3D::RenderFrame(void) return; } #endif +#ifdef __ANDROID__ + struct ScopedAndroidGlState + { + GLboolean scissorEnabled = GL_FALSE; + GLint scissorBox[4] = {0, 0, 0, 0}; + GLfloat clearColor[4] = {0.f, 0.f, 0.f, 0.f}; + + ScopedAndroidGlState() + { + scissorEnabled = glIsEnabled(GL_SCISSOR_TEST); + glGetIntegerv(GL_SCISSOR_BOX, scissorBox); + glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor); + } + + void DisableScissor() const { glDisable(GL_SCISSOR_TEST); } + + void RestoreScissor() const + { + if (scissorEnabled) { + glEnable(GL_SCISSOR_TEST); + glScissor(scissorBox[0], scissorBox[1], scissorBox[2], scissorBox[3]); + } else { + glDisable(GL_SCISSOR_TEST); + } + } + + void SetTransparentClear() const { glClearColor(0.f, 0.f, 0.f, 0.f); } + + ~ScopedAndroidGlState() + { + glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + RestoreScissor(); + } + }; +#endif + for (int i = 0; i < 4; i++) { m_nfPairs[i].zNear = -std::numeric_limits::max(); m_nfPairs[i].zFar = std::numeric_limits::max(); @@ -453,7 +489,28 @@ void CNew3D::RenderFrame(void) } } +#ifdef __ANDROID__ + ScopedAndroidGlState glState; + // Use transparent clears for FBO bookkeeping (alpha==0 means "no pixel written"). + glState.SetTransparentClear(); + glState.DisableScissor(); // scissor from outer SDL code would break FBO clears and cause flickering edges +#endif + if (!m_r3dFrameBuffers) return; + +#ifdef __ANDROID__ + // The desktop New3D path assumes the default framebuffer starts cleared each frame. + // Without this, any pixels discarded during compositing (alpha==0 areas) can reveal stale + // contents which show up as thin lines/flicker (notably during FMVs). + m_r3dFrameBuffers->SetFBO(Layer::none); + glViewport(0, 0, (GLsizei)m_totalXRes, (GLsizei)m_totalYRes); + glClearColor(0.f, 0.f, 0.f, 1.f); + glClear(GL_COLOR_BUFFER_BIT); + // Restore transparent clear for offscreen layers. + glState.SetTransparentClear(); +#endif + + glViewport(0, 0, (GLsizei)m_totalXRes, (GLsizei)m_totalYRes); m_r3dFrameBuffers->SetFBO(Layer::trans12); glClear(GL_COLOR_BUFFER_BIT); // wipe both trans layers @@ -465,6 +522,7 @@ void CNew3D::RenderFrame(void) bool renderOverlay = (i == 1); + glViewport(0, 0, (GLsizei)m_totalXRes, (GLsizei)m_totalYRes); m_r3dFrameBuffers->SetFBO(Layer::colour); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -479,7 +537,12 @@ void CNew3D::RenderFrame(void) DisableRenderStates(); +#ifdef __ANDROID__ + // DrawOverTransLayers writes to the offscreen trans buffers. + glState.DisableScissor(); +#endif m_r3dFrameBuffers->DrawOverTransLayers(); // mask trans layer with opaque pixels + m_r3dFrameBuffers->CompositeBaseLayer(); // copy opaque pixels to back buffer SetRenderStates(); diff --git a/Src/Graphics/New3D/R3DFrameBuffers.cpp b/Src/Graphics/New3D/R3DFrameBuffers.cpp index 55c90e6..2d94623 100644 --- a/Src/Graphics/New3D/R3DFrameBuffers.cpp +++ b/Src/Graphics/New3D/R3DFrameBuffers.cpp @@ -226,7 +226,7 @@ void R3DFrameBuffers::AllocShaderBase() const char *fragmentShader = R"glsl( #version 300 es - precision mediump float; + precision highp float; uniform sampler2D tex1; in vec2 fsTexCoord; @@ -234,7 +234,12 @@ void R3DFrameBuffers::AllocShaderBase() void main() { - vec4 colBase = texture(tex1, fsTexCoord); + // Clamp to half-texel to avoid sampling outside the FBO due to precision/edge interpolation, + // which can show up as thin lines/flicker on some GLES drivers (e.g., FMVs). + vec2 texSize = vec2(textureSize(tex1, 0)); + vec2 halfTexel = 0.5 / max(texSize, vec2(1.0)); + vec2 uv = clamp(fsTexCoord, halfTexel, vec2(1.0) - halfTexel); + vec4 colBase = texture(tex1, uv); if(colBase.a < 1.0) discard; oColor = colBase; } @@ -308,7 +313,7 @@ void R3DFrameBuffers::AllocShaderTrans() const char *fragmentShader = R"glsl( #version 300 es - precision mediump float; + precision highp float; uniform sampler2D tex1; uniform sampler2D tex2; @@ -318,8 +323,11 @@ void R3DFrameBuffers::AllocShaderTrans() void main() { - vec4 colTrans1 = texture(tex1, fsTexCoord); - vec4 colTrans2 = texture(tex2, fsTexCoord); + vec2 texSize = vec2(textureSize(tex1, 0)); + vec2 halfTexel = 0.5 / max(texSize, vec2(1.0)); + vec2 uv = clamp(fsTexCoord, halfTexel, vec2(1.0) - halfTexel); + vec4 colTrans1 = texture(tex1, uv); + vec4 colTrans2 = texture(tex2, uv); if(colTrans1.a + colTrans2.a > 0.0) { vec3 col1 = colTrans1.rgb * colTrans1.a; @@ -412,7 +420,7 @@ void R3DFrameBuffers::AllocShaderWipe() const char *fragmentShader = R"glsl( #version 300 es - precision mediump float; + precision highp float; uniform sampler2D texColor; in vec2 fsTexCoord; @@ -422,7 +430,10 @@ void R3DFrameBuffers::AllocShaderWipe() void main() { - vec4 colBase = texture(texColor, fsTexCoord); + vec2 texSize = vec2(textureSize(texColor, 0)); + vec2 halfTexel = 0.5 / max(texSize, vec2(1.0)); + vec2 uv = clamp(fsTexCoord, halfTexel, vec2(1.0) - halfTexel); + vec4 colBase = texture(texColor, uv); if(colBase.a == 0.0) { discard; } diff --git a/Src/Graphics/New3D/R3DShaderTriangles.h b/Src/Graphics/New3D/R3DShaderTriangles.h index 3f61497..75c04a3 100644 --- a/Src/Graphics/New3D/R3DShaderTriangles.h +++ b/Src/Graphics/New3D/R3DShaderTriangles.h @@ -42,7 +42,7 @@ void main() static const char *fragmentShaderR3D = R"glsl( #version 300 es -precision mediump float; +precision highp float; in vec2 vTexCoord; in vec4 vColor; @@ -54,27 +54,73 @@ uniform bool textureEnabled; uniform bool textureAlpha; uniform bool alphaTest; uniform bool discardAlpha; +uniform vec2 baseTexSize; +uniform ivec2 textureWrapMode; out vec4 oColor; +float WrapCoord1D(float u, int wrapMode, float halfTexel) +{ + // Matches desktop shader wrap modes: + // 0 = repeat, 1 = repeat+clamp, 2/3 = mirror/mirror+clamp. + if (wrapMode == 0) { + return fract(u); + } + if (wrapMode == 1) { + u = fract(u); + return clamp(u, halfTexel, 1.0 - halfTexel); + } + + float m = mod(u, 2.0); + u = (m < 1.0) ? m : (2.0 - m); + return clamp(u, halfTexel, 1.0 - halfTexel); +} + +vec2 WrapTexCoord(vec2 uv) +{ + vec2 texSize = max(baseTexSize, vec2(1.0)); + vec2 halfTexel = 0.5 / texSize; + uv.x = WrapCoord1D(uv.x, textureWrapMode.x, halfTexel.x); + uv.y = WrapCoord1D(uv.y, textureWrapMode.y, halfTexel.y); + return uv; +} + void main() { vec4 col = vColor; - + vec4 t = vec4(1.0); if (textureEnabled) { - vec4 t = texture(tex1, vTexCoord); - if (textureAlpha) { - col *= t; - } else { - col.rgb *= t.rgb; - } + vec2 uv = WrapTexCoord(vTexCoord); + t = texture(tex1, uv); } // keep vDummy "used" col.rgb += vDummy * 0.0; - if (alphaTest && col.a < 0.5) discard; - if (discardAlpha && col.a < 0.99) discard; + // Match Supermodel's per-pixel alpha rules as closely as possible: + // - alphaTest is based on texture alpha + // - discardAlpha separates opaque vs translucent passes based on texture alpha (and vertex alpha in 2nd pass) + if (alphaTest && t.a < (32.0/255.0)) discard; + if (textureAlpha) { + if (discardAlpha) { + if (t.a < 1.0) discard; + } else { + if ((t.a * col.a) >= 1.0) discard; + } + } + + if (textureEnabled) { + col.rgb *= t.rgb; + if (textureAlpha) { + col.a *= t.a; + } + } + + if (discardAlpha) { + // Opaque pass: force alpha to 1.0 so FBO compositing can treat "written" + // pixels as fully opaque (avoids black speckles/lines from alpha < 1). + col.a = 1.0; + } oColor = col; } diff --git a/android/app/src/main/cpp/CMakeLists.txt b/android/app/src/main/cpp/CMakeLists.txt index c6780e0..0755f4c 100644 --- a/android/app/src/main/cpp/CMakeLists.txt +++ b/android/app/src/main/cpp/CMakeLists.txt @@ -90,6 +90,20 @@ if(TO_REMOVE) list(REMOVE_ITEM SUPER3_SOURCES ${TO_REMOVE}) endif() +# --- New3D (Real3D renderer) --- +# Desktop builds compile additional OpenGL2.1/GLEW renderers under Src/Graphics, +# but Android uses GLES3 with a custom presenter, so we only include New3D. +file(GLOB NEW3D_SOURCES "${REPO_ROOT}/Src/Graphics/New3D/*.cpp") + +# Normalize paths to forward slashes so downstream tooling behaves consistently. +set(NEW3D_SOURCES_NORM "") +foreach(src ${NEW3D_SOURCES}) + string(REPLACE "\\" "/" src_norm "${src}") + list(APPEND NEW3D_SOURCES_NORM "${src_norm}") +endforeach() +set(NEW3D_SOURCES "${NEW3D_SOURCES_NORM}") +list(SORT NEW3D_SOURCES) + # --- SDL2 (for future Android OSD wiring) --- # Prefer a local checkout if provided via -DSDL2_LOCAL_DIR, otherwise fetch the # latest release tarball. @@ -115,19 +129,7 @@ add_library(super3 SHARED gles_presenter.cpp gles_stub_render3d.cpp render2d_android.cpp - "${REPO_ROOT}/Src/Graphics/New3D/Mat4.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/GLSLShader.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/Model.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/New3D.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/PolyHeader.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/R3DFloat.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/R3DFrameBuffers.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/R3DShader.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/R3DScrollFog.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/Texture.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/TextureSheet.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/VBO.cpp" - "${REPO_ROOT}/Src/Graphics/New3D/Vec.cpp" + ${NEW3D_SOURCES} ${SUPER3_SOURCES} ${M68K_GENERATED_SOURCES} ) diff --git a/logcat_2025-12-19_17-27-07.txt b/logcat_2025-12-19_17-27-07.txt new file mode 100644 index 0000000..56c0c11 --- /dev/null +++ b/logcat_2025-12-19_17-27-07.txt @@ -0,0 +1,519 @@ +[2025-12-19 17:24:40.574 Uid(value=11725):25302:25302 V/SDL] +Device: avatrn + +[2025-12-19 17:24:40.574 Uid(value=11725):25302:25302 V/SDL] +Model: motorola edge 2024 + +[2025-12-19 17:24:40.574 Uid(value=11725):25302:25302 V/SDL] +onCreate() + +[2025-12-19 17:24:40.580 Uid(value=11725):25302:25302 V/SDL] +nativeSetupJNI() + +[2025-12-19 17:24:40.582 Uid(value=11725):25302:25302 V/SDL] +AUDIO nativeSetupJNI() + +[2025-12-19 17:24:40.582 Uid(value=11725):25302:25302 V/SDL] +CONTROLLER nativeSetupJNI() + +[2025-12-19 17:24:40.628 Uid(value=11725):25302:25302 V/SDL] +onStart() + +[2025-12-19 17:24:40.629 Uid(value=11725):25302:25302 V/SDL] +onResume() + +[2025-12-19 17:24:40.655 Uid(value=11725):25302:25302 V/SDL] +surfaceCreated() + +[2025-12-19 17:24:40.655 Uid(value=11725):25302:25302 V/SDL] +surfaceChanged() + +[2025-12-19 17:24:40.655 Uid(value=11725):25302:25302 V/SDL] +Window size: 2400x1080 + +[2025-12-19 17:24:40.655 Uid(value=11725):25302:25302 V/SDL] +Device size: 2400x1080 + +[2025-12-19 17:24:40.663 Uid(value=11725):25302:8621 V/SDL] +Running main function SDL_main from library /data/app/~~63Zarb75V9AnhHVbHy-4RQ==/com.izzy2lost.super3-L_9o1Jhwcgw8Jrk4ihsDhA==/lib/arm64/libsuper3.so + +[2025-12-19 17:24:40.663 Uid(value=11725):25302:8621 V/SDL] +nativeRunMain() + +[2025-12-19 17:24:40.671 Uid(value=11725):25302:8621 W/libOpenSLES] +class OutputMix interface 0 requested but unavailable MPH=43 + +[2025-12-19 17:24:40.674 Uid(value=11725):25302:8621 V/hidapi] +initialize(true, false) + +[2025-12-19 17:24:40.678 Uid(value=11725):25302:8621 V/SDL] +setOrientation() requestedOrientation=6 width=1280 height=720 resizable=true hint=LandscapeLeft LandscapeRight + +[2025-12-19 17:24:40.679 Uid(value=11725):25302:8621 I/SDL/APP] +pixel format wanted SDL_PIXELFORMAT_RGBX8888 (2), got SDL_PIXELFORMAT_RGBX8888 (2) + +[2025-12-19 17:24:40.700 Uid(value=11725):25302:8621 I/SDL/APP] +User data root: /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3 + +[2025-12-19 17:24:40.704 Uid(value=11725):25302:8621 I/SDL/APP] +User data root: /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3 + +[2025-12-19 17:24:40.704 Uid(value=11725):25302:8621 I/SDL/APP] +Super3 paths: Games.xml=/storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/Config/Games.xml ROM=/storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/romcache/dayto2pe.zip + +[2025-12-19 17:24:40.705 Uid(value=11725):25302:8621 I/SDL/APP] +SDL window focus gained + +[2025-12-19 17:24:40.814 Uid(value=11725):25302:8622 I/SDL/APP] +LoadGameFromZip: zip=/storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/romcache/dayto2pe.zip game=dayto2pe + +[2025-12-19 17:24:40.814 Uid(value=11725):25302:8622 I/SDL/APP] +Loading ROM definitions... + +[2025-12-19 17:24:40.820 Uid(value=11725):25302:8622 I/SDL/APP] +Opened /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/romcache/dayto2pe.zip. + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] +Opened /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/romcache/daytona2.zip. + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] +dayto2pe: + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + banked_crom: stride=8, chunk size=2, byte swap=1 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21185.4, crc32=0xb6d5d2a1, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21184.3, crc32=0x25616403, offset=0x00000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21183.2, crc32=0xb4b44805, offset=0x00000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21182.1, crc32=0xba8e667f, offset=0x00000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21189.8, crc32=0xcb439c45, offset=0x02000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21188.7, crc32=0x753fc2a5, offset=0x02000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21187.6, crc32=0x3bd14ee6, offset=0x02000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21186.5, crc32=0xa6128662, offset=0x02000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21193.12, crc32=0x4638fef4, offset=0x04000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21192.11, crc32=0x60cbb1fa, offset=0x04000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21191.10, crc32=0xa2bdcfe0, offset=0x04000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21190.9, crc32=0x984d56eb, offset=0x04000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21197.16, crc32=0x04015247, offset=0x06000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21196.15, crc32=0x0ab46db5, offset=0x06000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21195.14, crc32=0x7f39761c, offset=0x06000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21194.13, crc32=0x12c7a414, offset=0x06000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + crom: stride=8, chunk size=2, byte swap=1 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-21181.20, crc32=0xbf0007ed, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-21180.19, crc32=0x6e7b98ed, offset=0x00000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-21179.18, crc32=0xd5ffb4d6, offset=0x00000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-21178.17, crc32=0x230bf8ac, offset=0x00000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + driveboard_program: stride=1, chunk size=1, byte swap=0 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-20985.bin, crc32=0xb139481d, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpeg_music: stride=1, chunk size=1, byte swap=0 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-20887.ic18, crc32=0xa0757684, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-20888.ic20, crc32=0xb495fe65, offset=0x00400000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-20889.ic22, crc32=0x18eec79e, offset=0x00800000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-20890.ic24, crc32=0xaac96fa2, offset=0x00c00000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpeg_program: stride=1, chunk size=1, byte swap=1 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-20886.ic2, crc32=0x65b05f98, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + sound_program: stride=1, chunk size=1, byte swap=1 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + epr-21325.21, crc32=0x004ad6ad, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + sound_samples: stride=1, chunk size=1, byte swap=1 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21285.22, crc32=0x7cdca6ac, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21287.24, crc32=0x06b66f17, offset=0x00400000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21286.23, crc32=0x749dfef0, offset=0x00800000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21288.25, crc32=0x14bee38e, offset=0x00c00000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + vrom: stride=32, chunk size=2, byte swap=0 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21198.26, crc32=0x42ec9ed4, offset=0x00000000 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21199.27, crc32=0xfa28088c, offset=0x00000002 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21200.28, crc32=0xfbb5aa1d, offset=0x00000004 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21201.29, crc32=0xe6b13469, offset=0x00000006 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21202.30, crc32=0xe6b4c2be, offset=0x00000008 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21203.31, crc32=0x32d08d33, offset=0x0000000a + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21204.32, crc32=0xef18fe0a, offset=0x0000000c + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21205.33, crc32=0x4687bea6, offset=0x0000000e + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21206.34, crc32=0xec2d6884, offset=0x00000010 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21207.35, crc32=0xeeaa510b, offset=0x00000012 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21208.36, crc32=0xb222fef0, offset=0x00000014 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21209.37, crc32=0x170a28ce, offset=0x00000016 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21210.38, crc32=0x460cefe0, offset=0x00000018 + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21211.39, crc32=0xc84759ce, offset=0x0000001a + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21212.40, crc32=0x6f8a75e0, offset=0x0000001c + +[2025-12-19 17:24:40.825 Uid(value=11725):25302:8622 I/SDL/APP] + mpr-21213.41, crc32=0xde75bec6, offset=0x0000001e + +[2025-12-19 17:24:40.892 Uid(value=11725):25302:25302 V/SDL] +onWindowFocusChanged(): true + +[2025-12-19 17:24:40.892 Uid(value=11725):25302:25302 V/SDL] +nativeFocusChanged() + +[2025-12-19 17:24:41.270 Uid(value=11725):25302:25302 D/VRI[MainActivity]] +visibilityChanged oldVisibility=true newVisibility=false + +[2025-12-19 17:24:41.279 Uid(value=11725):25302:25326 D/Surface] +Surface::disconnect + +[2025-12-19 17:24:41.279 Uid(value=11725):25302:25326 D/BufferQueueProducer] +[com.izzy2lost.super3/com.izzy2lost.super3.MainActivity#106725(BLAST Consumer)pid:25302](id:62d60000000e,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:24:42.311 Uid(value=11725):25302:8622 I/SDL/APP] +Model3 Init... + +[2025-12-19 17:24:42.494 Uid(value=11725):25302:8622 I/SDL/APP] +Model3 LoadGame... + +[2025-12-19 17:24:42.586 Uid(value=11725):25302:8622 I/SDL/APP] +Attaching inputs/outputs... + +[2025-12-19 17:24:42.586 Uid(value=11725):25302:8622 I/SDL/APP] +Attaching renderers... + +[2025-12-19 17:24:42.586 Uid(value=11725):25302:8622 I/SDL/APP] +Model3 Reset... + +[2025-12-19 17:24:42.606 Uid(value=11725):25302:8622 I/SDL/APP] +Loaded NVRAM: /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/NVRAM/dayto2pe.nv + +[2025-12-19 17:24:42.606 Uid(value=11725):25302:8622 I/SDL/APP] +LoadGameFromZip complete. + +[2025-12-19 17:24:42.608 Uid(value=11725):25302:8621 D/zzy2lost.super3] +PlayerBase::PlayerBase() + +[2025-12-19 17:24:42.608 Uid(value=11725):25302:8621 D/zzy2lost.super3] +TrackPlayerBase::TrackPlayerBase() + +[2025-12-19 17:24:42.608 Uid(value=11725):25302:8621 I/libOpenSLES] +Emulating old channel mask behavior (ignoring positional mask 0x3, using default mask 0x3 based on channel count of 2) + +[2025-12-19 17:24:42.647 Uid(value=11725):25302:8621 I/AudioTrack] +createTrack_l(0): AUDIO_OUTPUT_FLAG_FAST successful; frameCount 0 -> 384 + +[2025-12-19 17:24:42.685 Uid(value=11725):25302:8635 D/zzy2lost.super3] +PlayerBase::stop() from IPlayer + +[2025-12-19 17:24:42.685 Uid(value=11725):25302:8635 D/AudioTrack] +stop(579): called with 0 frames delivered + +[2025-12-19 17:24:42.687 Uid(value=11725):25302:8621 I/SDL/APP] +Controls (touch): bottom-left=COIN, bottom-right=START, top-left=SERVICE, top-right=TEST, left-middle=DPAD/STEER, right-middle=THROTTLE/BRAKE + +[2025-12-19 17:24:42.688 Uid(value=11725):25302:8621 I/SDL/APP] +Initializing New3D (GLES) ... + +[2025-12-19 17:24:42.688 Uid(value=11725):25302:8621 I/SDL/APP] +New3DAccurate=1 + +[2025-12-19 17:24:42.700 Uid(value=11725):25302:8621 I/SDL/APP] +New3D attached + +[2025-12-19 17:24:42.730 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:44.741 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:46.819 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:48.821 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:50.835 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:52.847 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:54.850 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:56.852 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:24:58.863 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:00.877 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:02.879 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:04.882 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:06.896 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:08.906 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:10.916 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:12.924 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:14.930 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:16.946 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:18.960 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:20.964 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:22.982 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:24.984 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:26.990 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:27.755 Uid(value=11725):25302:8621 I/SDL/APP] +Menu pause ON + +[2025-12-19 17:25:28.998 Uid(value=11725):25302:8621 I/SDL/APP] +Main loop alive; loadState=1 + +[2025-12-19 17:25:29.356 Uid(value=11725):25302:25302 V/SDL] +onWindowFocusChanged(): false + +[2025-12-19 17:25:29.356 Uid(value=11725):25302:25302 V/SDL] +nativeFocusChanged() + +[2025-12-19 17:25:29.371 Uid(value=11725):25302:8621 I/SDL/APP] +SDL window focus lost + +[2025-12-19 17:25:29.978 Uid(value=11725):25302:25302 W/WindowOnBackDispatcher] +sendCancelIfRunning: isInProgress=false callback=android.view.ViewRootImpl$$ExternalSyntheticLambda11@98dfdaf + +[2025-12-19 17:25:29.989 Uid(value=11725):25302:25326 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:29.989 Uid(value=11725):25302:25326 D/BufferQueueProducer] +[com.izzy2lost.super3/com.izzy2lost.super3.Super3Activity#106756(BLAST Consumer)pid:25302](id:62d600000011,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:25:29.990 Uid(value=11725):25302:25326 D/HWUI] +endAllActiveAnimators on 0xb400007dd3d3db80 (RippleDrawable) with handle 0xb400007c63dd61f0 + +[2025-12-19 17:25:30.006 Uid(value=11725):25302:25302 V/SDL] +onPause() + +[2025-12-19 17:25:30.020 Uid(value=11725):25302:25302 W/WindowOnBackDispatcher] +sendCancelIfRunning: isInProgress=false callback=android.view.ViewRootImpl$$ExternalSyntheticLambda11@f394f8a + +[2025-12-19 17:25:30.799 Uid(value=11725):25302:25302 D/VRI[Super3Activity]] +visibilityChanged oldVisibility=true newVisibility=false + +[2025-12-19 17:25:30.808 Uid(value=11725):25302:25302 V/SDL] +surfaceDestroyed() + +[2025-12-19 17:25:30.808 Uid(value=11725):25302:25302 V/SDL] +nativePause() + +[2025-12-19 17:25:30.809 Uid(value=11725):25302:8621 I/SDL/APP] +SDL window minimized + +[2025-12-19 17:25:30.809 Uid(value=11725):25302:8621 I/SDL/APP] +SDL app will enter background + +[2025-12-19 17:25:30.809 Uid(value=11725):25302:8621 I/SDL/APP] +SDL app did enter background + +[2025-12-19 17:25:30.909 Uid(value=11725):25302:8621 D/zzy2lost.super3] +PlayerBase::pause() from IPlayer + +[2025-12-19 17:25:30.919 Uid(value=11725):25302:25302 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:30.919 Uid(value=11725):25302:25302 D/BufferQueueProducer] +[SurfaceView[com.izzy2lost.super3/com.izzy2lost.super3.Super3Activity](BLAST)#106739(BLAST Consumer)pid:25302](id:62d600000010,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:25:30.920 Uid(value=11725):25302:25302 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:30.920 Uid(value=11725):25302:25302 D/BufferQueueProducer] +[SurfaceView[com.izzy2lost.super3/com.izzy2lost.super3.Super3Activity](BLAST)#106739(BLAST Consumer)pid:25302](id:62d600000010,api:0,p:-1,c:25302) disconnect: api -1 + +[2025-12-19 17:25:30.924 Uid(value=11725):25302:25326 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:30.924 Uid(value=11725):25302:25326 D/BufferQueueProducer] +[com.izzy2lost.super3/com.izzy2lost.super3.Super3Activity#106734(BLAST Consumer)pid:25302](id:62d60000000f,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:25:30.931 Uid(value=11725):25302:25302 V/SDL] +onStop() + +[2025-12-19 17:25:30.932 Uid(value=11725):25302:25302 V/SDL] +onDestroy() + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 I/SDL/APP] +SDL_QUIT received (ignored) + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 I/SDL/APP] +SDL app terminating + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 I/SDL/APP] +SDL app will enter foreground + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 I/SDL/APP] +SDL app did enter foreground + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 I/SDL/APP] +SDL window restored + +[2025-12-19 17:25:30.933 Uid(value=11725):25302:8621 E/libEGL] +call to OpenGL ES API with no current context (logged once per thread) + +[2025-12-19 17:25:30.939 Uid(value=11725):25302:8621 I/SDL/APP] +Saved NVRAM: /storage/emulated/0/Android/data/com.izzy2lost.super3/files/super3/NVRAM/dayto2pe.nv + +[2025-12-19 17:25:31.058 Uid(value=11725):25302:8635 D/zzy2lost.super3] +PlayerBase::stop() from IPlayer + +[2025-12-19 17:25:31.058 Uid(value=11725):25302:8635 D/AudioTrack] +stop(579): called with 2314240 frames delivered + +[2025-12-19 17:25:31.145 Uid(value=11725):25302:8621 D/zzy2lost.super3] +PlayerBase::stop() from IPlayer + +[2025-12-19 17:25:31.232 Uid(value=11725):25302:8621 V/SDL] +Finished main function + +[2025-12-19 17:25:31.232 Uid(value=11725):25302:25302 V/SDL] +SDLActivity thread ends + +[2025-12-19 17:25:31.233 Uid(value=11725):25302:25302 W/WindowOnBackDispatcher] +sendCancelIfRunning: isInProgress=false callback=android.view.ViewRootImpl$$ExternalSyntheticLambda11@a6d701b + +[2025-12-19 17:25:33.498 Uid(value=11725):25302:25302 W/WindowOnBackDispatcher] +sendCancelIfRunning: isInProgress=false callback=android.view.ViewRootImpl$$ExternalSyntheticLambda11@afcf7d8 + +[2025-12-19 17:25:33.499 Uid(value=11725):25302:25326 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:33.500 Uid(value=11725):25302:25326 D/BufferQueueProducer] +[com.izzy2lost.super3/com.izzy2lost.super3.MainActivity#106762(BLAST Consumer)pid:25302](id:62d600000012,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:25:36.213 Uid(value=11725):25302:25302 D/VRI[MainActivity]] +visibilityChanged oldVisibility=true newVisibility=false + +[2025-12-19 17:25:36.236 Uid(value=11725):25302:25326 D/Surface] +Surface::disconnect + +[2025-12-19 17:25:36.236 Uid(value=11725):25302:25326 D/BufferQueueProducer] +[com.izzy2lost.super3/com.izzy2lost.super3.MainActivity#106774(BLAST Consumer)pid:25302](id:62d600000013,api:1,p:25302,c:25302) disconnect: api 1 + +[2025-12-19 17:25:42.785 Uid(value=11725):25302:25326 I/HWUI] +setGrContext validptr-->nullptr +