nir/lower_mediump: Lower FS outputs to 16-bit when the value was upconverted.
authorEmma Anholt <emma@anholt.net>
Tue, 9 Aug 2022 20:56:50 +0000 (13:56 -0700)
committerMarge Bot <emma+marge@anholt.net>
Wed, 31 Aug 2022 02:43:45 +0000 (02:43 +0000)
commit80b35fbefe5ecda3a6becd6df2a00761b9bfdaaa
treee744040f3b80597dee9e72a226e1ce225bbc9977
parentdbb17f567a2c3b20e30f2ebe20c6918a99e8e238
nir/lower_mediump: Lower FS outputs to 16-bit when the value was upconverted.

Take this real-world (trimmed) shader:

precision highp float;
in lowp vec4 var_varVertexColor;
layout(location = 0) out vec4 out_FragColor0;
void main() {
    vec4 textureColor0 = vec4(1.000000e+00, 0.000000e+00, 0.000000e+00, 1.000000e+00);
    vec3 color = vec3(1.000000e+00, 1.000000e+00, 1.000000e+00);
    vec4 outColor = vec4(vec3((color).rgb), 1.000000e+00);
    (outColor *= vec4(var_varVertexColor));
    (out_FragColor0 = outColor);
}

After opts, it's just a store from input to output.  If we decide to lower
the input to 16-bit, then as long as the driver can handle 16-bit outputs,
it would be a good idea to demote the output and save the conversions.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18003>
src/compiler/nir/nir_lower_mediump.c