spirv: Accept doubles in FaceForward, Reflect and Refract
authorNeil Roberts <nroberts@igalia.com>
Wed, 21 Mar 2018 19:34:40 +0000 (20:34 +0100)
committerNeil Roberts <nroberts@igalia.com>
Tue, 17 Apr 2018 18:58:11 +0000 (20:58 +0200)
commit608d70bc02a968ee2b21a5db0f54247d877c8196
treefeeb2941ed90bc5d27843e4ba8137368bb1f558c
parent6e499572b9a7b33165b8438a85db37ae1ba0ce0e
spirv: Accept doubles in FaceForward, Reflect and Refract

The SPIR-V spec doesn’t specify a size requirement for these and the
equivalent functions in the GLSL spec have explicit alternatives for
doubles. Refract is a little bit more complicated due to the fact that
the final argument is always supposed to be a scalar 32- or 16- bit
float regardless of the other operands. However in practice it seems
there is a bug in glslang that makes it convert the argument to 64-bit
if you actually try to pass it a 32-bit value while the other
arguments are 64-bit. This adds an optional conversion of the final
argument in order to support any type.

These have been tested against the automatically generated tests of
glsl-4.00/execution/built-in-functions using the ARB_gl_spirv branch
which tests it with quite a large range of combinations.

The issue with glslang has been filed here:
https://github.com/KhronosGroup/glslang/issues/1279

v2: Convert the eta operand of Refract from any size in order to make
    it eventually cope with 16-bit floats.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/spirv/vtn_glsl450.c