|
1
|
+From da90fca6093dd58cc351b0ac624ea8c0d83a81f9 Mon Sep 17 00:00:00 2001
|
|
2
|
+From: Christian Gmeiner <cgmeiner@igalia.com>
|
|
3
|
+Date: Fri, 18 Apr 2025 23:35:20 +0200
|
|
4
|
+Subject: [PATCH 1/3] etnaviv: isa: Add txf instruction
|
|
5
|
+
|
|
6
|
+This instruction is used to implement texelfetch.
|
|
7
|
+
|
|
8
|
+Blob generates such txf's for
|
|
9
|
+dEQP-GLES3.functional.shaders.texture_functions.texelfetch.+
|
|
10
|
+
|
|
11
|
+Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com>
|
|
12
|
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34685>
|
|
13
|
+---
|
|
14
|
+ src/etnaviv/isa/etnaviv.xml | 5 +++++
|
|
15
|
+ src/etnaviv/isa/tests/disasm.cpp | 1 +
|
|
16
|
+ 2 files changed, 6 insertions(+)
|
|
17
|
+
|
|
18
|
+diff --git a/src/etnaviv/isa/etnaviv.xml b/src/etnaviv/isa/etnaviv.xml
|
|
19
|
+index a337c1e9d0762..42f551238bf1b 100644
|
|
20
|
+--- a/src/etnaviv/isa/etnaviv.xml
|
|
21
|
++++ b/src/etnaviv/isa/etnaviv.xml
|
|
22
|
+@@ -1359,6 +1359,11 @@ SPDX-License-Identifier: MIT
|
|
23
|
+ <pattern pos="80">1</pattern> <!-- OPCODE_BIT6 -->
|
|
24
|
+ </bitset>
|
|
25
|
+
|
|
26
|
++<bitset name="txf" extends="#instruction-tex-src0-src1-src2">
|
|
27
|
++ <pattern low="0" high="5">001001</pattern> <!-- OPC -->
|
|
28
|
++ <pattern pos="80">1</pattern> <!-- OPCODE_BIT6 -->
|
|
29
|
++</bitset>
|
|
30
|
++
|
|
31
|
+ <bitset name="imadlo0" extends="#instruction-alu-src0-src1-src2">
|
|
32
|
+ <pattern low="0" high="5">001100</pattern> <!-- OPC -->
|
|
33
|
+ <pattern pos="80">1</pattern> <!-- OPCODE_BIT6 -->
|
|
34
|
+diff --git a/src/etnaviv/isa/tests/disasm.cpp b/src/etnaviv/isa/tests/disasm.cpp
|
|
35
|
+index aa027618aa40a..3d4ebec8a49be 100644
|
|
36
|
+--- a/src/etnaviv/isa/tests/disasm.cpp
|
|
37
|
++++ b/src/etnaviv/isa/tests/disasm.cpp
|
|
38
|
+@@ -166,6 +166,7 @@ INSTANTIATE_TEST_SUITE_P(Opcodes, DisasmTest,
|
|
39
|
+ disasm_state{ {0x00801036, 0x15400804, 0x01540050, 0x00000002}, "clamp0_max t0.x___, u0.yyyy, u0.zzzz, void\n"},
|
|
40
|
+ disasm_state{ {0x0080103b, 0x00001804, 0x40000000, 0x00400028}, "iaddsat.s32 t0.x___, t1.xxxx, void, -t2.xxxx\n"},
|
|
41
|
+ disasm_state{ {0x01001008, 0x15400804, 0xd00100c0, 0x00000007}, "imod.u16 t0._y__, t0.yyyy, 1, void\n"},
|
|
42
|
++ disasm_state{ {0x07811009, 0x15001f20, 0x01ff00c0, 0x78021008}, "txf t1, tex0.xyzw, t1.xyyy, t1.wwww, 4352\n", FLAG_FAILING_ASM},
|
|
43
|
+ disasm_state{ {0x0080103c, 0x00001804, 0x40000140, 0x00000000}, "imullo0.s32 t0.x___, t1.xxxx, t2.xxxx, void\n"},
|
|
44
|
+ disasm_state{ {0x00801000, 0x00001804, 0x40010140, 0x00000000}, "imulhi0.s32 t0.x___, t1.xxxx, t2.xxxx, void\n"},
|
|
45
|
+ disasm_state{ {0x00801004, 0x00201804, 0x40010040, 0x00000000}, "idiv0.s16 t0.x___, t1.xxxx, t0.xxxx, void\n"},
|
|
46
|
+--
|
|
47
|
+GitLab
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+From eefe486533eb58d3d1e81daa5abd16e63ee4c7a9 Mon Sep 17 00:00:00 2001
|
|
51
|
+From: Christian Gmeiner <cgmeiner@igalia.com>
|
|
52
|
+Date: Fri, 18 Apr 2025 23:37:19 +0200
|
|
53
|
+Subject: [PATCH 2/3] etnaviv: nir: Legalize txf lod src
|
|
54
|
+
|
|
55
|
+The LOD must be a float, unlike the GLSL function, which expects an integer.
|
|
56
|
+
|
|
57
|
+Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com>
|
|
58
|
+Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
|
|
59
|
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34685>
|
|
60
|
+---
|
|
61
|
+ .../etnaviv/etnaviv_nir_lower_texture.c | 25 +++++++++++++++++++
|
|
62
|
+ 1 file changed, 25 insertions(+)
|
|
63
|
+
|
|
64
|
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir_lower_texture.c b/src/gallium/drivers/etnaviv/etnaviv_nir_lower_texture.c
|
|
65
|
+index d0462ead016dc..d20d175da79a8 100644
|
|
66
|
+--- a/src/gallium/drivers/etnaviv/etnaviv_nir_lower_texture.c
|
|
67
|
++++ b/src/gallium/drivers/etnaviv/etnaviv_nir_lower_texture.c
|
|
68
|
+@@ -26,6 +26,28 @@ lower_txs(nir_builder *b, nir_instr *instr, UNUSED void *data)
|
|
69
|
+ return true;
|
|
70
|
+ }
|
|
71
|
+
|
|
72
|
++static bool
|
|
73
|
++legalize_txf_lod(nir_builder *b, nir_instr *instr, UNUSED void *data)
|
|
74
|
++{
|
|
75
|
++ if (instr->type != nir_instr_type_tex)
|
|
76
|
++ return false;
|
|
77
|
++
|
|
78
|
++ nir_tex_instr *tex = nir_instr_as_tex(instr);
|
|
79
|
++
|
|
80
|
++ if (tex->op != nir_texop_txf)
|
|
81
|
++ return false;
|
|
82
|
++
|
|
83
|
++ b->cursor = nir_before_instr(instr);
|
|
84
|
++
|
|
85
|
++ int lod_index = nir_tex_instr_src_index(tex, nir_tex_src_lod);
|
|
86
|
++ assert(lod_index >= 0);
|
|
87
|
++ nir_def *lod = tex->src[lod_index].src.ssa;
|
|
88
|
++
|
|
89
|
++ nir_src_rewrite(&tex->src[lod_index].src, nir_i2f32(b, lod));
|
|
90
|
++
|
|
91
|
++ return true;
|
|
92
|
++}
|
|
93
|
++
|
|
94
|
+ bool
|
|
95
|
+ etna_nir_lower_texture(nir_shader *s, struct etna_shader_key *key)
|
|
96
|
+ {
|
|
97
|
+@@ -48,5 +70,8 @@ etna_nir_lower_texture(nir_shader *s, struct etna_shader_key *key)
|
|
98
|
+ NIR_PASS(progress, s, nir_shader_instructions_pass, lower_txs,
|
|
99
|
+ nir_metadata_control_flow, NULL);
|
|
100
|
+
|
|
101
|
++ NIR_PASS(progress, s, nir_shader_instructions_pass, legalize_txf_lod,
|
|
102
|
++ nir_metadata_control_flow, NULL);
|
|
103
|
++
|
|
104
|
+ return progress;
|
|
105
|
+ }
|
|
106
|
+--
|
|
107
|
+GitLab
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+From 614b66529de2832575cdb0c97581d0d5f791ed72 Mon Sep 17 00:00:00 2001
|
|
111
|
+From: Christian Gmeiner <cgmeiner@igalia.com>
|
|
112
|
+Date: Fri, 18 Apr 2025 23:42:14 +0200
|
|
113
|
+Subject: [PATCH 3/3] etnaviv: nir: Add support for txf texture operation
|
|
114
|
+
|
|
115
|
+The src[2] value 0x1100 is set based on observed behavior of the blob driver,
|
|
116
|
+though its exact meaning remains to be documented.
|
|
117
|
+
|
|
118
|
+Passes all dEQP-GLES3.functional.shaders.texture_functions.texelfetch.*
|
|
119
|
+tests on GC7000.
|
|
120
|
+
|
|
121
|
+Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com>
|
|
122
|
+Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34685>
|
|
123
|
+---
|
|
124
|
+ src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.c | 4 ++++
|
|
125
|
+ 1 file changed, 4 insertions(+)
|
|
126
|
+
|
|
127
|
+diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.c
|
|
128
|
+index 08a5ab5fb7bc3..708f0788b580d 100644
|
|
129
|
+--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.c
|
|
130
|
++++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir_emit.c
|
|
131
|
+@@ -212,6 +212,10 @@ etna_emit_tex(struct etna_compile *c, nir_texop op, unsigned texid, unsigned dst
|
|
132
|
+ case nir_texop_txb: inst.opcode = ISA_OPC_TEXLDB; break;
|
|
133
|
+ case nir_texop_txd: inst.opcode = ISA_OPC_TEXLDD; break;
|
|
134
|
+ case nir_texop_txl: inst.opcode = ISA_OPC_TEXLDL; break;
|
|
135
|
++ case nir_texop_txf:
|
|
136
|
++ inst.opcode = ISA_OPC_TXF;
|
|
137
|
++ inst.src[2] = etna_immediate_int(0x1100);
|
|
138
|
++ break;
|
|
139
|
+ default:
|
|
140
|
+ compile_error(c, "Unhandled NIR tex type: %d\n", op);
|
|
141
|
+ }
|
|
142
|
+--
|
|
143
|
+GitLab
|
|
144
|
+ |