diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 4d15e311..d8cb80e8 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -209,7 +209,7 @@ jobs: - name: Load trace cases id: trace-cases run: | - echo "android=$(python3 tools/trace_replay/trace_cases.py --ci --format github-apk)" >> "$GITHUB_OUTPUT" + echo "android=$(python3 tools/trace_replay/trace_cases.py --ci --format github-apk-matrix)" >> "$GITHUB_OUTPUT" echo "names=$(python3 tools/trace_replay/trace_cases.py --ci --format names)" >> "$GITHUB_OUTPUT" trace-fixtures: @@ -337,13 +337,7 @@ jobs: strategy: fail-fast: false max-parallel: 4 - matrix: - backend: - - name: DirectGLES - gpu: software - - name: DirectVulkan - gpu: lavapipe - case: ${{ fromJSON(needs.trace-cases.outputs.android) }} + matrix: ${{ fromJSON(needs.trace-cases.outputs.android) }} steps: - name: Set Swap Space uses: pierotofy/set-swap-space@v1.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 75e78805..c325393c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -491,6 +491,7 @@ jobs: - benchmark - integration outputs: + matrix: ${{ steps.trace-cases.outputs.matrix }} names: ${{ steps.trace-cases.outputs.names }} steps: - name: Checkout repo @@ -498,7 +499,9 @@ jobs: - name: Load trace cases id: trace-cases - run: echo "names=$(python3 tools/trace_replay/trace_cases.py --ci --format names)" >> "$GITHUB_OUTPUT" + run: | + echo "matrix=$(python3 tools/trace_replay/trace_cases.py --ci --format github-test-matrix)" >> "$GITHUB_OUTPUT" + echo "names=$(python3 tools/trace_replay/trace_cases.py --ci --format names)" >> "$GITHUB_OUTPUT" trace-fixtures: name: trace fixture (${{ matrix.case }}) @@ -577,11 +580,7 @@ jobs: strategy: fail-fast: false max-parallel: 4 - matrix: - backend: - - DirectGLES - - DirectVulkan - case: ${{ fromJSON(needs.trace-cases.outputs.names) }} + matrix: ${{ fromJSON(needs.trace-cases.outputs.matrix) }} steps: - name: Set Swap Space diff --git a/tools/trace_replay/trace_cases.json b/tools/trace_replay/trace_cases.json index ae452409..5c65965c 100644 --- a/tools/trace_replay/trace_cases.json +++ b/tools/trace_replay/trace_cases.json @@ -277,7 +277,9 @@ }, { "name": "minecraft-1.21.4-fabric-iris-iterationrp-in-world", - "ci": false, + "ci_backends": [ + "DirectVulkan" + ], "trace_archive": "minecraft-1.21.4-fabric-iris-iterationrp-in-world.tgz", "golden": "minecraft-1.21.4-fabric-iris-iterationrp-in-world.0000202020.png", "target_call": 202020, diff --git a/tools/trace_replay/trace_cases.py b/tools/trace_replay/trace_cases.py index 0d225d8a..3cdf0ac1 100644 --- a/tools/trace_replay/trace_cases.py +++ b/tools/trace_replay/trace_cases.py @@ -6,6 +6,7 @@ from pathlib import Path TRACE_CASES_JSON = Path(__file__).with_name("trace_cases.json") +CI_BACKENDS = ("DirectGLES", "DirectVulkan") def load_trace_case_manifest(path=TRACE_CASES_JSON): @@ -71,6 +72,46 @@ def ci_trace_cases(cases): return [case for case in cases if case.get("ci", True)] +def ci_backends(case): + backends = case.get("ci_backends") + if backends is None: + return CI_BACKENDS + if not isinstance(backends, list) or not backends: + raise ValueError(f"ci_backends must be a non-empty list for {case['name']}") + unknown = [backend for backend in backends if backend not in CI_BACKENDS] + if unknown: + raise ValueError( + f"unknown ci_backends for {case['name']}: {', '.join(unknown)}" + ) + if len(set(backends)) != len(backends): + raise ValueError(f"ci_backends contains duplicates for {case['name']}") + return backends + + +def github_test_matrix(cases): + return { + "include": [ + {"backend": backend, "case": case["name"]} + for case in cases + for backend in ci_backends(case) + ] + } + + +def github_apk_matrix(cases): + backends = { + "DirectGLES": {"name": "DirectGLES", "gpu": "software"}, + "DirectVulkan": {"name": "DirectVulkan", "gpu": "lavapipe"}, + } + return { + "include": [ + {"backend": backends[backend], "case": github_apk_case(case)} + for case in cases + for backend in ci_backends(case) + ] + } + + def cmake_quote(value): return '"' + str(value).replace("\\", "/").replace('"', '\\"') + '"' @@ -114,7 +155,14 @@ def parse_args(): parser.add_argument("--fixture-root", default="tools/trace_replay/fixtures") parser.add_argument( "--format", - choices=("names", "github-apk", "fixture-files", "cmake"), + choices=( + "names", + "github-test-matrix", + "github-apk", + "github-apk-matrix", + "fixture-files", + "cmake", + ), default="names", ) return parser.parse_args() @@ -127,8 +175,12 @@ def main(): cases = ci_trace_cases(cases) if args.format == "names": print(json.dumps([case["name"] for case in cases], separators=(",", ":"))) + elif args.format == "github-test-matrix": + print(json.dumps(github_test_matrix(cases), separators=(",", ":"))) elif args.format == "github-apk": print(json.dumps([github_apk_case(case) for case in cases], separators=(",", ":"))) + elif args.format == "github-apk-matrix": + print(json.dumps(github_apk_matrix(cases), separators=(",", ":"))) elif args.format == "fixture-files": if not args.case_name: print("--case is required for --format fixture-files", file=sys.stderr)