mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-05 13:20:11 +00:00
The reversed-order blend computed the factors Vulkan cannot apply per channel in the pixel shader (1 - x in fp32, a clamp for UNORM targets and, when both positions needed it, a premultiplied export) and passed them to the blend as a dual-source second color. A plain blend converts the export once and forms 1 - x and the products from that converted value, so the two paths can round differently. On UNORM8 the difference reaches one step per substituted factor: an Intel iGPU stored 161 where the exact blend is 159.75 for SRC_COLOR + ONE_MINUS_SRC_COLOR with an export of 0.5 over 192 (160 through SWAP_STD), and on an RTX 5080 and lavapipe the split path differed from the same draw into a SWAP_STD target by up to 2 steps on other inputs. The pixel shader now only copies values. Each channel of the second color is the exported alpha, the channel's own export or the constant 0 or 1, and a channel of the first color whose source factor is ONE may become 1 with its export moved into the factor. Every factor, 1 - x and product comes from the blend through SRC1_COLOR, SRC1_ALPHA and their ONE_MINUS forms, applied to copies of the same export values that the first color carries. TranslateReversedBlend searches for Vulkan factors and copy routes that reproduce each channel's guest factors and throws for combinations no routing reproduces, such as ONE_MINUS_SRC_ALPHA in the alpha equation next to SRC_COLOR in the color equation: of the 1995 factor combinations the shader used to compute, 932 are routed and the others throw again, as on main. GT7's 0x65010504 is among the routed ones. The code is now four 2-bit routes for each color, the same for every format, and the post-pass emits no arithmetic. agc_driver_reversed_order_blend also draws each case into a SWAP_STD target, which Vulkan blends alone, and requires identical stored bits; the comparison with the exact blend keeps its 1-step tolerance. agc_driver_graphics checks every factor combination TranslateReversedBlend accepts against the guest equations and that the post-pass adds no arithmetic instructions. Co-Authored-By: Claude Opus 5.5 <[email protected]>