name: Test on: push: branches: - dev - Feat/Backend-Direct-GLES - Feat/Backend-Direct-Vulkan workflow_dispatch: jobs: build-linux: runs-on: ubuntu-latest env: BUILD_DIR: build-linux CCACHE_BASEDIR: ${{ github.workspace }} CCACHE_COMPRESS: "true" CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_MAXSIZE: 4G CCACHE_NOHASHDIR: "true" steps: - name: Set Swap Space uses: pierotofy/set-swap-space@master with: swap-size-gb: 32 - name: Checkout repo uses: actions/checkout@v4 with: submodules: recursive - name: Get CMake uses: lukka/get-cmake@latest - name: Restore ccache uses: actions/cache@v4 with: path: .ccache key: ${{ runner.os }}-test-${{ github.job }}-ccache-${{ github.ref_name }}-${{ github.run_id }} restore-keys: | ${{ runner.os }}-test-${{ github.job }}-ccache-${{ github.ref_name }}- ${{ runner.os }}-test-${{ github.job }}-ccache- - name: Prepare Vulkan SDK uses: humbletim/setup-vulkan-sdk@v1.2.1 with: vulkan-query-version: 1.4.304.1 vulkan-components: Vulkan-Headers, Vulkan-Loader vulkan-use-cache: true - name: Update glslang external sources working-directory: 3rdparty/glslang run: python update_glslang_sources.py - name: Install build dependencies run: | sudo apt-get update sudo apt-get install -y ccache clang-20 clang++-20 lld-20 libc++-20-dev libc++abi-20-dev libvulkan-dev libegl1-mesa-dev libgles2-mesa-dev libgl1-mesa-dri mesa-vulkan-drivers ninja-build - name: Show installed toolchain run: | ccache --version clang-20 --version clang++-20 --version ld.lld-20 --version || ld.lld --version || true dpkg -l 'libc++*' 'libegl*' 'libgles*' 'mesa*' 'vulkan*' || true - name: Configure CMake run: | if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then BUILD_TYPE=Debug else BUILD_TYPE=Release fi cmake -S . -B "${BUILD_DIR}" -G Ninja \ -DCMAKE_C_COMPILER=clang-20 \ -DCMAKE_CXX_COMPILER=clang++-20 \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \ -DMOBILEGL_BUILD_TEST=ON \ -DMOBILEGL_BUILD_BENCHMARK=ON \ -DMOBILEGL_BUILD_TRACE_REPLAY=OFF \ -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON \ -DBENCHMARK_ENABLE_TESTING=OFF \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - name: Build run: cmake --build "${BUILD_DIR}" --parallel "$(nproc)" - name: Show ccache stats if: always() run: ccache --show-stats - name: Package Linux runtime run: | mkdir -p ci-artifacts mapfile -t SHARED_LIBS < <(find "${BUILD_DIR}" -type f \( -name '*.so' -o -name '*.so.*' \) -print | sort) tar \ --exclude='*/CMakeFiles' \ --exclude='*.o' \ --exclude='*.a' \ --exclude='*.ninja*' \ --exclude='build.ninja' \ --exclude='cmake_install.cmake' \ -czf ci-artifacts/mobilegl-linux-runtime.tgz \ "${BUILD_DIR}/MobileGL/MG_Test" \ "${BUILD_DIR}/MobileGL/MG_Benchmark" \ "${SHARED_LIBS[@]}" - name: Upload Linux runtime uses: actions/upload-artifact@v4 with: name: mobilegl-linux-runtime path: ci-artifacts/mobilegl-linux-runtime.tgz if-no-files-found: error test: runs-on: ubuntu-latest needs: build-linux steps: - name: Checkout repo uses: actions/checkout@v4 - name: Get CMake uses: lukka/get-cmake@latest - name: Install runtime dependencies run: | sudo apt-get update sudo apt-get install -y libvulkan1 libegl1 libgles2 libgl1-mesa-dri mesa-vulkan-drivers - name: Download Linux runtime uses: actions/download-artifact@v4 with: name: mobilegl-linux-runtime path: . - name: Unpack Linux runtime run: tar -xzf mobilegl-linux-runtime.tgz - name: Normalize CTest command paths run: | python - <<'PY' from pathlib import Path import re for path in Path('build-linux').rglob('CTestTestfile.cmake'): text = path.read_text() text = re.sub(r'"[^"]*/cmake-[^"]*/bin/cmake"', '"cmake"', text) path.write_text(text) PY - name: Test working-directory: build-linux/MobileGL/MG_Test run: | if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then ctest -V else ctest --output-on-failure fi benchmark: runs-on: ubuntu-latest needs: build-linux steps: - name: Checkout repo uses: actions/checkout@v4 - name: Get CMake uses: lukka/get-cmake@latest - name: Install runtime dependencies run: | sudo apt-get update sudo apt-get install -y libvulkan1 libegl1 libgles2 libgl1-mesa-dri mesa-vulkan-drivers - name: Download Linux runtime uses: actions/download-artifact@v4 with: name: mobilegl-linux-runtime path: . - name: Unpack Linux runtime run: tar -xzf mobilegl-linux-runtime.tgz - name: Normalize CTest command paths run: | python - <<'PY' from pathlib import Path import re for path in Path('build-linux').rglob('CTestTestfile.cmake'): text = path.read_text() text = re.sub(r'"[^"]*/cmake-[^"]*/bin/cmake"', '"cmake"', text) path.write_text(text) PY - name: Benchmark working-directory: build-linux/MobileGL/MG_Benchmark run: ctest -V -C Release build-retrace: runs-on: ubuntu-latest needs: - build-linux - test - benchmark env: BUILD_DIR: build-retrace CCACHE_BASEDIR: ${{ github.workspace }} CCACHE_COMPRESS: "true" CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_MAXSIZE: 4G CCACHE_NOHASHDIR: "true" MOBILEGL_LIBRARY: ${{ github.workspace }}/build-linux/libMobileGL.so steps: - name: Set Swap Space uses: pierotofy/set-swap-space@master with: swap-size-gb: 32 - name: Checkout repo uses: actions/checkout@v4 with: submodules: recursive - name: Get CMake uses: lukka/get-cmake@latest - name: Restore ccache uses: actions/cache@v4 with: path: .ccache key: ${{ runner.os }}-test-${{ github.job }}-ccache-${{ github.ref_name }}-${{ github.run_id }} restore-keys: | ${{ runner.os }}-test-${{ github.job }}-ccache-${{ github.ref_name }}- ${{ runner.os }}-test-${{ github.job }}-ccache- - name: Prepare Vulkan SDK uses: humbletim/setup-vulkan-sdk@v1.2.1 with: vulkan-query-version: 1.4.304.1 vulkan-components: Vulkan-Headers, Vulkan-Loader vulkan-use-cache: true - name: Update glslang external sources working-directory: 3rdparty/glslang run: python update_glslang_sources.py - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y ccache clang-20 clang++-20 lld-20 libc++-20-dev libc++abi-20-dev libvulkan-dev libegl1-mesa-dev libgles2-mesa-dev libgl1-mesa-dri mesa-vulkan-drivers ninja-build - name: Show installed toolchain run: | ccache --version clang-20 --version clang++-20 --version ld.lld-20 --version || ld.lld --version || true dpkg -l 'libc++*' 'libegl*' 'libgles*' 'mesa*' 'vulkan*' || true - name: Download Linux runtime uses: actions/download-artifact@v4 with: name: mobilegl-linux-runtime path: . - name: Unpack Linux runtime run: | tar -xzf mobilegl-linux-runtime.tgz test -f "${MOBILEGL_LIBRARY}" - name: Configure CMake run: | if [ "${{ secrets.ACTIONS_STEP_DEBUG }}" = "true" ]; then BUILD_TYPE=Debug else BUILD_TYPE=Release fi cmake -S . -B "${BUILD_DIR}" -G Ninja \ -DCMAKE_C_COMPILER=clang-20 \ -DCMAKE_CXX_COMPILER=clang++-20 \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ -DMOBILEGL_LOG_ACTIVE_LEVEL=MOBILEGL_LOG_LEVEL_INFO \ -DMOBILEGL_BUILD_TEST=OFF \ -DMOBILEGL_BUILD_BENCHMARK=OFF \ -DMOBILEGL_BUILD_TRACE_REPLAY=ON \ -DMOBILEGL_TRACE_REPLAY_MOBILEGL_LIBRARY="${MOBILEGL_LIBRARY}" \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 - name: Build trace replay run: cmake --build "${BUILD_DIR}" --target mobilegl_trace_replay --parallel "$(nproc)" - name: Show ccache stats if: always() run: ccache --show-stats - name: Normalize CTest command paths run: | python - <<'PY' from pathlib import Path import re for path in Path('build-retrace').rglob('CTestTestfile.cmake'): text = path.read_text() text = re.sub(r'"[^"]*/cmake-[^"]*/bin/cmake"', '"cmake"', text) path.write_text(text) PY - name: Package trace replay run: | mkdir -p ci-artifacts tar -czf ci-artifacts/mobilegl-trace-replay.tgz \ build-retrace/tools/trace_replay/mobilegl_trace_replay \ build-retrace/tools/trace_replay/CTestTestfile.cmake - name: Upload trace replay uses: actions/upload-artifact@v4 with: name: mobilegl-trace-replay path: ci-artifacts/mobilegl-trace-replay.tgz if-no-files-found: error trace-cases: name: trace case matrix runs-on: ubuntu-latest needs: - test - benchmark outputs: names: ${{ steps.trace-cases.outputs.names }} steps: - name: Checkout repo uses: actions/checkout@v4 - name: Load trace cases id: trace-cases run: echo "names=$(python3 tools/trace_replay/trace_cases.py --format names)" >> "$GITHUB_OUTPUT" trace-fixtures: name: trace fixture (${{ matrix.case }}) runs-on: ubuntu-latest needs: trace-cases strategy: fail-fast: false max-parallel: 4 matrix: case: ${{ fromJSON(needs.trace-cases.outputs.names) }} steps: - name: Checkout repo uses: actions/checkout@v4 - name: Fetch trace fixture run: bash .github/scripts/fetch-trace-fixture-lfs.sh '${{ matrix.case }}' - name: Stage trace fixture run: | safe_case="$(printf '%s' '${{ matrix.case }}' | sed 's/[^A-Za-z0-9._-]/_/g')" stage_dir="trace-fixtures/${safe_case}" mkdir -p "${stage_dir}" python3 tools/trace_replay/trace_cases.py --format fixture-files --case '${{ matrix.case }}' | while IFS= read -r file; do cp "${file}" "${stage_dir}/" done - name: Upload trace fixture uses: actions/upload-artifact@v4 with: name: trace-fixture-${{ matrix.case }} path: trace-fixtures/** if-no-files-found: error retrace: name: retrace (${{ matrix.backend }}, ${{ matrix.case }}) runs-on: ubuntu-latest needs: - build-linux - build-retrace - trace-cases - trace-fixtures if: ${{ always() && needs.build-linux.result == 'success' && needs.build-retrace.result == 'success' && needs.trace-cases.result == 'success' }} strategy: fail-fast: false max-parallel: 4 matrix: backend: - DirectGLES - DirectVulkan case: ${{ fromJSON(needs.trace-cases.outputs.names) }} steps: - name: Checkout repo uses: actions/checkout@v4 - name: Download trace fixture uses: actions/download-artifact@v4 with: name: trace-fixture-${{ matrix.case }} path: trace-fixture-download - name: Install trace fixture run: | mkdir -p tools/trace_replay/fixtures find trace-fixture-download -type f -exec cp {} tools/trace_replay/fixtures/ \; - name: Get CMake uses: lukka/get-cmake@latest - name: Install runtime dependencies run: | sudo apt-get update sudo apt-get install -y libvulkan1 libegl1-mesa-dev libgles2-mesa-dev libgl1-mesa-dri mesa-vulkan-drivers test -e /usr/lib/x86_64-linux-gnu/libEGL.so test -e /usr/lib/x86_64-linux-gnu/libGLESv2.so - name: Download Linux runtime uses: actions/download-artifact@v4 with: name: mobilegl-linux-runtime path: . - name: Download trace replay uses: actions/download-artifact@v4 with: name: mobilegl-trace-replay path: . - name: Unpack retrace runtime run: | tar -xzf mobilegl-linux-runtime.tgz tar -xzf mobilegl-trace-replay.tgz test -f build-linux/libMobileGL.so test -f build-retrace/tools/trace_replay/mobilegl_trace_replay - name: Retrace and validate working-directory: build-retrace/tools/trace_replay run: ctest -V --no-tests=error -R '^MobileGLTraceReplay\.${{ matrix.case }}\.${{ matrix.backend }}$' - name: Upload actual image if: always() uses: actions/upload-artifact@v4 with: name: retrace-result-${{ matrix.backend }}-${{ matrix.case }} path: | build-retrace/tools/trace_replay/${{ matrix.case }}/actual-images/** build-retrace/tools/trace_replay/${{ matrix.case }}/${{ matrix.backend }}/output/** if-no-files-found: warn retrace-summary: name: retrace summary runs-on: ubuntu-latest needs: retrace if: ${{ always() && needs.retrace.result != 'skipped' }} steps: - name: Checkout repo uses: actions/checkout@v4 - name: Set artifact metadata run: | echo "date_today=$(date +'%Y-%m-%d')" >> "$GITHUB_ENV" echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_ENV" - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Download retrace results uses: actions/download-artifact@v4 with: pattern: retrace-result-* path: retrace-artifacts - name: Render retrace summary run: | node tools/trace_replay/render_retrace_summary.mjs \ --input retrace-artifacts \ --output-dir retrace-summary \ --title "MobileGL Linux retrace overview" \ --group-label "Linux" \ --html mobilegl-linux-retrace-overview.html - name: Upload retrace summary uses: actions/upload-artifact@v7 with: path: retrace-summary/mobilegl-linux-retrace-overview.html archive: false if-no-files-found: error