From 5d51372c444b567c8d28f17bd40f8e5332ae8a5e Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 28 Aug 2026 00:38:09 -0400 Subject: [PATCH] [Chore] (Config): triage backend-scoped env toggles under MOBILEGL_ESPRYT_ and MOBILEGL_MAGMA_ prefixes --- .github/scripts/validate-plugin-apks.sh | 6 +- .github/workflows/apk.yml | 8 +-- .github/workflows/test.yml | 16 ++--- MobileGL/Config.h | 60 +++++++++---------- MobileGL/ConfigLoader.cpp | 36 +++++------ .../DirectGLES/BackendObject_DirectGLES.cpp | 4 +- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 22 +++---- MobileGL/MG_Backend/DirectGLES/Managers.h | 6 +- MobileGL/MG_Backend/DirectGLES/Utils.h | 4 +- .../BackendObject_DirectVulkan.cpp | 2 +- .../DirectVulkan/BackendObject_DirectVulkan.h | 2 +- .../DirectVulkan/Renderer/VulkanRenderer.cpp | 8 +-- .../DirectVulkan/Renderer/VulkanRenderer.h | 2 +- .../DirectVulkan/SubgroupSupportPolicy.h | 8 +-- MobileGL/MG_IntegrationTest/CMakeLists.txt | 10 ++-- .../Scenarios/CopyImagePacked16Scenario.cpp | 4 +- .../Scenarios/ViewportArrayScenario.cpp | 6 +- .../MG_Util/BackendLoaders/OpenGL/Loader.cpp | 6 +- .../MG_Util/BackendLoaders/OpenGL/Loader.h | 4 +- .../MG_Util/BackendLoaders/Vulkan/Loader.cpp | 4 +- MobileGL/MG_Util/SelfTest/DriverBugProbes.cpp | 6 +- MobileGL/MG_Util/SelfTest/DriverPost.cpp | 2 +- README.md | 6 +- android-plugin/TRACE_REPLAY.md | 2 +- android-plugin/app/build.gradle.kts | 6 +- .../app/src/trace/cpp/trace_replay_core.cpp | 26 ++++---- android-plugin/trace-replay-ci.sh | 16 ++--- tools/piglit-android/run_piglit_android.py | 2 +- tools/trace_replay/README.md | 4 +- .../trace_replay/run_android_retrace_local.py | 4 +- .../skills/trace-fixture-authoring/SKILL.md | 2 +- tools/trace_replay/trace_replay_cli.cpp | 6 +- 32 files changed, 150 insertions(+), 150 deletions(-) diff --git a/.github/scripts/validate-plugin-apks.sh b/.github/scripts/validate-plugin-apks.sh index 1dcbf08b..72173636 100644 --- a/.github/scripts/validate-plugin-apks.sh +++ b/.github/scripts/validate-plugin-apks.sh @@ -44,12 +44,12 @@ require 'key:MOBILEGL_BACKEND_TYPE' "$plugin_resource_text" 'V2 backend variable require 'defaultValue:DirectGLES' "$plugin_resource_text" 'V2 DirectGLES default' require 'DirectVulkan' "$plugin_resource_text" 'V2 DirectVulkan option' require 'key:MOBILEGL_DISABLE_TIMERQUERY' "$plugin_resource_text" 'V2 timer-query toggle' -require 'key:MOBILEGL_DISABLE_SUBGROUP' "$plugin_resource_text" 'V2 Vulkan subgroup toggle' +require 'key:MOBILEGL_MAGMA_DISABLE_SUBGROUP' "$plugin_resource_text" 'V2 Vulkan subgroup toggle' require 'key:MOBILEGL_MAGMA_R11G11B10F_FALLBACK' "$plugin_resource_text" 'V2 Magma format fallback toggle' require 'key:MOBILEGL_MAGMA_FRAMESINFLIGHT' "$plugin_resource_text" 'V2 Magma frames-in-flight setting' -require 'key:MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER' "$plugin_resource_text" 'V2 sampler workaround toggle' +require 'key:MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER' "$plugin_resource_text" 'V2 sampler workaround toggle' require 'key:MOBILEGL_COHERENT_AS_FLUSH' "$plugin_resource_text" 'V2 coherent-as-flush toggle' -require 'key:MOBILEGL_USE_ANGLE' "$plugin_resource_text" 'V2 ANGLE toggle' +require 'key:MOBILEGL_ESPRYT_USE_ANGLE' "$plugin_resource_text" 'V2 ANGLE toggle' if [[ $(grep -Fc 'fclPlugin_V2' <<<"$plugin_manifest") -ne 1 ]]; then echo '::error::Plugin manifest must expose exactly one V2 descriptor' >&2 diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index aeb42efe..a8a53269 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -417,12 +417,12 @@ jobs: - name: Retrace and validate env: - MOBILEGL_USE_ANGLE: ${{ matrix.backend.name == 'DirectGLES' && '1' || '0' }} + MOBILEGL_ESPRYT_USE_ANGLE: ${{ matrix.backend.name == 'DirectGLES' && '1' || '0' }} MOBILEGL_TRACE_ANGLE_VARIANT: ${{ matrix.case.name == 'minecraft-1.21.4-fabric-iris-bliss-in-world' && '90a62123d794' || 'ec889e6ea831' }} MOBILEGL_MAGMA_R11G11B10F_FALLBACK: ${{ matrix.backend.name == 'DirectVulkan' && '1' || '0' }} - MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} - MOBILEGL_DERIVE_NUM_SUBGROUPS: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} - MOBILEGL_ITERATIONRP_FIX_BARRIER: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} + MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} + MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} + MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER: ${{ matrix.backend.name == 'DirectVulkan' && matrix.case.name == 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' && '1' || '0' }} run: | apk_file="android-retrace-apks/MobileGL-plugin-trace-release-${GITHUB_SHA}.apk" test -f "${apk_file}" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bfe9312..c343614d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -265,9 +265,9 @@ jobs: # crash stack without burning a CI round on an in-workflow debugger. env: MOBILEGL_ITEST_REQUIRE_GPU: "1" - MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH: "1" - MOBILEGL_DERIVE_NUM_SUBGROUPS: "1" - MOBILEGL_ITERATIONRP_FIX_BARRIER: "1" + MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH: "1" + MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS: "1" + MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER: "1" run: | ulimit -c unlimited sudo sysctl -w kernel.core_pattern='/tmp/core.%e.%p' @@ -279,11 +279,11 @@ jobs: # so an inline env reaches the test processes (unlike the ICD pin above). if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then ctest -V -L integration-gpu --no-tests=error - MOBILEGL_DISABLE_INVALIDATE_FLUSH=1 ctest -V -L integration-gpu \ + MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest -V -L integration-gpu \ -R 'Buffer|Readback|Atomic|Ssbo|Arena' --no-tests=error else ctest --output-on-failure -L integration-gpu --no-tests=error - MOBILEGL_DISABLE_INVALIDATE_FLUSH=1 ctest --output-on-failure -L integration-gpu \ + MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH=1 ctest --output-on-failure -L integration-gpu \ -R 'Buffer|Readback|Atomic|Ssbo|Arena' --no-tests=error fi @@ -654,9 +654,9 @@ jobs: fi if [ '${{ matrix.backend }}' = 'DirectVulkan' ] \ && [ '${{ matrix.case }}' = 'minecraft-1.21.4-fabric-iris-iterationrp-in-world' ]; then - export MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1 - export MOBILEGL_DERIVE_NUM_SUBGROUPS=1 - export MOBILEGL_ITERATIONRP_FIX_BARRIER=1 + export MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1 + export MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS=1 + export MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER=1 fi # The blended depth-write quirk auto-enables only on Qualcomm, which no CI # runner has, so force it on for the OIT case it exists to fix. ForceOn diff --git a/MobileGL/Config.h b/MobileGL/Config.h index 3337f385..af01d4c0 100644 --- a/MobileGL/Config.h +++ b/MobileGL/Config.h @@ -69,34 +69,34 @@ namespace MobileGL::MG_Config { struct FeaturesTable { // MOBILEGL_DISABLE_TIMERQUERY: do not advertise or use GPU timer queries. Bool DisableTimerQuery = false; - // MOBILEGL_ENABLE_GLES_TEXTURE_VIEW: advertise GL_ARB_texture_view on DirectGLES when + // MOBILEGL_ESPRYT_ENABLE_TEXTURE_VIEW: advertise GL_ARB_texture_view on DirectGLES when // the host ES driver has EXT/OES_texture_view. Off by default: the host extension is // present on Adreno 830 and the functional half of KHR-GL4{2,3}.texture_view still fails // there, because the view's ES internalformat is normalized independently of the storage // it aliases (see BackendObject_DirectGLES::BuildAdvertisedExtensions). The flag exists // so that work can be done without editing the gate. - Bool EnableGlesTextureView = false; + Bool EsprytEnableTextureView = false; // MOBILEGL_ENABLE_SPIRV_VALIDATION: validate generated and transformed SPIR-V. // Disabled by default because validation is a diagnostics-only cost. Bool EnableSpirvValidation = false; - // MOBILEGL_USE_ANGLE: load ANGLE EGL/GLES libraries. - Bool UseAngle = false; + // MOBILEGL_ESPRYT_USE_ANGLE: load ANGLE EGL/GLES libraries. + Bool EsprytUseAngle = false; #if defined(MOBILEGL_TRACE_ANGLE_VARIANTS) // MOBILEGL_TRACE_ANGLE_VARIANT: signed trace-APK ANGLE build short hash. String TraceAngleVariant; #endif - // MOBILEGL_DISABLE_SUBGROUP: force-disable Vulkan shader subgroup support, + // MOBILEGL_MAGMA_DISABLE_SUBGROUP: force-disable Vulkan shader subgroup support, // including the opt-in emulated compute path below. - Bool DisableSubgroup = false; + Bool MagmaDisableSubgroup = false; // MOBILEGL_MAGMA_EMULATE_SUBGROUP: implement GL_KHR_shader_subgroup's compute // stage on a 32-lane VIRTUAL subgroup lowered to workgroup-shared memory // (ShaderTranspiler::EmulateSubgroupsPass). Strictly a last resort: it only ever // engages when this flag is set AND the device has no native subgroup support at // all - a device with real subgroup operations always uses them natively, // whatever their width (the known iterationRP defect is patched by - // FixIterationRPSubgroupScratch below instead). Off by default. + // MagmaFixIterationRPSubgroupScratch below instead). Off by default. Bool MagmaEmulateSubgroup = false; - // MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH: patch iterationRP's own bug - the + // MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH: patch iterationRP's own bug - the // pack declares `shared vec2 prefixSumCache[32]` for a 512-invocation exposure // reduction and indexes it by gl_SubgroupID, so any device with sub-16-lane // subgroups (8-lane lavapipe -> 64 subgroups) writes shared memory out of @@ -106,12 +106,12 @@ namespace MobileGL::MG_Config { // so every other shader passes through byte-identical - as does iterationRP // itself on >= 16-lane devices. Auto is ON; ForceOff replays the pack's bug // verbatim. - QuirkOverride FixIterationRPSubgroupScratch = QuirkOverride::Auto; - // MOBILEGL_ITERATIONRP_FIX_BARRIER: repair Program 203's missing workgroup + QuirkOverride MagmaFixIterationRPSubgroupScratch = QuirkOverride::Auto; + // MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER: repair Program 203's missing workgroup // rendezvous between its two reductions over prefixSumCache. Off by default and // fingerprint-gated by FixIterationRPBarrierPass when enabled. - Bool IterationRPFixBarrier = false; - // MOBILEGL_DERIVE_NUM_SUBGROUPS: replace compute gl_NumSubgroups loads with + Bool MagmaIterationRPFixBarrier = false; + // MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS: replace compute gl_NumSubgroups loads with // ceil(workgroup invocations / gl_SubgroupSize) on the NATIVE subgroup path // (ShaderTranspiler::DeriveNumSubgroupsPass). Auto is ON: GL requires // gl_SubgroupID < gl_NumSubgroups, Adreno's builtin reports 1 while the same @@ -119,7 +119,7 @@ namespace MobileGL::MG_Config { // whenever the pipeline can request REQUIRE_FULL_SUBGROUPS (which the renderer // does whenever local_size_x is a multiple of the native width). ForceOff returns // to the raw driver builtin. - QuirkOverride DeriveNumSubgroups = QuirkOverride::Auto; + QuirkOverride MagmaDeriveNumSubgroups = QuirkOverride::Auto; // MOBILEGL_ADVERTISE_FP64: add GL_ARB_gpu_shader_fp64 to the advertised extension // string. `double` in a shader always WORKS - it is narrowed to 32 bits before any // module reaches a backend (ShaderTranspiler::DemoteFloat64Pass) - but the extension @@ -132,16 +132,16 @@ namespace MobileGL::MG_Config { Bool MagmaR11G11B10FFallback = false; // MOBILEGL_MAGMA_FRAMESINFLIGHT: requested Magma frames in flight, defaulting to 3. Uint32 MagmaFramesInFlight = 3; - // MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER: avoid mipmap min filters in samplers, + // MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER: avoid mipmap min filters in samplers, // resolves certain rendering bugs on ANGLE + llvmpipe. - Bool AvoidSamplerMipmapMinFilter = false; - // MOBILEGL_AVOID_EXPLICIT_LOD_BIAS: leave an already-explicit LOD argument alone when + Bool EsprytAvoidSamplerMipmapMinFilter = false; + // MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS: leave an already-explicit LOD argument alone when // emulating GL_TEXTURE_LOD_BIAS, instead of adding the bias uniform to it. Injecting // the uniform turns a compile-time-constant LOD into a runtime expression, which // sends ANGLE + llvmpipe down a mip-selection path that dereferences a NULL // descriptor and kills the process. Deviates from spec (Vulkan adds the bias to // OpImageSampleExplicitLod), so it is an avoidance for that stack only. - Bool AvoidExplicitLodBias = false; + Bool EsprytAvoidExplicitLodBias = false; // MOBILEGL_ESPRYT_UNLOCATED_IO_BLOCKS: emit a tessellation/geometry program's // inter-stage interface blocks WITHOUT their layout(location=) qualifier, letting ES // match them by block name and member sequence instead. The Mali ES driver delivers @@ -161,29 +161,29 @@ namespace MobileGL::MG_Config { Bool CoherentAsFlush = false; // MOBILEGL_TRACE_SKIP_AUTODESTROY: skip teardown in the ELF destructor (Init.cpp). Bool TraceSkipAutodestroy = false; - // MOBILEGL_DISABLE_UBO_RING: force the DirectGLES global-UBO upload back to the + // MOBILEGL_ESPRYT_DISABLE_UBO_RING: force the DirectGLES global-UBO upload back to the // per-draw glBufferSubData path instead of the persistent-mapped ring allocator // (negative control / driver-bug escape hatch). - Bool DisableUboRing = false; - // MOBILEGL_DISABLE_UNPACK_RING: force DirectGLES texture uploads back to + Bool EsprytDisableUboRing = false; + // MOBILEGL_ESPRYT_DISABLE_UNPACK_RING: force DirectGLES texture uploads back to // glTexSubImage from the client pointer instead of staging them through the // persistent-mapped unpack-PBO ring (negative control / driver-bug escape // hatch). - Bool DisableUnpackRing = false; - // MOBILEGL_DISABLE_UPLOAD_RING: force DirectGLES app buffer updates + Bool EsprytDisableUnpackRing = false; + // MOBILEGL_ESPRYT_DISABLE_UPLOAD_RING: force DirectGLES app buffer updates // (glBufferSubData / map flushes) back to the immediate driver upload instead // of queueing them for the staged-copy flush through the persistent-mapped // upload ring (negative control / driver-bug escape hatch; the immediate // upload stalls on drivers that resolve the WAR hazard on the CPU, e.g. Mali). - Bool DisableUploadRing = false; - // MOBILEGL_DISABLE_INVALIDATE_FLUSH: skip the glMapBufferRange(WRITE | + Bool EsprytDisableUploadRing = false; + // MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH: skip the glMapBufferRange(WRITE | // INVALIDATE_RANGE) tier of the DirectGLES pending-range flush and go straight // to the upload ring's staged glCopyBufferSubData (negative control / escape // hatch for a driver whose range-invalidating map misbehaves). The map tier is // what keeps a partial write into a large in-flight buffer priced by the RANGE: // on Mali both the immediate glBufferSubData and a staged copy into a busy // mutable store ghost the whole destination on the CPU. - Bool DisableInvalidateFlush = false; + Bool EsprytDisableInvalidateFlush = false; // MOBILEGL_ESPRYT_FORCE_DS_READBACK_EMULATION: make DirectGLES skip the native ES // depth/stencil reads and always go through the shader-sampling emulation. Core GL // ES has no depth or stencil readback, but some drivers accept it anyway (Mesa does, @@ -204,10 +204,10 @@ namespace MobileGL::MG_Config { // gl_FragDepth writers, and fully color-masked attachments are exempt (see // PipelineFactory::ShouldSuppressDepthWrite). Auto detects Qualcomm. QuirkOverride MagmaDisableBlendedDepthWriteQuirk = QuirkOverride::Auto; - // MOBILEGL_DISABLE_ROBUST_BUFFER_ACCESS: leave the Vulkan robustBufferAccess device + // MOBILEGL_MAGMA_DISABLE_ROBUST_BUFFER_ACCESS: leave the Vulkan robustBufferAccess device // feature off. It is enabled by default to match GL's defined out-of-range fetch // behavior; this escape hatch exists to measure or dodge its GPU cost on a device. - Bool DisableRobustBufferAccess = false; + Bool MagmaDisableRobustBufferAccess = false; // MOBILEGL_MAGMA_MULTIDRAW_MODE: preferred DirectVulkan multi-draw dispatch tier // ("ext" | "indirect" | "unroll", see MultiDrawMode). Clamped to device support; // unset picks the best supported tier. @@ -248,7 +248,7 @@ namespace MobileGL::MG_Config { // miscompiled shader: if a device ever renders differently with the cache // on, one run with this falsy says so. QuirkOverride ShaderTranslationCache = QuirkOverride::Auto; - // MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION: DirectGLES' gl_ViewportIndex routing + // MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION: DirectGLES' gl_ViewportIndex routing // emulation - the builtin becomes a flat varying, the fragment stage gets a // per-pass gate, and a routed draw is REPLAYED once per distinct viewport state // with the real glViewport/glScissor/glDepthRangef set for it. Auto is ON, and @@ -260,8 +260,8 @@ namespace MobileGL::MG_Config { // the pre-emulation path, extension passthrough where it exists and // LowerViewportIndexPass' demote-to-a-plain-global where it does not - and is // the negative control the emulation is measured against. - QuirkOverride ViewportArrayEmulation = QuirkOverride::Auto; - // MOBILEGL_WIDEN_PACKED16_STORAGE: DirectGLES stores GL_RGB565/GL_RGB5(A1)/GL_RGBA4 + QuirkOverride EsprytViewportArrayEmulation = QuirkOverride::Auto; + // MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE: DirectGLES stores GL_RGB565/GL_RGB5(A1)/GL_RGBA4 // images as 8-bit-per-channel ES storage (GL_RGB8/GL_RGBA8) instead of the driver's // native 16-bit packed formats. Auto defers to a POST driver-bug probe // (SelfTest::CopyImageMirrorsPacked16FieldOrder): some Mali drivers store SOME diff --git a/MobileGL/ConfigLoader.cpp b/MobileGL/ConfigLoader.cpp index 0c3b6cc2..42c2764b 100644 --- a/MobileGL/ConfigLoader.cpp +++ b/MobileGL/ConfigLoader.cpp @@ -162,37 +162,37 @@ namespace MobileGL::MG_ConfigLoader { inline void InitFeatures() { auto& features = MG_Config::Features; features.DisableTimerQuery = QueryEnvFlag("MOBILEGL_DISABLE_TIMERQUERY"); - features.EnableGlesTextureView = QueryEnvFlag("MOBILEGL_ENABLE_GLES_TEXTURE_VIEW"); + features.EsprytEnableTextureView = QueryEnvFlag("MOBILEGL_ESPRYT_ENABLE_TEXTURE_VIEW"); features.EnableSpirvValidation = QueryEnvFlag("MOBILEGL_ENABLE_SPIRV_VALIDATION"); - features.UseAngle = QueryEnvFlag("MOBILEGL_USE_ANGLE"); + features.EsprytUseAngle = QueryEnvFlag("MOBILEGL_ESPRYT_USE_ANGLE"); #if defined(MOBILEGL_TRACE_ANGLE_VARIANTS) QueryEnvVariable("MOBILEGL_TRACE_ANGLE_VARIANT", features.TraceAngleVariant, ""); #endif - features.DisableSubgroup = QueryEnvFlag("MOBILEGL_DISABLE_SUBGROUP"); + features.MagmaDisableSubgroup = QueryEnvFlag("MOBILEGL_MAGMA_DISABLE_SUBGROUP"); features.MagmaEmulateSubgroup = QueryEnvFlag("MOBILEGL_MAGMA_EMULATE_SUBGROUP"); - features.FixIterationRPSubgroupScratch = - QueryEnvQuirkOverride("MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); - features.IterationRPFixBarrier = QueryEnvFlag("MOBILEGL_ITERATIONRP_FIX_BARRIER"); - features.DeriveNumSubgroups = QueryEnvQuirkOverride("MOBILEGL_DERIVE_NUM_SUBGROUPS"); + features.MagmaFixIterationRPSubgroupScratch = + QueryEnvQuirkOverride("MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); + features.MagmaIterationRPFixBarrier = QueryEnvFlag("MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER"); + features.MagmaDeriveNumSubgroups = QueryEnvQuirkOverride("MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS"); features.AdvertiseFp64 = QueryEnvFlag("MOBILEGL_ADVERTISE_FP64"); features.MagmaR11G11B10FFallback = QueryEnvFlag("MOBILEGL_MAGMA_R11G11B10F_FALLBACK"); features.MagmaFramesInFlight = QueryEnvUint32("MOBILEGL_MAGMA_FRAMESINFLIGHT", 3, 1, 64); - features.AvoidSamplerMipmapMinFilter = - QueryEnvFlag("MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER"); - features.AvoidExplicitLodBias = QueryEnvFlag("MOBILEGL_AVOID_EXPLICIT_LOD_BIAS"); + features.EsprytAvoidSamplerMipmapMinFilter = + QueryEnvFlag("MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER"); + features.EsprytAvoidExplicitLodBias = QueryEnvFlag("MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS"); features.EsprytUnlocatedIoBlocks = QueryEnvQuirkOverride("MOBILEGL_ESPRYT_UNLOCATED_IO_BLOCKS"); features.CoherentAsFlush = QueryEnvFlag("MOBILEGL_COHERENT_AS_FLUSH"); features.TraceSkipAutodestroy = QueryEnvFlag("MOBILEGL_TRACE_SKIP_AUTODESTROY"); - features.DisableUboRing = QueryEnvFlag("MOBILEGL_DISABLE_UBO_RING"); - features.DisableUnpackRing = QueryEnvFlag("MOBILEGL_DISABLE_UNPACK_RING"); - features.DisableUploadRing = QueryEnvFlag("MOBILEGL_DISABLE_UPLOAD_RING"); - features.DisableInvalidateFlush = QueryEnvFlag("MOBILEGL_DISABLE_INVALIDATE_FLUSH"); + features.EsprytDisableUboRing = QueryEnvFlag("MOBILEGL_ESPRYT_DISABLE_UBO_RING"); + features.EsprytDisableUnpackRing = QueryEnvFlag("MOBILEGL_ESPRYT_DISABLE_UNPACK_RING"); + features.EsprytDisableUploadRing = QueryEnvFlag("MOBILEGL_ESPRYT_DISABLE_UPLOAD_RING"); + features.EsprytDisableInvalidateFlush = QueryEnvFlag("MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH"); features.EsprytForceDepthStencilReadbackEmulation = QueryEnvFlag("MOBILEGL_ESPRYT_FORCE_DS_READBACK_EMULATION"); features.RelaxedSemantics = QueryEnvFlag("MOBILEGL_RELAXED_SEMANTICS"); features.MagmaDisableBlendedDepthWriteQuirk = QueryEnvQuirkOverride("MOBILEGL_MAGMA_DISABLE_BLENDED_DEPTH_WRITE"); - features.DisableRobustBufferAccess = QueryEnvFlag("MOBILEGL_DISABLE_ROBUST_BUFFER_ACCESS"); + features.MagmaDisableRobustBufferAccess = QueryEnvFlag("MOBILEGL_MAGMA_DISABLE_ROBUST_BUFFER_ACCESS"); features.MagmaMultiDrawMode = QueryEnvMultiDrawMode("MOBILEGL_MAGMA_MULTIDRAW_MODE"); features.EsprytMultiDrawMode = QueryEnvGLESMultiDrawMode("MOBILEGL_ESPRYT_MULTIDRAW_MODE"); features.AsyncShaderCompile = QueryEnvQuirkOverride("MOBILEGL_ASYNC_SHADER_COMPILE"); @@ -200,10 +200,10 @@ namespace MobileGL::MG_ConfigLoader { features.AsyncOptimisticShaderStatus = QueryEnvQuirkOverride("MOBILEGL_ASYNC_OPTIMISTIC_SHADER_STATUS"); features.ShaderTranslationCache = QueryEnvQuirkOverride("MOBILEGL_SHADER_CACHE"); - features.ViewportArrayEmulation = - QueryEnvQuirkOverride("MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION"); + features.EsprytViewportArrayEmulation = + QueryEnvQuirkOverride("MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION"); features.EsprytWidenPacked16Storage = - QueryEnvQuirkOverride("MOBILEGL_WIDEN_PACKED16_STORAGE"); + QueryEnvQuirkOverride("MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE"); } inline void InitBackendType() { diff --git a/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp index 7270a446..1d2440a3 100644 --- a/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp @@ -1198,8 +1198,8 @@ namespace MobileGL::MG_Backend::DirectGLES { // // Until that reconciliation exists, advertising here would be the same lie the comment // above refuses to tell, just with an extra prerequisite met. Set - // MOBILEGL_ENABLE_GLES_TEXTURE_VIEW=1 to re-enable it for that work. - if (textureViewSupported && MG_Config::Features.EnableGlesTextureView) { + // MOBILEGL_ESPRYT_ENABLE_TEXTURE_VIEW=1 to re-enable it for that work. + if (textureViewSupported && MG_Config::Features.EsprytEnableTextureView) { extensions.push_back(E_GL_ARB_texture_view); } // Only advertised when the host ES driver actually filters anisotropically: the sampler diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index ac5f4af5..c5cc7121 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -54,7 +54,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // the driver fifteen more rectangles to rasterize against, and nothing in MobileGL has ever // programmed the indexed state it would need. Bool ViewportArrayEmulationEnabled() { - return MG_Config::Features.ViewportArrayEmulation != MG_Config::QuirkOverride::ForceOff; + return MG_Config::Features.EsprytViewportArrayEmulation != MG_Config::QuirkOverride::ForceOff; } Bool g_anyProgramRoutesViewportIndex = false; @@ -75,13 +75,13 @@ namespace MobileGL::MG_Backend::DirectGLES { static Bool ShouldAvoidSamplerMipmapMinFilterOnAngleLlvmpipe() { // IsAngleLlvmpipeRenderer combined with the - // MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER feature toggle, + // MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER feature toggle, // both resolved in FillInGLESCapabilities. return g_GLESCapabilities.AvoidSamplerMipmapMinFilter; } static Bool ShouldAvoidExplicitLodBiasOnAngleLlvmpipe() { - // IsAngleLlvmpipeRenderer combined with the MOBILEGL_AVOID_EXPLICIT_LOD_BIAS + // IsAngleLlvmpipeRenderer combined with the MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS // feature toggle, both resolved in FillInGLESCapabilities. return g_GLESCapabilities.AvoidExplicitLodBias; } @@ -823,7 +823,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // now: kill switch off, the ES copy entry point resolved, and the ring's // own availability gate (EXT_buffer_storage + fences + live context) up. Bool UploadRingUsableNow() { - if (MG_Config::Features.DisableUploadRing) return false; + if (MG_Config::Features.EsprytDisableUploadRing) return false; if (!g_GLESFuncs.glCopyBufferSubData) return false; return RingAvailable(g_uploadRing); } @@ -846,7 +846,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // stores also kills the ghost, but eagerly commits every arena's // full extent - +hundreds of MB - which LMK'd the whole device.) // 2. The staging ring + glCopyBufferSubData: the copy is ordered on - // the GPU timeline, no CPU wait (MOBILEGL_DISABLE_INVALIDATE_FLUSH + // the GPU timeline, no CPU wait (MOBILEGL_ESPRYT_DISABLE_INVALIDATE_FLUSH // forces this tier as the map path's negative control). // 3. Direct glBufferSubData (potentially stalling) when neither the // map entry points nor the ring exist. @@ -871,7 +871,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // frontend size and the backend store disagree (a pending respecify // resolves that later; bytes past either end have nowhere to land). const SizeT limit = std::min(bufferObject.GetSize(), resource.storageSize); - const Bool mapUsable = !MG_Config::Features.DisableInvalidateFlush && + const Bool mapUsable = !MG_Config::Features.EsprytDisableInvalidateFlush && g_GLESFuncs.glMapBufferRange && g_GLESFuncs.glUnmapBuffer; const Bool ringUsable = UploadRingUsableNow(); for (const auto& range : ranges) { @@ -1065,7 +1065,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // keeps the legacy immediate upload: draw-time sync never flushes // ranges for it, and its mapping publishes writes by itself. if ((resource->persistentMapped && resource->persistentPtr) || - MG_Config::Features.DisableUploadRing) { + MG_Config::Features.EsprytDisableUploadRing) { UploadRangeNow(*resource, bufferObject, offset, offset + size); resource->syncedChangeSerial = bufferObject.GetChangeSerial(); return; @@ -1093,7 +1093,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // flush at draw-time sync; only the zero-copy persistent store and the // negative-control kill switch keep the immediate paths below. if (!(resource->persistentMapped && resource->persistentPtr) && - !MG_Config::Features.DisableUploadRing) { + !MG_Config::Features.EsprytDisableUploadRing) { const std::lock_guard lock(resource->pendingMutex); resource->pendingRanges.Add(range); return; @@ -1901,7 +1901,7 @@ namespace MobileGL::MG_Backend::DirectGLES { } // namespace Bool UboRingAvailable() { - if (MG_Config::Features.DisableUboRing) return false; + if (MG_Config::Features.EsprytDisableUboRing) return false; return RingAvailable(g_uboRing); } @@ -1914,7 +1914,7 @@ namespace MobileGL::MG_Backend::DirectGLES { void UboRingOnPresent() { RingOnPresent(g_uboRing); } Bool UnpackRingAvailable() { - if (MG_Config::Features.DisableUnpackRing) return false; + if (MG_Config::Features.EsprytDisableUnpackRing) return false; return RingAvailable(g_unpackRing); } @@ -6489,7 +6489,7 @@ namespace MobileGL::MG_Backend::DirectGLES { const Int advertisedMaxSamples = std::max(g_GLESCapabilities.MaxSamples, kFrontendMaxSamples); // Armed by the EMULATION as well as by the missing extension, and the emulation is on - // by default (MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION). Having the extension is not a + // by default (MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION). Having the extension is not a // reason to keep the builtin: it only ever gave the SHADER a compilable name, while // the driver's INDEXED viewport state was never programmed by anything in MobileGL // (SyncRenderState pushes index 0 and stops), so an extension-capable driver diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index d0c46250..73729c7d 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -230,7 +230,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // still holding what glViewport/glScissor/glDepthRange broadcast to all sixteen - collapses // to a single pass with an all-ones gate mask, i.e. one draw and no behaviour change at all. // - // Whether emulation runs. Off only under MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION falsy, which + // Whether emulation runs. Off only under MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION falsy, which // restores the pre-emulation path as a negative control. Bool ViewportArrayEmulationEnabled(); // Whether ANY program built in this process has come out with a viewport gate. Sticky once @@ -627,7 +627,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // which is what to watch if this ring ever shows up in an RSS regression: it // grows on demand from 4 MiB and is capped, not unbounded. // - // False when the feature is disabled (MOBILEGL_DISABLE_UNPACK_RING), + // False when the feature is disabled (MOBILEGL_ESPRYT_DISABLE_UNPACK_RING), // EXT_buffer_storage / fences are missing, the ES context is not current, or // ring creation already failed under this context. Callers then upload from // the client pointer exactly as before. @@ -656,7 +656,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // draw-time sync drains them: bytes staged into this ring, then one // glCopyBufferSubData per merged range - the copy is ordered on the GPU // timeline, so the hazard costs no CPU wait. Reclamation contract identical - // to the other two rings. MOBILEGL_DISABLE_UPLOAD_RING restores the + // to the other two rings. MOBILEGL_ESPRYT_DISABLE_UPLOAD_RING restores the // historical immediate-upload path (negative control / escape hatch). void UploadRingOnPresent(); } // namespace BufferImpl diff --git a/MobileGL/MG_Backend/DirectGLES/Utils.h b/MobileGL/MG_Backend/DirectGLES/Utils.h index 3f9d8379..ae7f4af0 100644 --- a/MobileGL/MG_Backend/DirectGLES/Utils.h +++ b/MobileGL/MG_Backend/DirectGLES/Utils.h @@ -50,7 +50,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // driver stores some packed16 allocations with a mirrored field order // (PixelFormatNormalizeOptionBit::WidenPacked16Norm). True only for // GL_RGB565/GL_RGB5(_A1)/GL_RGBA4, and only where the POST probe measured the - // divergence (or MOBILEGL_WIDEN_PACKED16_STORAGE forces it). The transfer paths + // divergence (or MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE forces it). The transfer paths // consult it too: the packed-norm re-upload leg must stand down when the ES storage // is no longer 16-bit packed. Bool UsesWidenedPacked16NormStorage(TextureInternalFormat internalFormat); @@ -532,7 +532,7 @@ namespace MobileGL::MG_Backend::DirectGLES { // avoidExplicitLodBias leaves lookups that already carry an explicit LOD untouched, // so their constant level stays constant; only the implicit-LOD forms take the bias. // Off by default and only ever set on ANGLE + llvmpipe, where injecting the uniform - // into a constant LOD crashes the driver (MOBILEGL_AVOID_EXPLICIT_LOD_BIAS). + // into a constant LOD crashes the driver (MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS). String EmulateTextureLodBias(const String& glslCode, Bool avoidExplicitLodBias = false); } // namespace PrgramImpl diff --git a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp index 28c714b0..2ed4d34e 100644 --- a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp @@ -624,7 +624,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { if (nonZeroIndirectBaseInstanceSupported) { extensions.push_back(E_GL_ARB_base_instance); } - if (shaderSubgroupSupported && !MG_Config::Features.DisableSubgroup) { + if (shaderSubgroupSupported && !MG_Config::Features.MagmaDisableSubgroup) { extensions.push_back(E_GL_KHR_shader_subgroup); } // GL_KHR_parallel_shader_compile is MobileGL's own capability, not the Vulkan diff --git a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.h b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.h index 91c6e54c..1c7ef15c 100644 --- a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.h +++ b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.h @@ -70,7 +70,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { const RendererInfo& GetRendererIdentity(); // The full OpenGL extension list Magma advertises (glGetString(GL_EXTENSIONS)) for - // a device with the given raw capabilities. The MOBILEGL_DISABLE_SUBGROUP and + // a device with the given raw capabilities. The MOBILEGL_MAGMA_DISABLE_SUBGROUP and // MOBILEGL_DISABLE_TIMERQUERY escape hatches are applied inside, so callers pass // the detected device support (passing an already-gated value is harmless). Vector BuildAdvertisedExtensions(Bool shaderSubgroupSupported, Bool timerQueriesSupported, diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 7038a258..310e0027 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -13214,8 +13214,8 @@ void main() { // Match GL's robust buffer-fetch behavior where the Vulkan device supports it. This covers // out-of-range fetches; arbitrary GL vertex strides/offsets still need the explicit tight // repack in VertexInputStateFactory when they violate Vulkan's address-alignment rules. - // MOBILEGL_DISABLE_ROBUST_BUFFER_ACCESS leaves it off to measure or dodge its GPU cost. - deviceFeatures.robustBufferAccess = MG_Config::Features.DisableRobustBufferAccess + // MOBILEGL_MAGMA_DISABLE_ROBUST_BUFFER_ACCESS leaves it off to measure or dodge its GPU cost. + deviceFeatures.robustBufferAccess = MG_Config::Features.MagmaDisableRobustBufferAccess ? VK_FALSE : supportedDeviceFeatures.robustBufferAccess; deviceFeatures.geometryShader = supportedDeviceFeatures.geometryShader; @@ -13590,13 +13590,13 @@ void main() { subgroupPropertyQuery.pNext = &subgroupProperties; getPhysicalDeviceProperties2(m_physicalDevice.handle, &subgroupPropertyQuery); // Mirrors the loader's HasUsableShaderSubgroupSupport gate, including the - // MOBILEGL_DISABLE_SUBGROUP escape hatch, so the module lowerings can never + // MOBILEGL_MAGMA_DISABLE_SUBGROUP escape hatch, so the module lowerings can never // disagree with the advertised capabilities. const Bool usableSubgroups = subgroupProperties.subgroupSize > 0 && (subgroupProperties.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT) != 0 && (subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_BASIC_BIT) != 0; - if (usableSubgroups && !MG_Config::Features.DisableSubgroup) { + if (usableSubgroups && !MG_Config::Features.MagmaDisableSubgroup) { m_nativeSubgroupSize = subgroupProperties.subgroupSize; m_nativeSubgroupSupported = true; } diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index 271320c2..27333ca5 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -563,7 +563,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Native subgroup topology, queried at device creation for the compute-module // subgroup repairs (SubgroupSupportPolicy.h) and the REQUIRE_FULL_SUBGROUPS // stage flag; 0 / false when the device has no usable compute subgroups or - // MOBILEGL_DISABLE_SUBGROUP forced them off. + // MOBILEGL_MAGMA_DISABLE_SUBGROUP forced them off. Uint32 m_nativeSubgroupSize = 0; Bool m_nativeSubgroupSupported = false; Bool m_computeFullSubgroupsFeatureEnabled = false; diff --git a/MobileGL/MG_Backend/DirectVulkan/SubgroupSupportPolicy.h b/MobileGL/MG_Backend/DirectVulkan/SubgroupSupportPolicy.h index f5f48e74..0ef22070 100644 --- a/MobileGL/MG_Backend/DirectVulkan/SubgroupSupportPolicy.h +++ b/MobileGL/MG_Backend/DirectVulkan/SubgroupSupportPolicy.h @@ -39,18 +39,18 @@ namespace MobileGL::MG_Backend::DirectVulkan { inline Bool ShouldEmulateSubgroups(const Bool nativeSubgroupSupported) { return MG_Config::Features.MagmaEmulateSubgroup && !nativeSubgroupSupported && - !MG_Config::Features.DisableSubgroup; + !MG_Config::Features.MagmaDisableSubgroup; } inline Bool ShouldFixIterationRPSubgroupScratch() { // Auto is ON: the patch is fingerprint-gated to iterationRP's reduction and // grows one under-declared array; every other module passes through untouched. - return MG_Config::Features.FixIterationRPSubgroupScratch != + return MG_Config::Features.MagmaFixIterationRPSubgroupScratch != MG_Config::QuirkOverride::ForceOff; } inline Bool ShouldFixIterationRPBarrier() { - return MG_Config::Features.IterationRPFixBarrier; + return MG_Config::Features.MagmaIterationRPFixBarrier; } inline Bool ShouldDeriveNumSubgroups() { @@ -58,6 +58,6 @@ namespace MobileGL::MG_Backend::DirectVulkan { // contract to hold, and the derived ceil() value is the one the renderer can pin // with REQUIRE_FULL_SUBGROUPS - the driver builtin is the value with no // cross-driver guarantee (Adreno returns 1 for an 8-subgroup dispatch). - return MG_Config::Features.DeriveNumSubgroups != MG_Config::QuirkOverride::ForceOff; + return MG_Config::Features.MagmaDeriveNumSubgroups != MG_Config::QuirkOverride::ForceOff; } } // namespace MobileGL::MG_Backend::DirectVulkan diff --git a/MobileGL/MG_IntegrationTest/CMakeLists.txt b/MobileGL/MG_IntegrationTest/CMakeLists.txt index 06e3c104..8ef5418c 100644 --- a/MobileGL/MG_IntegrationTest/CMakeLists.txt +++ b/MobileGL/MG_IntegrationTest/CMakeLists.txt @@ -288,9 +288,9 @@ if (MOBILEGL_ITEST_VK_ICD) if (MOBILEGL_ITEST_VK_ICD MATCHES "lvp_icd|lavapipe") message(STATUS "Integration tests: lavapipe ICD - forcing the iterationRP repairs on") list(APPEND MGL_ITEST_VULKAN_ENV - "MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1" - "MOBILEGL_DERIVE_NUM_SUBGROUPS=1" - "MOBILEGL_ITERATIONRP_FIX_BARRIER=1") + "MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1" + "MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS=1" + "MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER=1") endif() endif() @@ -353,7 +353,7 @@ mgl_itest_join_environment(MGL_ITEST_VULKAN_OPTIMISTIC_ENVIRONMENT "MOBILEGL_BACKEND_TYPE=DirectVulkan" "MOBILEGL_ASYNC_SHADER_COMPILE=1" "MOBILEGL_ASYNC_OPTIMISTIC_SHADER_STATUS=1" ${MGL_ITEST_VULKAN_ENV}) mgl_itest_join_environment(MGL_ITEST_GLES_NO_VIEWPORT_EMULATION_ENVIRONMENT - "MOBILEGL_BACKEND_TYPE=DirectGLES" "MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION=0" ${MGL_ITEST_COMMON_ENV}) + "MOBILEGL_BACKEND_TYPE=DirectGLES" "MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION=0" ${MGL_ITEST_COMMON_ENV}) # MOBILEGL_LOG_FILE_PATH alongside the pin, because the arming assertion needs somewhere to # read the library's own report from. The strip's arming signal is a latched MGLOG_I and there # is no other way for a test process to learn that it fired - MG_Config is not reachable from @@ -364,7 +364,7 @@ mgl_itest_join_environment(MGL_ITEST_GLES_UNLOCATED_IO_BLOCKS_ENVIRONMENT "MOBILEGL_LOG_FILE_PATH=${CMAKE_CURRENT_BINARY_DIR}/unlocated-io-blocks.log" ${MGL_ITEST_COMMON_ENV}) mgl_itest_join_environment(MGL_ITEST_GLES_WIDENED_PACKED16_ENVIRONMENT - "MOBILEGL_BACKEND_TYPE=DirectGLES" "MOBILEGL_WIDEN_PACKED16_STORAGE=1" ${MGL_ITEST_COMMON_ENV}) + "MOBILEGL_BACKEND_TYPE=DirectGLES" "MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE=1" ${MGL_ITEST_COMMON_ENV}) # TIMEOUT on every entry: a GPU test that wedges must fail the run, not hang it. set(MGL_ITEST_TIMEOUT 120) diff --git a/MobileGL/MG_IntegrationTest/Scenarios/CopyImagePacked16Scenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/CopyImagePacked16Scenario.cpp index 5dd7eb6e..802c834e 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/CopyImagePacked16Scenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/CopyImagePacked16Scenario.cpp @@ -31,7 +31,7 @@ // The repair under test is the packed16 storage widening // (PixelFormatNormalizeOptionBit::WidenPacked16Norm): where the POST probe // (SelfTest::CopyImageMirrorsPacked16FieldOrder) measures the mirror - or -// MOBILEGL_WIDEN_PACKED16_STORAGE forces it - the three formats are stored as +// MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE forces it - the three formats are stored as // GL_RGB8/GL_RGBA8, leaving no 16-bit packed image for a copy to disagree about. The client // word still round-trips exactly: the canonical shadow is already UNorm8, and an n-bit field // encodes to UNorm8 and back losslessly for every n <= 8. @@ -40,7 +40,7 @@ // * the ambient registrations take the narrow path on a clean driver (llvmpipe has no // mirror, so Auto keeps the native 16-bit storage - the pre-existing behaviour stays // covered); -// * the DirectGLES.WidenedPacked16. registration pins MOBILEGL_WIDEN_PACKED16_STORAGE=1, +// * the DirectGLES.WidenedPacked16. registration pins MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE=1, // which is the storage every affected device will actually run - without it the repair // is unfalsifiable off-device, because no CI driver has the bug that arms it. // The Mali mirror itself CANNOT be reproduced here; only the on-device CTS run can show the diff --git a/MobileGL/MG_IntegrationTest/Scenarios/ViewportArrayScenario.cpp b/MobileGL/MG_IntegrationTest/Scenarios/ViewportArrayScenario.cpp index 6670c5d9..967a8b30 100644 --- a/MobileGL/MG_IntegrationTest/Scenarios/ViewportArrayScenario.cpp +++ b/MobileGL/MG_IntegrationTest/Scenarios/ViewportArrayScenario.cpp @@ -525,7 +525,7 @@ void main() { fragColor = vec4(float(gsIndex) * 16.0 / 255.0, 0.0, 0.0, 1.0); } // // Everything above is a claim about pixels, and a claim about pixels cannot tell an // emulation that works from a backend that was going to be right anyway. This case builds - // the SAME program in a process started with MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION=0 + // the SAME program in a process started with MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION=0 // (the NoViewportArrayEmulation. ctest entry) and requires case 1's // result to COLLAPSE: with no routing, every geometry invocation rasterizes against // viewport 0's rectangle, so the last invocation paints the whole surface and every cell @@ -551,10 +551,10 @@ void main() { fragColor = vec4(float(gsIndex) * 16.0 / 255.0, 0.0, 0.0, 1.0); } // entry for it, so the control still runs in every ctest run; anywhere else - the // ambient ctest entries, or the binary run straight from a device shell - the // emulation is on and this case skips. - if (AmbientQuirkFromEnvironment("MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION") != AmbientQuirk::Off) { + if (AmbientQuirkFromEnvironment("MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION") != AmbientQuirk::Off) { GTEST_SKIP() << "this is the negative control for the emulation and needs it off for the " "whole process; the NoViewportArrayEmulation. ctest entry runs it with " - "MOBILEGL_FORCE_VIEWPORT_ARRAY_EMULATION=0"; + "MOBILEGL_ESPRYT_FORCE_VIEWPORT_ARRAY_EMULATION=0"; } IntTarget target = MakeIntTarget(kSurfaceSide, kSurfaceSide); diff --git a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp index 4e1f228d..eb143d0d 100644 --- a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp +++ b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp @@ -22,7 +22,7 @@ namespace MobileGL::MG_Util::BackendLoader { static Bool UseAngle() { - return MG_Config::Features.UseAngle; + return MG_Config::Features.EsprytUseAngle; } #if defined(MOBILEGL_TRACE_ANGLE_VARIANTS) && defined(__ANDROID__) @@ -1762,9 +1762,9 @@ namespace MobileGL::MG_Util::BackendLoader { caps.IsAngleLlvmpipeRenderer = caps.IsAngleRenderer && caps.GLESRendererString.find("llvmpipe") != String::npos; caps.AvoidSamplerMipmapMinFilter = - caps.IsAngleLlvmpipeRenderer && MG_Config::Features.AvoidSamplerMipmapMinFilter; + caps.IsAngleLlvmpipeRenderer && MG_Config::Features.EsprytAvoidSamplerMipmapMinFilter; caps.AvoidExplicitLodBias = - caps.IsAngleLlvmpipeRenderer && MG_Config::Features.AvoidExplicitLodBias; + caps.IsAngleLlvmpipeRenderer && MG_Config::Features.EsprytAvoidExplicitLodBias; MGLOG_I(" GL_EXT_disjoint_timer_query supported: %s", caps.SupportsDisjointTimerQuery ? "true" : "false"); MGLOG_I(" GL_KHR_parallel_shader_compile supported: %s", diff --git a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.h b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.h index d899c32d..d8b3b02f 100644 --- a/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.h +++ b/MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.h @@ -1235,10 +1235,10 @@ namespace MobileGL { // GL_RENDERER contains both "ANGLE" and "llvmpipe". Bool IsAngleLlvmpipeRenderer = false; // IsAngleLlvmpipeRenderer combined with the - // MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER feature toggle: + // MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER feature toggle: // sampler min filters should drop their mipmap component. Bool AvoidSamplerMipmapMinFilter = false; - // IsAngleLlvmpipeRenderer combined with the MOBILEGL_AVOID_EXPLICIT_LOD_BIAS + // IsAngleLlvmpipeRenderer combined with the MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS // feature toggle: LOD-bias emulation should not touch explicit-LOD lookups. Bool AvoidExplicitLodBias = false; // True when indirect draws leak the command's baseInstance word ("reserved, diff --git a/MobileGL/MG_Util/BackendLoaders/Vulkan/Loader.cpp b/MobileGL/MG_Util/BackendLoaders/Vulkan/Loader.cpp index 447f8004..f0e688d4 100644 --- a/MobileGL/MG_Util/BackendLoaders/Vulkan/Loader.cpp +++ b/MobileGL/MG_Util/BackendLoaders/Vulkan/Loader.cpp @@ -92,7 +92,7 @@ namespace MobileGL::MG_Util::BackendLoader { } Bool IsShaderSubgroupForcedDisabled() { - return MG_Config::Features.DisableSubgroup; + return MG_Config::Features.MagmaDisableSubgroup; } } // namespace @@ -272,7 +272,7 @@ namespace MobileGL::MG_Util::BackendLoader { supportsShaderSubgroup ? "true" : "false", caps.SupportsShaderSubgroup ? "true" : "false", subgroupProps.subgroupSize, subgroupProps.supportedStages, subgroupProps.supportedOperations); if (supportsShaderSubgroup && forceDisableShaderSubgroup) { - MGLOG_W("Vulkan shader subgroup support forced off by MOBILEGL_DISABLE_SUBGROUP"); + MGLOG_W("Vulkan shader subgroup support forced off by MOBILEGL_MAGMA_DISABLE_SUBGROUP"); } return true; diff --git a/MobileGL/MG_Util/SelfTest/DriverBugProbes.cpp b/MobileGL/MG_Util/SelfTest/DriverBugProbes.cpp index edfd65f8..590f408b 100644 --- a/MobileGL/MG_Util/SelfTest/DriverBugProbes.cpp +++ b/MobileGL/MG_Util/SelfTest/DriverBugProbes.cpp @@ -2407,7 +2407,7 @@ namespace MobileGL::MG_Util::SelfTest { Optional ProbeCopyImagePacked16FieldOrderBug(const GLESFunctionsTable& gl) { if (!CopyImageMirrorsPacked16FieldOrder(gl)) return std::nullopt; - // The mitigation is a knob (MOBILEGL_WIDEN_PACKED16_STORAGE), so the row consults + // The mitigation is a knob (MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE), so the row consults // it: under ForceOff - the documented negative control - the corruption is // replayed verbatim, and a hardcoded "Fixed" would be exactly the kind of // reassurance this file exists to refuse. Auto and ForceOn both widen once this @@ -2433,12 +2433,12 @@ namespace MobileGL::MG_Util::SelfTest { "already holds and the client word round-trips through exactly), so no " "16-bit packed image is left for a copy to disagree about, at twice the " "memory for images of those formats; override with " - "MOBILEGL_WIDEN_PACKED16_STORAGE"; + "MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE"; return DriverBugFinding{ "glCopyImageSubData mirrors 16-bit packed texels between differently-laid-out images", DriverBugVerdict::Fixed, detail}; } - detail += "MOBILEGL_WIDEN_PACKED16_STORAGE=0 keeps the native narrow storage, so such " + detail += "MOBILEGL_ESPRYT_WIDEN_PACKED16_STORAGE=0 keeps the native narrow storage, so such " "copies are left exactly as the driver delivers them, mirrored words included"; return DriverBugFinding{ "glCopyImageSubData mirrors 16-bit packed texels between differently-laid-out images", diff --git a/MobileGL/MG_Util/SelfTest/DriverPost.cpp b/MobileGL/MG_Util/SelfTest/DriverPost.cpp index fdca43d4..c7026f72 100644 --- a/MobileGL/MG_Util/SelfTest/DriverPost.cpp +++ b/MobileGL/MG_Util/SelfTest/DriverPost.cpp @@ -1557,7 +1557,7 @@ namespace MobileGL::MG_Util::SelfTest { // Native iterationRP compute witness. This deliberately uses a separate // throwaway Vulkan device rather than the real renderer's queues, and it - // treats MOBILEGL_DISABLE_SUBGROUP as irrelevant: the row reports what the + // treats MOBILEGL_MAGMA_DISABLE_SUBGROUP as irrelevant: the row reports what the // driver does, not what MobileGL elects to advertise to applications. void ProbeVulkanIterationRPWitness(ReportBuilder& builder, PFN_vkGetInstanceProcAddr getInstanceProcAddr, VkInstance instance, VkPhysicalDevice physicalDevice, diff --git a/README.md b/README.md index 9b75e6dd..7c38f274 100644 --- a/README.md +++ b/README.md @@ -157,12 +157,12 @@ MobileGL supports runtime configuration via environment variables. |-------------------------|--------------------------------------------------|--------------------------------------|----------------| | `MOBILEGL_BACKEND_TYPE` | Select active backend implementation at startup. | `DirectGLES`, `DirectVulkan` | `DirectGLES` | | `MOBILEGL_DISABLE_TIMERQUERY` | Disable GPU timer-query exposure and use. | `0`, `1` | `0` | -| `MOBILEGL_USE_ANGLE` | Load ANGLE EGL/GLES libraries. | `0`, `1` | `0` | -| `MOBILEGL_DISABLE_SUBGROUP` | Disable Vulkan shader subgroup support. | `0`, `1` | `0` | +| `MOBILEGL_ESPRYT_USE_ANGLE` | Load ANGLE EGL/GLES libraries. | `0`, `1` | `0` | +| `MOBILEGL_MAGMA_DISABLE_SUBGROUP` | Disable Vulkan shader subgroup support. | `0`, `1` | `0` | | `MOBILEGL_ADVERTISE_FP64` | Advertise `GL_ARB_gpu_shader_fp64`. GLSL `double`/`dvec`/`dmat` compile and run either way - they are narrowed to 32 bits - so this only changes whether an application is told it has 64-bit precision, which it does not. | `0`, `1` | `0` | | `MOBILEGL_MAGMA_R11G11B10F_FALLBACK` | Use Magma's R11G11B10F format fallback. | `0`, `1` | `0` | | `MOBILEGL_MAGMA_FRAMESINFLIGHT` | Set Magma frames in flight. | Integer `1`–`64` | `3` | -| `MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER` | Avoid sampler mipmap minification filters. | `0`, `1` | `0` | +| `MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER` | Avoid sampler mipmap minification filters. | `0`, `1` | `0` | | `MOBILEGL_COHERENT_AS_FLUSH` | Treat persistent `GL_MAP_FLUSH_EXPLICIT_BIT` maps as coherent (app-compat for engines like Flywheel that never flush them). | `0`, `1` | `0` | | `MOBILEGL_ESPRYT_FORCE_DS_READBACK_EMULATION` | Always emulate depth/stencil `glReadPixels`/`glGetTexImage` by shader sampling on Espryt, instead of using the driver's own depth/stencil readback where it has one. | `0`, `1` | `0` | | `VK_ICD_FILENAMES` | Select the Vulkan ICD used by the Vulkan loader. | Path to an ICD JSON file | Loader default | diff --git a/android-plugin/TRACE_REPLAY.md b/android-plugin/TRACE_REPLAY.md index 696831e5..5fa25313 100644 --- a/android-plugin/TRACE_REPLAY.md +++ b/android-plugin/TRACE_REPLAY.md @@ -51,7 +51,7 @@ Implementation notes: - `DirectGLES` and `DirectVulkan` replay on the Activity `SurfaceView` by default. DirectGLES can still use the old offscreen EGL pbuffer path by passing `use_pbuffer=true`. - Golden comparison is implemented in native C++ with libpng RGBA decode and SSIM validation. The Java Activity only passes arguments and displays the native result, so the replay/compare core is not tied to Android UI or Bitmap APIs and can be ported to Linux. - The plugin profile still excludes `libtrace_replay_runner.so`; normal plugin APK behavior is preserved. -- Set `MOBILEGL_USE_ANGLE=1` and `MOBILEGL_TRACE_ANGLE_VARIANT=` when running `trace-replay-ci.sh` for DirectGLES. The trace APK contains both allowlisted ANGLE builds with short-hash filenames and SONAMEs; MobileGL resolves its signed native library directory and loads the selected pair by absolute path. Set `MOBILEGL_RETRACE_USE_PBUFFER=1` or pass `--use-pbuffer` to keep DirectGLES offscreen. +- Set `MOBILEGL_ESPRYT_USE_ANGLE=1` and `MOBILEGL_TRACE_ANGLE_VARIANT=` when running `trace-replay-ci.sh` for DirectGLES. The trace APK contains both allowlisted ANGLE builds with short-hash filenames and SONAMEs; MobileGL resolves its signed native library directory and loads the selected pair by absolute path. Set `MOBILEGL_RETRACE_USE_PBUFFER=1` or pass `--use-pbuffer` to keep DirectGLES offscreen. Example core-profile trace smoke command for a debug trace APK: diff --git a/android-plugin/app/build.gradle.kts b/android-plugin/app/build.gradle.kts index e5305d9e..c10faf3b 100644 --- a/android-plugin/app/build.gradle.kts +++ b/android-plugin/app/build.gradle.kts @@ -89,13 +89,13 @@ val pluginRendererConfig = buildJsonValue { items = RendererConfig.EnvItems("DirectGLES", listOf("DirectVulkan")), ) toggleable("MOBILEGL_DISABLE_TIMERQUERY", "1", false, RendererConfig.MetaString("mobilegl_disable_timerquery_title")) - toggleable("MOBILEGL_DISABLE_SUBGROUP", "1", false, RendererConfig.MetaString("mobilegl_disable_subgroup_title")) + toggleable("MOBILEGL_MAGMA_DISABLE_SUBGROUP", "1", false, RendererConfig.MetaString("mobilegl_disable_subgroup_title")) toggleable("MOBILEGL_MAGMA_R11G11B10F_FALLBACK", "1", false, RendererConfig.MetaString("mobilegl_magma_r11g11b10f_fallback_title")) customizable("MOBILEGL_MAGMA_FRAMESINFLIGHT", "3", RendererConfig.MetaString("mobilegl_magma_frames_inflight_title")) - toggleable("MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER", "1", false, RendererConfig.MetaString("mobilegl_avoid_sampler_mipmap_min_filter_title")) + toggleable("MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER", "1", false, RendererConfig.MetaString("mobilegl_avoid_sampler_mipmap_min_filter_title")) toggleable("MOBILEGL_COHERENT_AS_FLUSH", "1", false, RendererConfig.MetaString("mobilegl_coherent_as_flush_title")) toggleable("MOBILEGL_RELAXED_SEMANTICS", "1", false, RendererConfig.MetaString("mobilegl_relaxed_semantics_title")) - toggleable("MOBILEGL_USE_ANGLE", "1", false, RendererConfig.MetaString("mobilegl_use_angle_title")) + toggleable("MOBILEGL_ESPRYT_USE_ANGLE", "1", false, RendererConfig.MetaString("mobilegl_use_angle_title")) }, minMCVer = null, maxMCVer = null, 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 da7e51ce..41667758 100644 --- a/android-plugin/app/src/trace/cpp/trace_replay_core.cpp +++ b/android-plugin/app/src/trace/cpp/trace_replay_core.cpp @@ -88,7 +88,7 @@ bool UseAngleForRequest(const Request& request) { if (request.useAngle) { return true; } - const char* value = getenv("MOBILEGL_USE_ANGLE"); + const char* value = getenv("MOBILEGL_ESPRYT_USE_ANGLE"); return value != nullptr && strcmp(value, "1") == 0; } @@ -146,21 +146,21 @@ bool LoadMobileGL(const Request& request, std::string& error) { unsetenv("MOBILEGL_MAGMA_R11G11B10F_FALLBACK"); } if (UseAngleForRequest(request)) { - setenv("MOBILEGL_USE_ANGLE", "1", 1); + setenv("MOBILEGL_ESPRYT_USE_ANGLE", "1", 1); setenv("MOBILEGL_TRACE_ANGLE_VARIANT", request.angleVariant.c_str(), 1); } else { - unsetenv("MOBILEGL_USE_ANGLE"); + unsetenv("MOBILEGL_ESPRYT_USE_ANGLE"); unsetenv("MOBILEGL_TRACE_ANGLE_VARIANT"); } if (request.avoidAngleLlvmpipeSamplerMipmapMinFilter) { - setenv("MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER", "1", 1); + setenv("MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER", "1", 1); } else { - unsetenv("MOBILEGL_AVOID_SAMPLER_MIPMAP_MIN_FILTER"); + unsetenv("MOBILEGL_ESPRYT_AVOID_SAMPLER_MIPMAP_MIN_FILTER"); } if (request.avoidAngleLlvmpipeExplicitLodBias) { - setenv("MOBILEGL_AVOID_EXPLICIT_LOD_BIAS", "1", 1); + setenv("MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS", "1", 1); } else { - unsetenv("MOBILEGL_AVOID_EXPLICIT_LOD_BIAS"); + unsetenv("MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS"); } if (request.coherentAsFlush) { setenv("MOBILEGL_COHERENT_AS_FLUSH", "1", 1); @@ -168,19 +168,19 @@ bool LoadMobileGL(const Request& request, std::string& error) { unsetenv("MOBILEGL_COHERENT_AS_FLUSH"); } if (request.fixIterationRPSubgroupScratch) { - setenv("MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH", "1", 1); + setenv("MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH", "1", 1); } else { - unsetenv("MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); + unsetenv("MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); } if (request.deriveNumSubgroups) { - setenv("MOBILEGL_DERIVE_NUM_SUBGROUPS", "1", 1); + setenv("MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS", "1", 1); } else { - unsetenv("MOBILEGL_DERIVE_NUM_SUBGROUPS"); + unsetenv("MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS"); } if (request.iterationRPFixBarrier) { - setenv("MOBILEGL_ITERATIONRP_FIX_BARRIER", "1", 1); + setenv("MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER", "1", 1); } else { - unsetenv("MOBILEGL_ITERATIONRP_FIX_BARRIER"); + unsetenv("MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER"); } if (request.fboAttachmentDumps.empty()) { unsetenv("MOBILEGL_TRACE_DUMP_FBO_ATTACHMENTS"); diff --git a/android-plugin/trace-replay-ci.sh b/android-plugin/trace-replay-ci.sh index d5119dfe..40135dd5 100644 --- a/android-plugin/trace-replay-ci.sh +++ b/android-plugin/trace-replay-ci.sh @@ -38,20 +38,20 @@ Usage: [--reuse-fixture] \ --timeout-seconds N -Set MOBILEGL_USE_ANGLE=1 to run DirectGLES replay with packaged ANGLE +Set MOBILEGL_ESPRYT_USE_ANGLE=1 to run DirectGLES replay with packaged ANGLE instead of the device system GLES driver. Set MOBILEGL_TRACE_ANGLE_VARIANT to the packaged ANGLE short hash used by DirectGLES replay. Set MOBILEGL_RETRACE_USE_PBUFFER=1 or pass --use-pbuffer to run DirectGLES against an offscreen EGL pbuffer instead of the Activity surface. -Set MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1, -MOBILEGL_DERIVE_NUM_SUBGROUPS=1, and MOBILEGL_ITERATIONRP_FIX_BARRIER=1 to +Set MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH=1, +MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS=1, and MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER=1 to forward the corresponding iterationRP SPIR-V repairs into the APK process. Pass --avoid-angle-llvmpipe-sampler-mipmap-min-filter for DirectGLES traces that need ANGLE llvmpipe sampler mipmap filters downgraded to avoid driver stalls. Pass --avoid-angle-llvmpipe-explicit-lod-bias for DirectGLES traces whose shaders sample with an explicit LOD that ANGLE llvmpipe cannot take a LOD bias on -(MOBILEGL_AVOID_EXPLICIT_LOD_BIAS=1). +(MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS=1). Pass --coherent-as-flush for traces whose engine writes persistent GL_MAP_FLUSH_EXPLICIT_BIT maps it never flushes (MOBILEGL_COHERENT_AS_FLUSH=1). Pass --benchmark to replay the whole trace as a frame-timing benchmark instead of @@ -348,7 +348,7 @@ run_retrace() { if [ -n "${alternate_golden_path}" ]; then alternate_golden_app_path="${app_dir}/input/alternate-golden.png" fi - if [ "${MOBILEGL_USE_ANGLE:-}" = "1" ] && [ "${backend}" = "DirectGLES" ]; then + if [ "${MOBILEGL_ESPRYT_USE_ANGLE:-}" = "1" ] && [ "${backend}" = "DirectGLES" ]; then use_angle=1 test -n "${MOBILEGL_TRACE_ANGLE_VARIANT:-}" || die "MOBILEGL_TRACE_ANGLE_VARIANT is required for DirectGLES ANGLE replay" fi @@ -388,13 +388,13 @@ run_retrace() { if [ "${coherent_as_flush}" -eq 1 ]; then set -- "$@" --ez coherent_as_flush true fi - if [ "${MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH:-}" = "1" ]; then + if [ "${MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH:-}" = "1" ]; then set -- "$@" --ez fix_iterationrp_subgroup_scratch true fi - if [ "${MOBILEGL_DERIVE_NUM_SUBGROUPS:-}" = "1" ]; then + if [ "${MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS:-}" = "1" ]; then set -- "$@" --ez derive_num_subgroups true fi - if [ "${MOBILEGL_ITERATIONRP_FIX_BARRIER:-}" = "1" ]; then + if [ "${MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER:-}" = "1" ]; then set -- "$@" --ez iterationrp_fix_barrier true fi if [ -n "${texture_2d_dumps}" ]; then diff --git a/tools/piglit-android/run_piglit_android.py b/tools/piglit-android/run_piglit_android.py index 432dc02d..9640dbaa 100644 --- a/tools/piglit-android/run_piglit_android.py +++ b/tools/piglit-android/run_piglit_android.py @@ -118,7 +118,7 @@ def backend_env(backend, device_dir, use_angle=False): 'MOBILEGL_LOG_FILE_PATH': f'{device_dir}/mobilegl.log', } if backend == 'DirectGLES': - env['MOBILEGL_USE_ANGLE'] = '1' if use_angle else '0' + env['MOBILEGL_ESPRYT_USE_ANGLE'] = '1' if use_angle else '0' if backend == 'DirectVulkan': # The device ICD usually lacks VK_EXT_headless_surface, which the # MobileGL pbuffer path needs; use a real ANativeWindow from diff --git a/tools/trace_replay/README.md b/tools/trace_replay/README.md index a3856227..d36d0fa5 100644 --- a/tools/trace_replay/README.md +++ b/tools/trace_replay/README.md @@ -284,7 +284,7 @@ unflushed persistent maps, e.g. the Create fixtures), pass `MOBILEGL_COHERENT_AS_FLUSH=1`. For cases registered with `avoid_angle_llvmpipe_explicit_lod_bias` (DirectGLES on ANGLE llvmpipe, e.g. the sundial-lite fixture), pass `--ez avoid_angle_llvmpipe_explicit_lod_bias true` so -the replay runs with `MOBILEGL_AVOID_EXPLICIT_LOD_BIAS=1`. +the replay runs with `MOBILEGL_ESPRYT_AVOID_EXPLICIT_LOD_BIAS=1`. ## Benchmark mode (frame timing) @@ -380,7 +380,7 @@ ln -sf $ANGLE/libEGL.so libEGL.so ln -sf $ANGLE/libGLESv2.so libGLESv2.so ln -sf $ANGLE/libvulkan.so.1 libvulkan.so.1 # else eglInitialize fails -MOBILEGL_USE_ANGLE=1 \ +MOBILEGL_ESPRYT_USE_ANGLE=1 \ LD_LIBRARY_PATH=~/angle-farm:/path/to/build/ \ VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.json \ ANGLE_DEFAULT_PLATFORM=vulkan \ diff --git a/tools/trace_replay/run_android_retrace_local.py b/tools/trace_replay/run_android_retrace_local.py index 51a8cd24..40ded0b5 100644 --- a/tools/trace_replay/run_android_retrace_local.py +++ b/tools/trace_replay/run_android_retrace_local.py @@ -193,12 +193,12 @@ def run_case(case, backend, extra_args=None, timeout_seconds=None): env["PYTHON"] = "python" env["MSYS2_ARG_CONV_EXCL"] = "/data/*" if backend_info["use_angle"]: - env["MOBILEGL_USE_ANGLE"] = "1" + env["MOBILEGL_ESPRYT_USE_ANGLE"] = "1" env["MOBILEGL_TRACE_ANGLE_VARIANT"] = ( BLISS_ANGLE_VARIANT if case["name"] == BLISS_CASE else DEFAULT_ANGLE_VARIANT ) else: - env.pop("MOBILEGL_USE_ANGLE", None) + env.pop("MOBILEGL_ESPRYT_USE_ANGLE", None) env.pop("MOBILEGL_TRACE_ANGLE_VARIANT", None) result = subprocess.run(command, cwd=ROOT, env=env) copy_goldens(case, backend) diff --git a/tools/trace_replay/skills/trace-fixture-authoring/SKILL.md b/tools/trace_replay/skills/trace-fixture-authoring/SKILL.md index f5fc5b52..4276cc6c 100644 --- a/tools/trace_replay/skills/trace-fixture-authoring/SKILL.md +++ b/tools/trace_replay/skills/trace-fixture-authoring/SKILL.md @@ -489,7 +489,7 @@ uninstall that one package first or the install fails with `INSTALL_FAILED_UPDATE_INCOMPATIBLE`. Match the CI environment (`.github/workflows/apk.yml` matrix): the emulator -boots with `--gpu software` + `MOBILEGL_USE_ANGLE=1` for `DirectGLES` +boots with `--gpu software` + `MOBILEGL_ESPRYT_USE_ANGLE=1` for `DirectGLES` and `--gpu lavapipe` + `MOBILEGL_MAGMA_R11G11B10F_FALLBACK=1` for `DirectVulkan`. The emulator's ANGLE-on-Vulkan GLES stack exercises genuinely different driver semantics than physical devices (e.g. indirect-draw diff --git a/tools/trace_replay/trace_replay_cli.cpp b/tools/trace_replay/trace_replay_cli.cpp index d5a05b78..73f1d0e6 100644 --- a/tools/trace_replay/trace_replay_cli.cpp +++ b/tools/trace_replay/trace_replay_cli.cpp @@ -105,9 +105,9 @@ bool MatchOption(const std::string &arg, const char *name, std::string &inlineVa bool ParseArgs(int argc, char **argv, mobilegl_trace::Request &request) { request.backend = "DirectGLES"; - request.fixIterationRPSubgroupScratch = ReadEnvFlag("MOBILEGL_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); - request.deriveNumSubgroups = ReadEnvFlag("MOBILEGL_DERIVE_NUM_SUBGROUPS"); - request.iterationRPFixBarrier = ReadEnvFlag("MOBILEGL_ITERATIONRP_FIX_BARRIER"); + request.fixIterationRPSubgroupScratch = ReadEnvFlag("MOBILEGL_MAGMA_FIX_ITERATIONRP_SUBGROUP_SCRATCH"); + request.deriveNumSubgroups = ReadEnvFlag("MOBILEGL_MAGMA_DERIVE_NUM_SUBGROUPS"); + request.iterationRPFixBarrier = ReadEnvFlag("MOBILEGL_MAGMA_ITERATIONRP_FIX_BARRIER"); for (int i = 1; i < argc; ++i) { const std::string arg = argv[i];