mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-14 15:00:30 +02:00
GPU: Write 1.0's bits in decimal in the shader pspPow
HLSL types an unsuffixed hex literal as uint, so asint(x) - 0x3F800000 went unsigned and wrapped for every x below 1. The huge t then turned into a NaN, and anything lit with specular or powered diffuse came out black on D3D11 (the flags in Everybody's Golf's language select, #22418). GLSL types it as int and was unaffected. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
dcaa4d5f16
commit
a1e2763f32
1 file changed
+2
-1
@@ -440,7 +440,8 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||
// pow is close enough.
|
||||
WRITE(p, "float pspPow(float x, float e) {\n");
|
||||
if (compat.bitwiseOps) {
|
||||
WRITE(p, " float t = max(e, 0.0) * float(floatBitsToInt(max(x, 1e-30)) - 0x3F800000) + 1065353216.0;\n");
|
||||
// 1065353216 is 1.0's bits. Not written in hex: HLSL makes 0x3F800000 a uint, and the subtraction wraps.
|
||||
WRITE(p, " float t = max(e, 0.0) * float(floatBitsToInt(max(x, 1e-30)) - 1065353216) + 1065353216.0;\n");
|
||||
WRITE(p, " return x > 0.0 || e <= 0.0 ? intBitsToFloat(int(max(t, 0.0))) : 0.0;\n");
|
||||
} else {
|
||||
WRITE(p, " return e <= 0.0 ? 1.0 : pow(max(x, 0.0), e);\n");
|
||||
|
||||
Reference in new issue
Block a user