xf86-video-nouveau: add macros to retrieve the subsystem vendor/device
[nouveau] / src / nv30_shaders.c
1 /*
2  * Copyright 2007 Nouveau Project
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22
23
24 #include "nv30_shaders.h"
25
26 void NV30_UploadFragProg(NVPtr pNv, nv_shader_t *shader, int *hw_offset)
27 {
28         uint32_t *map = pNv->shader_mem->map + *hw_offset;
29         uint32_t data, i;
30
31         shader->hw_id = *hw_offset;
32
33         for (i = 0; i < shader->size; i++) {
34                 data = shader->data[i];
35 #if (X_BYTE_ORDER != X_LITTLE_ENDIAN)
36                 data = ((data >> 16) | ((data & 0xffff) << 16));
37 #endif
38                 map[i] = data;
39         }
40
41         *hw_offset += (shader->size * sizeof(uint32_t));
42         *hw_offset = (*hw_offset + 63) & ~63;
43 }
44
45 void NV40_UploadVtxProg(NVPtr pNv, nv_shader_t *shader, int *hw_id)
46 {
47         struct nouveau_channel *chan = pNv->chan;
48         struct nouveau_grobj *curie = pNv->Nv3D;
49         int i;
50
51         shader->hw_id = *hw_id;
52
53         BEGIN_RING(chan, curie, NV40TCL_VP_UPLOAD_FROM_ID, 1);
54         OUT_RING  (chan, (shader->hw_id));
55         for (i=0; i<shader->size; i+=4) {
56                 BEGIN_RING(chan, curie, NV40TCL_VP_UPLOAD_INST(0), 4);
57                 OUT_RING  (chan, shader->data[i + 0]);
58                 OUT_RING  (chan, shader->data[i + 1]);
59                 OUT_RING  (chan, shader->data[i + 2]);
60                 OUT_RING  (chan, shader->data[i + 3]);
61                 (*hw_id)++;
62         }
63 }
64
65 void
66 NV30_LoadFragProg(ScrnInfoPtr pScrn, nv_shader_t *shader)
67 {
68         NVPtr pNv = NVPTR(pScrn);
69         struct nouveau_channel *chan = pNv->chan;
70         struct nouveau_grobj *rankine = pNv->Nv3D;
71
72         BEGIN_RING(chan, rankine, NV34TCL_FP_ACTIVE_PROGRAM, 1);
73         OUT_RELOC (chan, pNv->shader_mem, shader->hw_id, NOUVEAU_BO_VRAM |
74                    NOUVEAU_BO_RD | NOUVEAU_BO_LOW | NOUVEAU_BO_OR,
75                    NV34TCL_FP_ACTIVE_PROGRAM_DMA0,
76                    NV34TCL_FP_ACTIVE_PROGRAM_DMA1);
77
78         BEGIN_RING(chan, rankine, NV34TCL_FP_REG_CONTROL, 1);
79         OUT_RING  (chan, (1 << 16)| 0xf);
80         BEGIN_RING(chan, rankine, NV34TCL_MULTISAMPLE_CONTROL, 1);
81         OUT_RING  (chan, 0xffff0000);
82
83         BEGIN_RING(chan, rankine, NV34TCL_FP_CONTROL,1);
84         OUT_RING  (chan, (shader->card_priv.NV30FP.num_regs-1)/2);
85 }
86
87 void
88 NV40_LoadVtxProg(ScrnInfoPtr pScrn, nv_shader_t *shader)
89 {
90         NVPtr pNv = NVPTR(pScrn);
91         struct nouveau_channel *chan = pNv->chan;
92         struct nouveau_grobj *curie = pNv->Nv3D;
93
94         BEGIN_RING(chan, curie, NV40TCL_VP_START_FROM_ID, 1);
95         OUT_RING  (chan, (shader->hw_id));
96
97         BEGIN_RING(chan, curie, NV40TCL_VP_ATTRIB_EN, 2);
98         OUT_RING  (chan, shader->card_priv.NV30VP.vp_in_reg);
99         OUT_RING  (chan, shader->card_priv.NV30VP.vp_out_reg);
100 }
101
102 void
103 NV40_LoadFragProg(ScrnInfoPtr pScrn, nv_shader_t *shader)
104 {
105         NVPtr pNv = NVPTR(pScrn);
106         struct nouveau_channel *chan = pNv->chan;
107         struct nouveau_grobj *curie = pNv->Nv3D;
108
109         BEGIN_RING(chan, curie, NV40TCL_FP_ADDRESS, 1);
110         OUT_RELOC (chan, pNv->shader_mem, shader->hw_id, NOUVEAU_BO_VRAM |
111                          NOUVEAU_BO_GART | NOUVEAU_BO_RD | NOUVEAU_BO_LOW |
112                          NOUVEAU_BO_OR,
113                          NV40TCL_FP_ADDRESS_DMA0, NV40TCL_FP_ADDRESS_DMA1);
114         BEGIN_RING(chan, curie, NV40TCL_FP_CONTROL, 1);
115         OUT_RING  (chan, shader->card_priv.NV30FP.num_regs <<
116                          NV40TCL_FP_CONTROL_TEMP_COUNT_SHIFT);
117 }
118
119 /*******************************************************************************
120  * NV40/G70 vertex shaders
121  */
122
123 nv_shader_t nv40_vp_exa_render = {
124         .card_priv.NV30VP.vp_in_reg  = 0x00000309,
125         .card_priv.NV30VP.vp_out_reg = 0x0000c001,
126         .size = (3*4),
127         .data = {
128                 /* MOV result.position, vertex.position */
129                 0x40041c6c, 0x0040000d, 0x8106c083, 0x6041ff80,
130                 /* MOV result.texcoord[0], vertex.texcoord[0] */
131                 0x401f9c6c, 0x0040080d, 0x8106c083, 0x6041ff9c,
132                 /* MOV result.texcoord[1], vertex.texcoord[1] */
133                 0x401f9c6c, 0x0040090d, 0x8106c083, 0x6041ffa1,
134         }
135 };
136
137 /*******************************************************************************
138  * NV30/NV40/G70 fragment shaders
139  */
140
141 nv_shader_t nv30_fp_pass_col0 = {
142         .card_priv.NV30FP.num_regs = 2,
143         .size = (1*4),
144         .data = {
145                 /* MOV R0, fragment.color */
146                 0x01403e81, 0x1c9dc801, 0x0001c800, 0x3fe1c800, 
147         }
148 };
149
150 nv_shader_t nv30_fp_pass_tex0 = {
151         .card_priv.NV30FP.num_regs = 2,
152         .size = (2*4),
153         .data = {
154                 /* TEX R0, fragment.texcoord[0], texture[0], 2D */
155                 0x17009e00, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
156                 /* MOV R0, R0 */
157                 0x01401e81, 0x1c9dc800, 0x0001c800, 0x0001c800,
158         }
159 };
160
161 nv_shader_t nv30_fp_composite_mask = {
162         .card_priv.NV30FP.num_regs = 2,
163         .size = (3*4),
164         .data = {
165                 /* TEXC0 R1.w         , fragment.texcoord[1], texture[1], 2D */
166                 0x1702b102, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
167                 /* TEX   R0 (NE0.wwww), fragment.texcoord[0], texture[0], 2D */
168                 0x17009e00, 0x1ff5c801, 0x0001c800, 0x3fe1c800,
169                 /* MUL   R0           , R0, R1.w */
170                 0x02001e81, 0x1c9dc800, 0x0001fe04, 0x0001c800,
171         }
172 };
173
174 nv_shader_t nv30_fp_composite_mask_sa_ca = {
175         .card_priv.NV30FP.num_regs = 2,
176         .size = (3*4),
177         .data = {
178                 /* TEXC0 R1.w         , fragment.texcoord[0], texture[0], 2D */
179                 0x17009102, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
180                 /* TEX   R0 (NE0.wwww), fragment.texcoord[1], texture[1], 2D */
181                 0x1702be00, 0x1ff5c801, 0x0001c800, 0x3fe1c800,
182                 /* MUL   R0           , R1,wwww, R0 */
183                 0x02001e81, 0x1c9dfe04, 0x0001c800, 0x0001c800,
184         }
185 };
186
187 nv_shader_t nv30_fp_composite_mask_ca = {
188         .card_priv.NV30FP.num_regs = 2,
189         .size = (3*4),
190         .data = {
191                 /* TEXC0 R0           , fragment.texcoord[0], texture[0], 2D */
192                 0x17009f00, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
193                 /* TEX   R1 (NE0.xyzw), fragment.texcoord[1], texture[1], 2D */
194                 0x1702be02, 0x1c95c801, 0x0001c800, 0x3fe1c800,
195                 /* MUL   R0           , R0, R1 */
196                 0x02001e81, 0x1c9dc800, 0x0001c804, 0x0001c800,
197         }
198 };
199
200 nv_shader_t nv40_vp_video = {
201         .card_priv.NV30VP.vp_in_reg  = 0x00000309,
202         .card_priv.NV30VP.vp_out_reg = 0x0000c001,
203         .size = (3*4),
204         .data = {
205                 /* MOV result.position, vertex.position */
206                 0x40041c6c, 0x0040000d, 0x8106c083, 0x6041ff80,
207                 /* MOV result.texcoord[0], vertex.texcoord[0] */
208                 0x401f9c6c, 0x0040080d, 0x8106c083, 0x6041ff9c,
209                 /* MOV result.texcoord[1], vertex.texcoord[1] */
210                 0x401f9c6c, 0x0040090d, 0x8106c083, 0x6041ffa1,
211         }
212 };
213
214 nv_shader_t nv40_fp_yv12_bicubic = {
215         .card_priv.NV30FP.num_regs = 4,
216         .size = (29*4),
217         .data = {
218                 /* INST 0: MOVR R0.xy (TR0.xyzw), attrib.texcoord[0] */
219                 0x01008600, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
220                 /* INST 1: ADDR R0.z (TR0.xyzw), R0.yyyy, { 0.50, 0.00, 0.00, 0.00 }.xxxx */
221                 0x03000800, 0x1c9caa00, 0x00000002, 0x0001c800,
222                 0x3f000000, 0x00000000, 0x00000000, 0x00000000,
223                 /* INST 2: ADDR R1.x (TR0.xyzw), R0, { 0.50, 0.00, 0.00, 0.00 }.xxxx */
224                 0x03000202, 0x1c9dc800, 0x00000002, 0x0001c800,
225                 0x3f000000, 0x00000000, 0x00000000, 0x00000000,
226                 /* INST 3: TEXRC0 R1.xyz (TR0.xyzw), R0.zzzz, texture[0] */
227                 0x17000f82, 0x1c9d5400, 0x0001c800, 0x0001c800,
228                 /* INST 4: MULR R2.yw (TR0.xyzw), R1.xxyy, { -1.00, 1.00, 0.00, 0.00 }.xxyy */
229                 0x02001404, 0x1c9ca104, 0x0000a002, 0x0001c800,
230                 0xbf800000, 0x3f800000, 0x00000000, 0x00000000,
231                 /* INST 5: TEXR R3.xyz (TR0.xyzw), R1, texture[0] */
232                 0x17000e86, 0x1c9dc804, 0x0001c800, 0x0001c800,
233                 /* INST 6: MULR R2.xz (TR0.xyzw), R3.xxyy, { -1.00, 1.00, 0.00, 0.00 }.xxyy */
234                 0x02000a04, 0x1c9ca10c, 0x0000a002, 0x0001c800,
235                 0xbf800000, 0x3f800000, 0x00000000, 0x00000000,
236                 /* INST 7: ADDR R2 (TR0.xyzw), R0.xyxy, R2 */
237                 0x03001e04, 0x1c9c8800, 0x0001c808, 0x0001c800,
238                 /* INST 8: TEXR R1.y (TR0.xyzw), R2.zwzz, -texture[1] */
239                 0x17020402, 0x1c9d5c08, 0x0001c800, 0x0001c800,
240                 /* INST 9: MADH R1.x (TR0.xyzw), -R1.zzzz, R1.yyyy, R1.yyyy */
241                 0x04400282, 0x1c9f5504, 0x0000aa04, 0x0000aa04,
242                 /* INST 10: TEXR R0.y (TR0.xyzw), R2.xwxw, -texture[1] */
243                 0x17020400, 0x1c9d9808, 0x0001c800, 0x0001c800,
244                 /* INST 11: MADH R0.w (TR0.xyzw), -R1.zzzz, R0.yyyy, R0.yyyy */
245                 0x04401080, 0x1c9f5504, 0x0000aa00, 0x0000aa00,
246                 /* INST 12: TEXR R0.x (TR0.xyzw), R2.zyxy, texture[1] */
247                 0x17020200, 0x1c9c8c08, 0x0001c800, 0x0001c800,
248                 /* INST 13: MADH R1.x (TR0.xyzw), R1.zzzz, R0, R1 */
249                 0x04400282, 0x1c9d5504, 0x0001c800, 0x0001c904,
250                 /* INST 14: TEXR R0.x (NE0.zzzz), R2, texture[1] */
251                 0x17020200, 0x1555c808, 0x0001c800, 0x0001c800,
252                 /* INST 15: MADH R0.x (TR0.xyzw), R1.zzzz, R0, R0.wwww */
253                 0x04400280, 0x1c9d5504, 0x0001c800, 0x0001ff00,
254                 /* INST 16: MADH R0.w (TR0.xyzw), -R3.zzzz, R1.xxxx, R1.xxxx */
255                 0x04401080, 0x1c9f550c, 0x00000104, 0x00000104,
256                 /* INST 17: TEXR R0.yz (TR0.xyzw), attrib.texcoord[1], abs(texture[2]) */
257                 0x1704ac80, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
258                 /* INST 18: MADH R0.x (TR0.xyzw), R3.zzzz, R0, R0.wwww */
259                 0x04400280, 0x1c9d550c, 0x0001c900, 0x0001ff00,
260                 /* INST 19: MADH R1.xyz (TR0.xyzw), R0.xxxx, { 1.16, -0.87, 0.53, -1.08 }.xxxx, { 1.16, -0.87, 0.53, -1.08 }.yzww */
261                 0x04400e82, 0x1c9c0100, 0x00000002, 0x0001f202,
262                 0x3f9507c8, 0xbf5ee393, 0x3f078fef, 0xbf8a6762,
263                 /* INST 20: MADH R1.xyz (TR0.xyzw), R0.yyyy, { 0.00, -0.39, 2.02, 0.00 }, R1 */
264                 0x04400e82, 0x1c9cab00, 0x0001c802, 0x0001c904,
265                 0x00000000, 0xbec890d6, 0x40011687, 0x00000000,
266                 /* INST 21: MADH R0.xyz (TR0.xyzw), R0.zzzz, { 1.60, -0.81, 0.00, 0.00 }, R1 + END */
267                 0x04400e81, 0x1c9d5500, 0x0001c802, 0x0001c904,
268                 0x3fcc432d, 0xbf501a37, 0x00000000, 0x00000000,
269         }
270 };
271
272 nv_shader_t nv30_fp_yv12_bicubic = {
273         .card_priv.NV30FP.num_regs = 4,
274         .size = (24*4),
275         .data = {
276                 /* INST 0: MOVR R2.xy (TR0.xyzw), attrib.texcoord[0] */
277                 0x01008604, 0x1c9dc801, 0x0001c800, 0x0001c800,
278                 /* INST 1: ADDR R0.xy (TR0.xyzw), R2, { 0.50, 0.00, 0.00, 0.00 }.xxxx */
279                 0x03000600, 0x1c9dc808, 0x00000002, 0x0001c800,
280                 0x3f000000, 0x00000000, 0x00000000, 0x00000000,
281                 /* INST 2: TEXR R3.xyz (TR0.xyzw), R0, texture[0] */
282                 0x17000e06, 0x1c9dc800, 0x0001c800, 0x0001c800,
283                 /* INST 3: TEXR R0.xyz (TR0.xyzw), R0.yyyy, texture[0] */
284                 0x17000e00, 0x1c9caa00, 0x0001c800, 0x0001c800,
285                 /* INST 4: MULR R1.xz (TR0.xyzw), R3.xxyy, { -1.00, 1.00, 0.00, 0.00 }.xxyy */
286                 0x02000a02, 0x1c9ca00c, 0x0000a002, 0x0001c800,
287                 0xbf800000, 0x3f800000, 0x00000000, 0x00000000,
288                 /* INST 5: MULR R1.yw (TR0.xyzw), R0.xxyy, { -1.00, 1.00, 0.00, 0.00 }.xxyy */
289                 0x02001402, 0x1c9ca000, 0x0000a002, 0x0001c800,
290                 0xbf800000, 0x3f800000, 0x00000000, 0x00000000,
291                 /* INST 6: ADDR R2 (TR0.xyzw), R2.xyxy, R1 */
292                 0x03001e04, 0x1c9c8808, 0x0001c804, 0x0001c800,
293                 /* INST 7: TEXR R0.x (TR0.xyzw), R2, texture[1] */
294                 0x17020200, 0x1c9dc808, 0x0001c800, 0x0001c800,
295                 /* INST 8: TEXR R1.y (TR0.xyzw), R2.xwxw, texture[1] */
296                 0x17020402, 0x1c9d9808, 0x0001c800, 0x0001c800,
297                 /* INST 9: TEXR R1.x (TR0.xyzw), R2.zyxy, texture[1] */
298                 0x17020202, 0x1c9c8c08, 0x0001c800, 0x0001c800,
299                 /* INST 10: LRPH R0.x (TR0.xyzw), R0.zzzz, R0, R1.yyyy */
300                 0x1f400280, 0x1c9d5400, 0x0001c800, 0x0000aa04,
301                 /* INST 11: TEXR R0.y (TR0.xyzw), R2.zwzz, texture[1] */
302                 0x17020400, 0x1c9d5c08, 0x0001c800, 0x0001c800,
303                 /* INST 12: LRPH R0.y (TR0.xyzw), R0.zzzz, R1.xxxx, R0 */
304                 0x1f400480, 0x1c9d5400, 0x00000004, 0x0001c800,
305                 /* INST 13: LRPH R0.x (TR0.xyzw), R3.zzzz, R0, R0.yyyy */
306                 0x1f400280, 0x1c9d540c, 0x0001c900, 0x0000ab00,
307                 /* INST 14: MADH R0.xyz (TR0.xyzw), R0.xxxx, { 1.16, -0.87, 0.53, -1.08 }.xxxx, { 1.16, -0.87, 0.53, -1.08 }.yzww */
308                 0x04400e80, 0x1c9c0100, 0x00000002, 0x0001f202,
309                 0x3f9507c8, 0xbf5ee393, 0x3f078fef, 0xbf8a6762,
310                 /* INST 15: TEXR R1.yz (TR0.xyzw), attrib.texcoord[1], abs(texture[2]) */
311                 0x1704ac02, 0x1c9dc801, 0x0001c800, 0x0001c800,
312                 /* INST 16: MADH R0.xyz (TR0.xyzw), R1.yyyy, { 0.00, -0.39, 2.02, 0.00 }, R0 */
313                 0x04400e80, 0x1c9caa04, 0x0001c802, 0x0001c900,
314                 0x00000000, 0xbec890d6, 0x40011687, 0x00000000,
315                 /* INST 17: MADH R0.xyz (TR0.xyzw), R1.zzzz, { 1.60, -0.81, 0.00, 0.00 }, R0 + END */
316                 0x04400e81, 0x1c9d5404, 0x0001c802, 0x0001c900,
317                 0x3fcc432d, 0xbf501a37, 0x00000000, 0x00000000,
318         }
319 };
320
321 nv_shader_t nv30_fp_yv12_bilinear = {
322         .card_priv.NV30FP.num_regs = 2,
323         .size = (8*4),
324         .data = {
325                 /* INST 0: TEXR R0.x (TR0.xyzw), attrib.texcoord[0], abs(texture[1]) */
326                 0x17028200, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
327                 /* INST 1: MADR R1.xyz (TR0.xyzw), R0.xxxx, { 1.16, -0.87, 0.53, -1.08 }.xxxx, { 1.16, -0.87, 0.53, -1.08 }.yzww */
328                 0x04000e02, 0x1c9c0000, 0x00000002, 0x0001f202,
329                 0x3f9507c8, 0xbf5ee393, 0x3f078fef, 0xbf8a6762,
330                 /* INST 2: TEXR R0.yz (TR0.xyzw), attrib.texcoord[1], abs(texture[2]) */
331                 0x1704ac80, 0x1c9dc801, 0x0001c800, 0x3fe1c800,
332                 /* INST 3: MADR R1.xyz (TR0.xyzw), R0.yyyy, { 0.00, -0.39, 2.02, 0.00 }, R1 */
333                 0x04000e02, 0x1c9cab00, 0x0001c802, 0x0001c804,
334                 0x00000000, 0xbec890d6, 0x40011687, 0x00000000,
335                 /* INST 4: MADR R0.xyz (TR0.xyzw), R0.zzzz, { 1.60, -0.81, 0.00, 0.00 }, R1 + END */
336                 0x04000e81, 0x1c9d5500, 0x0001c802, 0x0001c804,
337                 0x3fcc432d, 0xbf501a37, 0x00000000, 0x00000000,
338         }
339 };
340
341