Skip to content

perf(shader): validate vertex stage inputs without building them - #6611

Merged
adriadam10 merged 1 commit into
boykopovar:mainfrom
meh7an:perf/shader-validate-vertex-inputs
Oct 20, 2026
Merged

adriadam10 merged 1 commit into
boykopovar:mainfrom
meh7an:perf/shader-validate-vertex-inputs

Conversation

@meh7an

@meh7an meh7an commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

What

PreparedShaderInvocation::TryCreate and CaptureResources (with a source handle) check a vertex-family stage's inputs every time, for the V# fields their keys do not cover. They do it by building the stage's whole input info through RequestInputInfo and BuildShaderStageInputInfo, and use only its exceptions. For a vertex-family stage that build zeroes and fills a ShaderVertexInputInfo of about 10 KB, merges the vertex buffers and copies the tessellation and mesh configuration.

ValidateVertexStageInputs makes the build's vertex-family checks with the same errors, in the same order, and builds nothing:

  • the vertex context and the resource count;
  • the vertex buffer merge: record counts, and the attribute and buffer limits. An embedded fetch merges as the build does, with zeroed fields and fetch index 0;
  • the tessellation configuration (control points, domain, partitioning, topology, patches per group) and the mesh configuration (outputPrimitiveSize 2 or 3, provokingVertex below it). The build and the validation make these two checks through one helper each, _validateTessellation and _validateMesh, so they cannot drift apart.

ValidateRequestInputs uses it for the vertex family, and RequestInputInfo for any other stage. Both vertex-only call sites now use it. The other RequestInputInfo callers validate every stage once per request and are unchanged.

On the S2 page of Sonic Origins Plus's main menu, BuildShaderStageInputInfo cost the queue worker (APS5 sampler, 15 s, samples per frame), all of it through TryCreate:

  • without this change, in five runs: 0.36, 0.50, 0.42, 0.44 and 0.50;
  • with it, in three runs: 0.00. TryCreate went from 0.83 to 0.87 down to 0.45 to 0.52.

The claim is this saving only, about 1.2% of the worker's frame (34 to 37 samples). The frame times below move within run-to-run noise and show no gain.

RequestInputInfo computes a tessellation draw's instance patches by dividing by the input control points before the build checks that count. For an instanced draw with zero control points it divides by zero. The validation reads only the checked fields, so on these two paths that draw now gets the build's error instead.

The change is in the recompiler's sources, so the shader cache version changes with it.

Tested

Windows 11 (10.0.26300), WinLibs GCC 15.2.0 (UCRT), Release, NVIDIA GeForce RTX 2080 Ti, driver 617.14.

  • Rebased onto main 1d41645.
    • On that main, with this change, the full ctest suite passes 1740 of 1742.
      • agc_driver_image_array_window_past_layer_limit is not run: main does not compile ImageArrayWindowPastLayerLimit.cpp with MinGW (alignas(65536)).
      • agc_driver_pass_input_hazard (added in ba4571a) fails on plain main 1d41645 as well, 0 of 4 runs alone.
    • agc_vertex_input_validation now also runs nine mesh configurations over outputPrimitiveSize 0 to 4, with provokingVertex at and below it, 4095 cases in all (768 accepted).
      • For each of the nine it checks the expected verdict of both the build and the validation, so a check dropped from the shared helper fails the test as well.
      • With _validateMesh back at provokingVertex > 2u, the test fails on sizes 0, 1 and 4, and on size 2 with provoking vertex 2.
  • On main 5d9dcc4 with this change, the full ctest suite passes 1299 of 1301 tests.
  • Sonic Origins Plus, main menu, S2 page (the 3D background), 1233x694 window.
    • Captured with APS5_TRACE_SECONDS=200:15 on the same machine in one session, caches warm. Traces attached.
    • Baseline a0dd42c, this change 4e46e7e (the summaries name the commits before them, see the note):
Metric Baseline This PR Change
frame_ms.p50 112.276 119.277 +6.2%
frame_ms.p90 115.733 133.323 +15.2%
mean_frame_ms 113.900 121.598 +6.8%
gpu_busy_ms_per_present 83.003 84.702 +2.0%
Driver.Packet (ms per frame) 111.728 119.228 +6.7%
Driver.Draw (ms per frame) 99.869 106.006 +6.1%

This pair moved the other way, within the noise of a 15 s window: the four windows of the moving background I captured in that session read 112.3 to 119.3 ms at the median. The FPS shown in the title went from 9.53 to 9.58 (median of six readings), and a sampled pair taken an hour earlier went from 8.84 to 9.07.

Note: measuring base. These numbers come from my fork's dev, on main 0a56aaa. The code this change touches is the same on main 5d9dcc4, except that main also accepts tessellation partitioning 0 and 3; this PR's validation follows main.

Both carry these commits from my fork:

The comparison tool marks the window's first present as a configuration difference: the window opens 200 s into each run. Both summaries set trace_dropped, because the worker filled its event buffer at about 2,700 draws per frame. The phase totals above stay complete.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 2080 Ti, driver 617.14, Windows 11
  • AI-assisted: yes

Traces and summary lines (baseline a0dd42c, whose summary says e3b8d1c; this change 4e46e7e, whose summary says a0dd42c):
inputs-traces.zip

The two summary lines, with tools/trace_digest.py for each trace:

Baseline (summary commit e3b8d1c)

seconds 200:15 from present 2700: 132 presents, frame p50 112.3 / p90 115.7 / p99 146.1 / max 148.9 ms, GPU busy 83.0 ms per present
NVIDIA GeForce RTX 2080 Ti, NVIDIA 617.14, Windows 10.0.26300, 3840x2160, commit e3b8d1c (dirty), dropped: yes

{"commit":"e3b8d1c5245e","dirty":true,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"200:15"},"gpu":"NVIDIA GeForce RTX 2080 Ti","driver":"NVIDIA 617.14","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"seconds 200:15","first_present":2700,"ms":15034.755},"presents":132,"frame_ms":{"p50":112.276,"p90":115.733,"p99":146.087,"max":148.862},"gpu_busy_ms_per_present":83.003,"worker_busy_pct":{"queue worker 0x0":98.123},"top_phases_ms_per_frame":{"Driver.Packet":111.728,"Driver.Packet.draw":100.855,"Driver.Draw":99.869,"Driver.Draw.draw_and_resource_release":47.11,"Graphics.Draw":45.996,"Graphics.Draw.draw_and_resource_release":37.284,"Driver.Draw.shader_compile_and_link":36.217,"Driver.Present":33.118},"trace_dropped":true,"trace":"aps5-trace-e3b8d1c5245e-31932.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2757: 148.9 ms at 6496 ms: batch (gpu) 85.5, Driver.Present (presenter) 37.7, Driver.Present.render_fence_wait (presenter) 37.2, Vulkan.Retire (presenter) 37.2
  • present 2709: 146.1 ms at 1005 ms: Driver.Packet (queue worker 0x0) 137.5, Driver.Packet.draw (queue worker 0x0) 134.1, Driver.Draw (queue worker 0x0) 133.1, batch (gpu) 85.2
  • present 2799: 141.7 ms at 11270 ms: batch (gpu) 79.8, Driver.Present (presenter) 31.6, Driver.Present.render_fence_wait (presenter) 31.1, Vulkan.Retire (presenter) 31.1
  • present 2749: 132.9 ms at 5569 ms: batch (gpu) 82.2, Driver.Present (presenter) 32.5, Driver.Present.render_fence_wait (presenter) 32.0, Vulkan.Retire (presenter) 32.0
  • present 2720: 130.2 ms at 2283 ms: Driver.Packet (queue worker 0x0) 121.1, Driver.Packet.draw (queue worker 0x0) 117.4, Driver.Draw (queue worker 0x0) 116.4, batch (gpu) 86.2

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 19.4 (17 %) 0.1 (0 %) 94.4 37.4 Driver.Packet 19.5, Graphics.Draw 0.0
presenter 0.4 (0 %) 32.7 (29 %) 80.8 0.1 Driver.Present 33.1
gpu 82.9 (73 %) 0.0 (0 %) 31.0 0.0 batch 82.9

Largest slices (ms per frame, inclusive, all threads): batch 82.9, Driver.Present 33.1, Driver.Present.render_fence_wait 32.6, Vulkan.Retire 32.6, Vulkan.Retire.wait 32.6, Driver.Packet 19.5, Driver.Packet.draw 18.8, Driver.Draw 18.6, Driver.Draw.draw_and_resource_release 4.4, Graphics.Draw 4.3

Longest waits

  • Driver.Present.render_fence_wait (presenter) 37.4 ms at 1006 ms, present 2709
  • Driver.Present.render_fence_wait (presenter) 37.2 ms at 6497 ms, present 2757
  • Driver.Present.render_fence_wait (presenter) 36.3 ms at 2283 ms, present 2720
  • Driver.Present.render_fence_wait (presenter) 35.5 ms at 116 ms, present 2701
  • Driver.Present.render_fence_wait (presenter) 35.5 ms at 3868 ms, present 2734
  • Driver.Present.render_fence_wait (presenter) 35.5 ms at 3198 ms, present 2728
  • Driver.Present.render_fence_wait (presenter) 35.4 ms at 2058 ms, present 2718
  • Driver.Present.render_fence_wait (presenter) 35.3 ms at 669 ms, present 2706
  • Driver.Present.render_fence_wait (presenter) 35.2 ms at 4670 ms, present 2741
  • Driver.Present.render_fence_wait (presenter) 35.2 ms at 339 ms, present 2703
This change (summary commit a0dd42c)

seconds 200:15 from present 2708: 124 presents, frame p50 119.3 / p90 133.3 / p99 151.6 / max 172.5 ms, GPU busy 84.7 ms per present
NVIDIA GeForce RTX 2080 Ti, NVIDIA 617.14, Windows 10.0.26300, 3840x2160, commit a0dd42c (dirty), dropped: yes

{"commit":"a0dd42cf9b44","dirty":true,"env":{"APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"200:15"},"gpu":"NVIDIA GeForce RTX 2080 Ti","driver":"NVIDIA 617.14","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"seconds 200:15","first_present":2708,"ms":15078.201},"presents":124,"frame_ms":{"p50":119.277,"p90":133.323,"p99":151.553,"max":172.525},"gpu_busy_ms_per_present":84.702,"worker_busy_pct":{"queue worker 0x0":98.081},"top_phases_ms_per_frame":{"Driver.Packet":119.228,"Driver.Packet.draw":107.057,"Driver.Draw":106.006,"Driver.Draw.draw_and_resource_release":50.358,"Graphics.Draw":49.2,"Graphics.Draw.draw_and_resource_release":40.064,"Driver.Draw.shader_compile_and_link":37.71,"Driver.Present":32.538},"trace_dropped":true,"trace":"aps5-trace-a0dd42cf9b44-40532.json.gz"}

Slowest frames (largest slices inside each, inclusive)

  • present 2708: 172.5 ms at 0 ms: Driver.Packet (queue worker 0x0) 159.6, Driver.Packet.draw (queue worker 0x0) 154.8, Driver.Draw (queue worker 0x0) 153.3, batch (gpu) 117.0
  • present 2743: 151.6 ms at 4268 ms: batch (gpu) 88.1, Driver.Present (presenter) 30.9, Driver.Present.render_fence_wait (presenter) 30.2, Vulkan.Retire (presenter) 30.2
  • present 2730: 146.1 ms at 2685 ms: Driver.Packet (queue worker 0x0) 136.3, Driver.Packet.draw (queue worker 0x0) 130.9, Driver.Draw (queue worker 0x0) 129.8, batch (gpu) 89.4
  • present 2789: 142.1 ms at 9922 ms: batch (gpu) 85.1, Driver.Present (presenter) 29.5, Driver.Present.render_fence_wait (presenter) 29.0, Vulkan.Retire (presenter) 29.0
  • present 2802: 140.5 ms at 11540 ms: batch (gpu) 87.0, Driver.Present (presenter) 34.6, Driver.Present.render_fence_wait (presenter) 34.1, Vulkan.Retire (presenter) 34.0

Threads (ms per frame)

thread busy wait untraced in slices < 20 us largest
queue worker 0x0 21.2 (17 %) 0.1 (0 %) 100.3 38.1 Driver.Packet 21.3, Driver.Completion 0.0
presenter 0.5 (0 %) 32.1 (26 %) 89.1 0.1 Driver.Present 32.5
gpu 84.7 (70 %) 0.0 (0 %) 36.9 0.0 batch 84.7

Largest slices (ms per frame, inclusive, all threads): batch 84.7, Driver.Present 32.5, Driver.Present.render_fence_wait 32.0, Vulkan.Retire 32.0, Vulkan.Retire.wait 32.0, Driver.Packet 21.3, Driver.Packet.draw 20.4, Driver.Draw 20.2, Driver.Draw.draw_and_resource_release 5.0, Graphics.Draw 4.9

Longest waits

  • Driver.Present.render_fence_wait (presenter) 38.0 ms at 5652 ms, present 2754
  • Driver.Present.render_fence_wait (presenter) 37.7 ms at 10328 ms, present 2792
  • Driver.Present.render_fence_wait (presenter) 37.0 ms at 2329 ms, present 2727
  • Driver.Present.render_fence_wait (presenter) 36.9 ms at 5416 ms, present 2752
  • Driver.Present.render_fence_wait (presenter) 36.3 ms at 5775 ms, present 2755
  • Driver.Present.render_fence_wait (presenter) 36.1 ms at 6255 ms, present 2759
  • Driver.Present.render_fence_wait (presenter) 36.1 ms at 5295 ms, present 2751
  • Driver.Present.render_fence_wait (presenter) 35.8 ms at 10451 ms, present 2793
  • Driver.Present.render_fence_wait (presenter) 35.6 ms at 5893 ms, present 2756
  • Driver.Present.render_fence_wait (presenter) 35.6 ms at 12254 ms, present 2808

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 6612 core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp L227-228
PR 6801 core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp L228
PR 7677 core/libs/prx/libSceAgcDriver/CMakeLists.txt L2084

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 4072 core/shader/recompiler/Recompiler.cpp
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5431 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5499 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5609 core/shader/recompiler/Recompiler.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6044 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6146 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6235 core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6488 core/shader/recompiler/Recompiler.cpp
PR 6501 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6539 core/shader/recompiler/Recompiler.cpp
PR 6682 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6683 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Translation/src/ShaderInputInfoBuilder.cpp
PR 6747 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6788 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6868 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6879 core/shader/recompiler/Recompiler.cpp
PR 6905 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6924 core/shader/recompiler/Recompiler.cpp
PR 6946 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6947 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 6977 core/shader/recompiler/Recompiler.cpp
PR 7002 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7048 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7085 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7201 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 7395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 7446 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7464 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7484 core/shader/recompiler/Recompiler.cpp
PR 7505 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 7644 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7800 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7816 core/shader/recompiler/Recompiler.cpp
PR 7888 core/shader/recompiler/Recompiler.cpp
PR 8004 core/shader/recompiler/Recompiler.cpp
PR 8206 core/libs/prx/libSceAgcDriver/CMakeLists.txt

@github-actions github-actions Bot added build shader core/shader agc libSceAgc* labels Oct 16, 2026
@github-actions github-actions Bot added perf Performance change perf numbers missing perf pull request without a before and after summary line needs rebase Conflicts with main, rebase needed labels Oct 18, 2026
@adriadam10 adriadam10 self-assigned this Oct 19, 2026

@adriadam10 adriadam10 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, the approach (same checks, same order, no ShaderVertexInputInfo build) is reasonable. Two things to fix before it can merge:

  • ValidateVertexStageInputs is out of sync with main. Since your base, BuildShaderStageInputInfo validates the mesh configuration as outputPrimitiveSize in {2, 3} and provokingVertex < outputPrimitiveSize (ShaderInputInfoBuilder.cpp:225 on main). Your validation (ShaderInputInfoBuilder.cpp:280 in the PR) still uses provokingVertex > 2u and ignores outputPrimitiveSize, so e.g. outputPrimitiveSize = 2, provokingVertex = 2 or outputPrimitiveSize = 4 throw in the build but pass the validation. That defeats "same errors", and these two paths would then skip a check the build makes.
  • agc_vertex_input_validation should catch this class of drift: add mesh cases that vary outputPrimitiveSize (0, 1, 2, 3, 4) and provokingVertex against it, and make sure it fails when the check is removed. Ideally also make the build and the validation share the mesh/tessellation checks (one helper), so the next change to them cannot desync again.
  • The PR conflicts with main in core/libs/prx/libSceAgcDriver/CMakeLists.txt (the foreach(agcTest IN ITEMS ...) list, line 1519). Please rebase and re-run the new test on the rebased tree.

Minor: the frame-time table in the description shows +6 % p50 for this change; you explain it as noise, fine, but the claim to keep is the ~1.2 % worker-frame saving only.

@meh7an
meh7an force-pushed the perf/shader-validate-vertex-inputs branch from 296b607 to 5bb72c6 Compare October 20, 2026 12:42
@github-actions

Copy link
Copy Markdown

This pull request is labeled perf, so it needs the summary line of a capture on main and one with the change, from the same title, scene and machine, as the Performance report form asks. Please paste both aps5-summary.jsonl lines, attach the two traces and add the output of tools/trace_digest.py.

@github-actions github-actions Bot removed perf numbers missing perf pull request without a before and after summary line needs rebase Conflicts with main, rebase needed labels Oct 20, 2026
@meh7an

meh7an commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

Thanks, done, and rebased onto main 1d41645.

  • BuildShaderStageInputInfo and ValidateVertexStageInputs now make the tessellation and mesh checks through one helper each, _validateTessellation and _validateMesh.
    • So the validation's mesh check is main's: outputPrimitiveSize in {2, 3} and provokingVertex < outputPrimitiveSize.
  • agc_vertex_input_validation adds nine mesh configurations over outputPrimitiveSize 0 to 4, with provokingVertex at and below it.
    • Besides the build and the validation agreeing in all 4095 cases, it checks each of the nine against its expected verdict, for both.
    • So a check dropped from the shared helper fails it too. With _validateMesh back at provokingVertex > 2u, it fails on sizes 0, 1 and 4, and on size 2 with provoking vertex 2.
  • The CMakeLists conflict is resolved, and the new test passes on the rebased tree.
    • The full suite passes 1740 of 1742.
    • The two that don't, agc_driver_image_array_window_past_layer_limit (not compiled with MinGW) and agc_driver_pass_input_hazard, fail on plain main too.
  • The description now claims the ~1.2% worker-frame saving only.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@adriadam10 could you take another look when you have a moment? On 5bb72c6 your three points look addressed to us: the build and the validation now share _validateTessellation and _validateMesh, so the mesh check is main's (outputPrimitiveSize in {2, 3}, provokingVertex < outputPrimitiveSize); agc_vertex_input_validation compares the two paths over the stage, vertex, mesh and tessellation cases and adds nine mesh (size, provoking vertex) cases; and the CMake conflict is gone. If it looks right to you too, an updated review would clear your change request.

@adriadam10
adriadam10 merged commit 0c54584 into boykopovar:main Oct 20, 2026
12 checks passed
@adriadam10

Copy link
Copy Markdown
Collaborator

Re-checked 5bb72c6 against the previous points: the build and the validation share _validateTessellation and _validateMesh, so the mesh check is main's (outputPrimitiveSize in {2, 3}, provokingVertex < outputPrimitiveSize); agc_vertex_input_validation pins the expected verdict of both paths on nine mesh cases and fails if the helper regresses; the CMake conflict is gone. Error order and messages are unchanged; merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* build perf Performance change shader core/shader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants