Repository navigation
Conversation
This was referenced Oct 26, 2026
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Legacy custom 3D shaders authored for LÖVE 11 produce inverted canvas geometry on LÖVE 12. Reflecting a completed world image corrects the terrain but also inverts ordinary 2D HUDs already painted into that image. Actual VASC battle screenshots reproduce both failures.
Normalize the high-level vertex shader entry point before composition. On a canvas, expose the legacy matrix convention through the position argument and global projection aliases, then normalize the resulting clip Y. The two changes cancel for ordinary matrix-based 2D shaders; custom 3D projection output is corrected before native UI, weather or embedded battle HUDs join the canvas. Target/shader changes and graphics-stack restoration keep the uniform in sync. Pixel-only shaders, low-level vertexmain, shaders explicitly marked native or already adapted in source or compiler options, and LÖVE 11 keep their existing behavior. Named and array compiler definitions preserve the original source/filename/FileData and options table without a redundant read or source allocation; inherited definitions are also protected at compile time. Identifier suffixes do not accidentally opt out. Existing native custom-coordinate adapters opt out explicitly to avoid a second conversion.
World images default to upright presentation. Explicit worldOrientation="legacy" remains available for an unconverted image; detached/native images and separate engine UI retain their conventions. No mod-specific branches, OS spoofing, mod source edits or compatibility-gate bypasses.
Validation:
The real Metal battle run obtained its first window capture but a later OS screenshot timed out; it is not counted as complete Metal gameplay acceptance. Metal shader pixels are independently verified as above. An unchanged supplied Johto package currently fails before camera verification because its generated function exceeds LuaJIT’s 60-upvalue limit. The same package fails identically on the parent composed fork without the compiler-option correction; neither attempt counts as successful gameplay verification. No ROMs or mod assets are included. Windows GPU execution and complete engine/mod parity remain open.
Additional compiler-option regression validation:
docs/qa/shader-compiler-options.md.Self-converting canvas follow-up: preserve a complete position forwarding wrapper that already negates its returned clip Y. This prevents double conversion in an unchanged renderer without keying on its package or helper name. Partial and differently shaped wrappers retain the legacy path. The new asymmetric GPU fixture fails before this fix; afterwards Metal and OpenGL each pass 348 checks across eight cases. CPU shader checks pass 125/125 and native compositor orientation checks pass 151/151. A fresh ROM-backed field observation confirms an upright scene; full mod, battle and display-resolution acceptance remain separate. These follow-up tests retain 8 GiB free and use owned QA profiles.
Derivative-program integration with #337: preserve the exact preceding constructor as
compileNative. Derived shader programs already use the admitted canvas convention; re-analyzing a modified forwarding entry could adapt that projection twice. The internal seam preserves source/options without injecting a producer macro. The independent module now passes 128 targeted CPU checks; the actual native M3/Metal fixture passes 73 API/lifetime/stage-sampler checks with the seam. Deliberately re-entering the adapter fails its asymmetric spatial pixel comparison. These are shader-contract observations, with separate full-frame/gameplay qualification; fresh owned profiles and 20 GiB free reserve are used. The contribution licence is included in this branch.Contributions by Roxas2712 — https://github.com/Roxas2712. The covered PR contributions retain the specific integration permission for Cedric / UNDERdecoded and credit requirement in
LICENSE-ROXAS2712.md; existing third-party notices and rights remain intact.