From 76f5a23b7ff72ab65cdd3aa0afff9ca969e9fbfe Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 2 Jul 2026 16:08:43 +0800 Subject: [PATCH] [Fix] (replay-trace, MG_Impl/GLImpl): fix OpenRA Android retrace --- MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp | 2 +- MobileGL/MG_State/EGLState/Core.cpp | 9 ++++++--- .../app/src/trace/cpp/apitrace_glws_android.cpp | 3 ++- android-plugin/app/src/trace/cpp/trace_replay_core.cpp | 6 +++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp index 92c89f4f..bf4bc47a 100644 --- a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp +++ b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp @@ -67,7 +67,7 @@ namespace MobileGL::MG_Impl::GLImpl { } const auto& vao = MG_State::pGLContext->GetBoundVertexArray(); - if (vao && vao->GetExternalIndex() == 0) { + if (MG_State::pEGLContext->IsCurrentContextOpenGLCoreProfile() && vao && vao->GetExternalIndex() == 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidOperation, MakeUnique("MG_Impl/GLImpl", functionName, diff --git a/MobileGL/MG_State/EGLState/Core.cpp b/MobileGL/MG_State/EGLState/Core.cpp index c86344c6..152cf537 100644 --- a/MobileGL/MG_State/EGLState/Core.cpp +++ b/MobileGL/MG_State/EGLState/Core.cpp @@ -701,9 +701,12 @@ namespace MobileGL { return false; } const auto* ctx = TryGetContext(currentIt->second.Context); - return ctx && ctx->ClientAPI == EGL_OPENGL_API && - ((ctx->OpenGLProfileMask & EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT) || - ctx->MajorVersion > 3 || (ctx->MajorVersion == 3 && ctx->MinorVersion >= 1)); + if (!ctx || ctx->ClientAPI != EGL_OPENGL_API || + (ctx->OpenGLProfileMask & EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT)) { + return false; + } + return (ctx->OpenGLProfileMask & EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT) || + ctx->MajorVersion > 3 || (ctx->MajorVersion == 3 && ctx->MinorVersion >= 1); } EGLContext::EGLSurfaceHandle EGLContext::CreateWindowSurface(EGLDisplayHandle display, diff --git a/android-plugin/app/src/trace/cpp/apitrace_glws_android.cpp b/android-plugin/app/src/trace/cpp/apitrace_glws_android.cpp index d5e8e2a9..34666b1a 100644 --- a/android-plugin/app/src/trace/cpp/apitrace_glws_android.cpp +++ b/android-plugin/app/src/trace/cpp/apitrace_glws_android.cpp @@ -265,7 +265,8 @@ public: attribs[index++] = EGL_CONTEXT_MINOR_VERSION_KHR; attribs[index++] = profile.major >= 3 ? profile.minor : 3; attribs[index++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; - attribs[index++] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + attribs[index++] = profile.core ? EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR + : EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; } attribs[index++] = EGL_NONE; diff --git a/android-plugin/app/src/trace/cpp/trace_replay_core.cpp b/android-plugin/app/src/trace/cpp/trace_replay_core.cpp index bbc4d059..bffdfa58 100644 --- a/android-plugin/app/src/trace/cpp/trace_replay_core.cpp +++ b/android-plugin/app/src/trace/cpp/trace_replay_core.cpp @@ -396,9 +396,9 @@ bool ReadPpmRgbAsRgba(const std::string& path, RgbaImage& image, std::string& er return true; } -std::string SnapshotPathForCall(const Request& request) { +std::string SnapshotPathForCall(const Request& request, bool usePresentDump) { char call[16]; - snprintf(call, sizeof(call), "%010lld", request.targetCall); + snprintf(call, sizeof(call), "%010lld", usePresentDump ? request.targetCall + 1 : request.targetCall); return request.outputDir + "/actual." + call + ".png"; } @@ -486,7 +486,7 @@ bool RunRetrace(const Request& request, bool usePresentDump, Result& result) { return false; } - std::string snapshotPath = SnapshotPathForCall(request); + std::string snapshotPath = SnapshotPathForCall(request, usePresentDump); const std::string presentPath = request.outputDir + "/present.ppm"; const bool hasSnapshot = Exists(snapshotPath); const bool hasPresentDump = usePresentDump && Exists(presentPath);