From c01c27d968ebc382d89b097b9eb08bba7f164217 Mon Sep 17 00:00:00 2001 From: Lucas Eriksson Date: Sat, 18 Aug 2018 02:20:48 +0200 Subject: [PATCH] nv2a: Fix EXP and LOG According to the NV_vertex_program specification, our implementations of these functions were wrong. spec: https://www.khronos.org/registry/OpenGL/extensions/NV/NV_vertex_program.txt --- hw/xbox/nv2a/nv2a_vsh.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/hw/xbox/nv2a/nv2a_vsh.c b/hw/xbox/nv2a/nv2a_vsh.c index 97ccb58101..1518f2d679 100644 --- a/hw/xbox/nv2a/nv2a_vsh.c +++ b/hw/xbox/nv2a/nv2a_vsh.c @@ -674,13 +674,25 @@ static const char* vsh_header = "#define EXP(dest, mask, src) dest.mask = _EXP(_in(src).x).mask\n" "vec4 _EXP(float src)\n" "{\n" - " return vec4(exp2(src));\n" + " vec4 result;\n" + " result.x = exp2(floor(src));\n" + " result.y = src - floor(src);\n" + " result.z = exp2(src);\n" + " result.w = 1.0;\n" + " return result;\n" "}\n" "\n" "#define LOG(dest, mask, src) dest.mask = _LOG(_in(src).x).mask\n" "vec4 _LOG(float src)\n" "{\n" - " return vec4(log2(src));\n" + " float tmp = abs(src);\n" + " if (tmp == 0.0) { return vec4(-INFINITY, 1.0f, -INFINITY, 1.0f); }\n" + " vec4 result;\n" + " result.x = floor(log2(tmp));\n" + " result.y = tmp / exp2(floor(log2(tmp)));\n" + " result.z = log2(tmp);\n" + " result.w = 1.0;\n" + " return result;\n" "}\n" "\n" "#define LIT(dest, mask, src) dest.mask = _LIT(_in(src)).mask\n"