mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Feat] (TraceApp, CI): pass arbitrary env vars through the retrace lane
- PLAN-B.md §8.2 and appendix B add a batch of new runtime switches
(MOBILEGL_PIPE_PUSH / _VERIFY / _STATS / _LEGACY_MEMOS / _TEXEL_RETAIN_MB /
_INDEX_MIRROR_MB, plus MOBILEGL_IPC_* later), and §11 P0 wants them parsed beside
the existing ones. Today every knob that has to reach an Android replay costs an
edit in five files - run_android_retrace_local.py, trace-replay-ci.sh,
TraceReplayActivity's request record, the JNI marshalling, and the setenv block in
trace_replay_core.cpp. That per-knob tax is what this replaces: one extra,
`--es mobilegl_env "K=V;K=V"`, carries all of them.
- Applied last, immediately before dlopen(libMobileGL.so), so it can also override
the dedicated fields above it - MobileGL's config is read during the load, and an
escape hatch that cannot beat the defaults is not one. An entry with no '=' unsets
the variable, which is the only way to clear a default the marshalling sets.
- The existing per-knob flags stay: they carry semantics beyond a setenv (use_angle
also selects a variant, the dump lists are joined, DirectVulkan forces the
R11G11B10F fallback), and rewriting them as env strings would move that logic into
the callers.
- Surface: --env / MOBILEGL_TRACE_ENV in trace-replay-ci.sh, repeatable --env
KEY=VALUE in run_android_retrace_local.py, `mobilegl_env` intent extra,
Request::envOverrides.
- The two-level parse now lives in trace_env_overrides.hpp, beside the semicolon
splitter it shares with the texture and FBO dump lists, and
tools/trace_replay/trace_env_overrides_test.cpp pins it: the empty entries a
trailing ';' leaves behind must not become unsetenv(""), `K=` must stay a Set of
the empty string rather than an Unset (a knob read with getenv() != nullptr sees
those as opposite answers), and only the FIRST '=' may separate, or a value
carrying '=' is truncated without a word of warning. The whole MOBILEGL_PIPE_*
batch rides on this parse, and the only lane that exercised it end to end was an
on-device retrace, which would have reported a splitting bug as "the knob had no
effect".
- The check is built and RUN at build time and mobilegl_trace_replay depends on it,
so `cmake --build ... --target mobilegl_trace_replay` - the exact command of
test.yml's "Build trace replay" job, which never invokes ctest - runs it. It is
assert-free on purpose: that lane configures Release, and <cassert> under NDEBUG
would compile every check into a green run that checked nothing. Negative control:
swapping find('=') for rfind('=') fails 2 checks, and keeping the splitter's empty
entries fails 2 more.
This commit is contained in:
@@ -281,6 +281,25 @@ else()
|
||||
"-Wl,--end-group")
|
||||
endif()
|
||||
|
||||
# The `K=V;K=V` environment passthrough is the only hand-rolled parse between a CI flag
|
||||
# and setenv(), and the lane that exercises it end to end is an on-device retrace, which
|
||||
# would report a splitting bug as "the knob had no effect". This pins it instead, in the
|
||||
# cheapest place that no configuration can skip: the check is built and RUN at build time,
|
||||
# and mobilegl_trace_replay depends on it, so `cmake --build ... --target
|
||||
# mobilegl_trace_replay` - the exact command of test.yml's "Build trace replay" - runs it
|
||||
# even though that job never invokes ctest.
|
||||
if(NOT CMAKE_CROSSCOMPILING)
|
||||
add_executable(mobilegl_trace_env_overrides_test
|
||||
"${MOBILEGL_TRACE_ROOT}/trace_env_overrides_test.cpp")
|
||||
target_compile_features(mobilegl_trace_env_overrides_test PRIVATE cxx_std_17)
|
||||
target_include_directories(mobilegl_trace_env_overrides_test PRIVATE
|
||||
"${MOBILEGL_TRACE_SHARED_CPP_DIR}")
|
||||
add_custom_command(TARGET mobilegl_trace_env_overrides_test POST_BUILD
|
||||
COMMAND mobilegl_trace_env_overrides_test
|
||||
COMMENT "Checking the retrace env passthrough parser")
|
||||
add_dependencies(mobilegl_trace_replay mobilegl_trace_env_overrides_test)
|
||||
endif()
|
||||
|
||||
if(MOBILEGL_TRACE_REPLAY_MOBILEGL_LIBRARY)
|
||||
set(mobilegl_trace_replay_mobilegl_library "${MOBILEGL_TRACE_REPLAY_MOBILEGL_LIBRARY}")
|
||||
else()
|
||||
|
||||
Reference in New Issue
Block a user