naga/back/wgsl/polyfill/
mod.rs

1use crate::{ScalarKind, TypeInner, VectorSize};
2
3#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4pub struct InversePolyfill {
5    pub fun_name: &'static str,
6    pub source: &'static str,
7}
8
9impl InversePolyfill {
10    pub fn find_overload(ty: &TypeInner) -> Option<InversePolyfill> {
11        let &TypeInner::Matrix {
12            columns,
13            rows,
14            scalar,
15        } = ty
16        else {
17            return None;
18        };
19
20        if columns != rows || scalar.kind != ScalarKind::Float {
21            return None;
22        };
23
24        Self::polyfill_overload(columns, scalar.width)
25    }
26
27    const fn polyfill_overload(
28        dimension: VectorSize,
29        width: crate::Bytes,
30    ) -> Option<InversePolyfill> {
31        const INVERSE_2X2_F32: &str = include_str!("inverse/inverse_2x2_f32.wgsl");
32        const INVERSE_3X3_F32: &str = include_str!("inverse/inverse_3x3_f32.wgsl");
33        const INVERSE_4X4_F32: &str = include_str!("inverse/inverse_4x4_f32.wgsl");
34        const INVERSE_2X2_F16: &str = include_str!("inverse/inverse_2x2_f16.wgsl");
35        const INVERSE_3X3_F16: &str = include_str!("inverse/inverse_3x3_f16.wgsl");
36        const INVERSE_4X4_F16: &str = include_str!("inverse/inverse_4x4_f16.wgsl");
37
38        match (dimension, width) {
39            (VectorSize::Bi, 4) => Some(InversePolyfill {
40                fun_name: "_naga_inverse_2x2_f32",
41                source: INVERSE_2X2_F32,
42            }),
43            (VectorSize::Tri, 4) => Some(InversePolyfill {
44                fun_name: "_naga_inverse_3x3_f32",
45                source: INVERSE_3X3_F32,
46            }),
47            (VectorSize::Quad, 4) => Some(InversePolyfill {
48                fun_name: "_naga_inverse_4x4_f32",
49                source: INVERSE_4X4_F32,
50            }),
51            (VectorSize::Bi, 2) => Some(InversePolyfill {
52                fun_name: "_naga_inverse_2x2_f16",
53                source: INVERSE_2X2_F16,
54            }),
55            (VectorSize::Tri, 2) => Some(InversePolyfill {
56                fun_name: "_naga_inverse_3x3_f16",
57                source: INVERSE_3X3_F16,
58            }),
59            (VectorSize::Quad, 2) => Some(InversePolyfill {
60                fun_name: "_naga_inverse_4x4_f16",
61                source: INVERSE_4X4_F16,
62            }),
63            _ => None,
64        }
65    }
66}