mesa/src/compiler
Connor Abbott 7e8d885919 spirv: Rewrite determinant calculation
The old calculation for mat3 was clever, but it turns out that a
straightforward application of subdeterminants similar to how mat4 is
handled is more efficient: on a scalar architecture with some sort of
combined multiply+add instruction with a negate modifier (both fairly
common), the new determinant is 9 instructions vs. 15 for the old one,
and without the multiply-add it's 14 instructions vs. 18 for the old
one.  When used as a routine for inverse() the savings are compounded,
because we now use the same method as used to compute the adjucate
matrix and so CSE can combine most of the calculations with the adjucate
matrix ones.

Once mat3 and mat4 use the same method for computing determinants, we
can combine them into a single recursive function. I also pulled up the
mat_subdet() function because it was doing basically what we need, so
it's now shared between determinant and inverse. This shrinks the
implementation significantly, as can be seen from the diffstat.

The real reason I want to change this, though, is that it fixes
dEQP-VK.glsl.builtin.precision_fp16_storage16b.inverse.compute.mat3 with
turnip. Qualcomm uses round-to-zero for 16-bit frcp, which combined with
some inaccuracy in the old method of calculating the determinant led us
to fail. Qualcomm's driver uses something like the new method to
calculate the determinant in the inverse. We could argue that Mesa's
method should be allowed, because round-to-zero for floating-point
division is within spec and there are no precision guarantees given for
determinant() or inverse(). However we might as well use the more
efficient method.

Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14652>
2022-02-19 02:03:25 +00:00
..
clc
glsl Re-indentation after the previous commit 2022-02-11 17:25:34 +00:00
isaspec isaspec: add gen-based leaf bitset separation 2022-02-12 13:46:07 -05:00
nir nir/serialize: Don't access blob->data directly 2022-02-19 01:25:46 +00:00
spirv spirv: Rewrite determinant calculation 2022-02-19 02:03:25 +00:00
builtin_type_macros.h glsl: add vec5 glsl types 2022-01-18 16:10:35 +08:00
glsl_types.cpp glsl: add vec5 glsl types 2022-01-18 16:10:35 +08:00
glsl_types.h
meson.build
nir_gl_types.h nir: remove gl.h include from nir headers. 2022-01-19 21:54:58 +00:00
nir_types.cpp nir: remove gl.h include from nir headers. 2022-01-19 21:54:58 +00:00
nir_types.h nir: remove gl.h include from nir headers. 2022-01-19 21:54:58 +00:00
shader_enums.c compiler: Extract num_mesh_vertices_per_primitive function. 2022-02-14 11:13:42 +01:00
shader_enums.h nir: Add some notes about const/uniform array access rules in GL. 2022-02-16 20:06:21 +00:00
shader_info.h mesa/*: add a shader primitive type to get away from GL types. 2022-01-19 21:54:58 +00:00