Merge commit 'origin/master' into gallium-0.2
[profile/ivi/mesa.git] / src / mesa / shader / prog_instruction.h
1 /*
2  * Mesa 3-D graphics library
3  * Version:  6.5.3
4  *
5  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included
15  * in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25
26 /**
27  * \file prog_instruction.h
28  *
29  * Vertex/fragment program instruction datatypes and constants.
30  *
31  * \author Brian Paul
32  * \author Keith Whitwell
33  * \author Ian Romanick <idr@us.ibm.com>
34  */
35
36
37 #ifndef PROG_INSTRUCTION_H
38 #define PROG_INSTRUCTION_H
39
40
41 /**
42  * Swizzle indexes.
43  * Do not change!
44  */
45 /*@{*/
46 #define SWIZZLE_X    0
47 #define SWIZZLE_Y    1
48 #define SWIZZLE_Z    2
49 #define SWIZZLE_W    3
50 #define SWIZZLE_ZERO 4   /**< For SWZ instruction only */
51 #define SWIZZLE_ONE  5   /**< For SWZ instruction only */
52 #define SWIZZLE_NIL  7   /**< used during shader code gen (undefined value) */
53 /*@}*/
54
55 #define MAKE_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9))
56 #define SWIZZLE_NOOP           MAKE_SWIZZLE4(0,1,2,3)
57 #define GET_SWZ(swz, idx)      (((swz) >> ((idx)*3)) & 0x7)
58 #define GET_BIT(msk, idx)      (((msk) >> (idx)) & 0x1)
59
60 #define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W)
61 #define SWIZZLE_XXXX MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)
62 #define SWIZZLE_YYYY MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)
63 #define SWIZZLE_ZZZZ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)
64 #define SWIZZLE_WWWW MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)
65
66
67 /**
68  * Writemask values, 1 bit per component.
69  */
70 /*@{*/
71 #define WRITEMASK_X     0x1
72 #define WRITEMASK_Y     0x2
73 #define WRITEMASK_XY    0x3
74 #define WRITEMASK_Z     0x4
75 #define WRITEMASK_XZ    0x5
76 #define WRITEMASK_YZ    0x6
77 #define WRITEMASK_XYZ   0x7
78 #define WRITEMASK_W     0x8
79 #define WRITEMASK_XW    0x9
80 #define WRITEMASK_YW    0xa
81 #define WRITEMASK_XYW   0xb
82 #define WRITEMASK_ZW    0xc
83 #define WRITEMASK_XZW   0xd
84 #define WRITEMASK_YZW   0xe
85 #define WRITEMASK_XYZW  0xf
86 /*@}*/
87
88
89 /**
90  * Condition codes
91  */
92 /*@{*/
93 #define COND_GT  1  /**< greater than zero */
94 #define COND_EQ  2  /**< equal to zero */
95 #define COND_LT  3  /**< less than zero */
96 #define COND_UN  4  /**< unordered (NaN) */
97 #define COND_GE  5  /**< greater then or equal to zero */
98 #define COND_LE  6  /**< less then or equal to zero */
99 #define COND_NE  7  /**< not equal to zero */
100 #define COND_TR  8  /**< always true */
101 #define COND_FL  9  /**< always false */
102 /*@}*/
103
104
105 /**
106  * Instruction precision for GL_NV_fragment_program
107  */
108 /*@{*/
109 #define FLOAT32  0x1
110 #define FLOAT16  0x2
111 #define FIXED12  0x4
112 /*@}*/
113
114
115 /**
116  * Saturation modes when storing values.
117  */
118 /*@{*/
119 #define SATURATE_OFF            0
120 #define SATURATE_ZERO_ONE       1
121 #define SATURATE_PLUS_MINUS_ONE 2
122 /*@}*/
123
124
125 /**
126  * Per-component negation masks
127  */
128 /*@{*/
129 #define NEGATE_X    0x1
130 #define NEGATE_Y    0x2
131 #define NEGATE_Z    0x4
132 #define NEGATE_W    0x8
133 #define NEGATE_XYZW 0xf
134 #define NEGATE_NONE 0x0
135 /*@}*/
136
137
138 /**
139  * Program instruction opcodes, for both vertex and fragment programs.
140  * \note changes to this opcode list must be reflected in t_vb_arbprogram.c
141  */
142 typedef enum prog_opcode {
143                      /* ARB_vp   ARB_fp   NV_vp   NV_fp     GLSL */
144                      /*------------------------------------------*/
145    OPCODE_NOP = 0,   /*                                      X   */
146    OPCODE_ABS,       /*   X        X       1.1               X   */
147    OPCODE_ADD,       /*   X        X       X       X         X   */
148    OPCODE_ARA,       /*                    2                     */
149    OPCODE_ARL,       /*   X                X                     */
150    OPCODE_ARL_NV,    /*                    2                     */
151    OPCODE_ARR,       /*                    2                     */
152    OPCODE_BGNLOOP,   /*                                     opt  */
153    OPCODE_BGNSUB,    /*                                     opt  */
154    OPCODE_BRA,       /*                    2                 X   */
155    OPCODE_BRK,       /*                    2                opt  */
156    OPCODE_CAL,       /*                    2       2             */
157    OPCODE_CMP,       /*            X                             */
158    OPCODE_CONT,      /*                                     opt  */
159    OPCODE_COS,       /*            X       2       X         X   */
160    OPCODE_DDX,       /*                            X         X   */
161    OPCODE_DDY,       /*                            X         X   */
162    OPCODE_DP3,       /*   X        X       X       X         X   */
163    OPCODE_DP4,       /*   X        X       X       X         X   */
164    OPCODE_DPH,       /*   X        X       1.1                   */
165    OPCODE_DST,       /*   X        X       X       X             */
166    OPCODE_ELSE,      /*                                      X   */
167    OPCODE_END,       /*   X        X       X       X        opt  */
168    OPCODE_ENDIF,     /*                                     opt  */
169    OPCODE_ENDLOOP,   /*                                     opt  */
170    OPCODE_ENDSUB,    /*                                     opt  */
171    OPCODE_EX2,       /*   X        X       2       X         X   */
172    OPCODE_EXP,       /*   X                X                 X   */
173    OPCODE_FLR,       /*   X        X       2       X         X   */
174    OPCODE_FRC,       /*   X        X       2       X         X   */
175    OPCODE_IF,        /*                                     opt  */
176    OPCODE_KIL,       /*            X                             */
177    OPCODE_KIL_NV,    /*                            X         X   */
178    OPCODE_LG2,       /*   X        X       2       X         X   */
179    OPCODE_LIT,       /*   X        X       X       X             */
180    OPCODE_LOG,       /*   X                X                 X   */
181    OPCODE_LRP,       /*            X               X             */
182    OPCODE_MAD,       /*   X        X       X       X         X   */
183    OPCODE_MAX,       /*   X        X       X       X         X   */
184    OPCODE_MIN,       /*   X        X       X       X         X   */
185    OPCODE_MOV,       /*   X        X       X       X         X   */
186    OPCODE_MUL,       /*   X        X       X       X         X   */
187    OPCODE_NOISE1,    /*                                      X   */
188    OPCODE_NOISE2,    /*                                      X   */
189    OPCODE_NOISE3,    /*                                      X   */
190    OPCODE_NOISE4,    /*                                      X   */
191    OPCODE_PK2H,      /*                            X             */
192    OPCODE_PK2US,     /*                            X             */
193    OPCODE_PK4B,      /*                            X             */
194    OPCODE_PK4UB,     /*                            X             */
195    OPCODE_POW,       /*   X        X               X         X   */
196    OPCODE_POPA,      /*                    3                     */
197    OPCODE_PRINT,     /*                    X       X             */
198    OPCODE_PUSHA,     /*                    3                     */
199    OPCODE_RCC,       /*                    1.1                   */
200    OPCODE_RCP,       /*   X        X       X       X         X   */
201    OPCODE_RET,       /*                    2       2             */
202    OPCODE_RFL,       /*            X               X             */
203    OPCODE_RSQ,       /*   X        X       X       X         X   */
204    OPCODE_SCS,       /*            X                             */
205    OPCODE_SEQ,       /*                    2       X         X   */
206    OPCODE_SFL,       /*                    2       X             */
207    OPCODE_SGE,       /*   X        X       X       X         X   */
208    OPCODE_SGT,       /*                    2       X         X   */
209    OPCODE_SIN,       /*            X       2       X         X   */
210    OPCODE_SLE,       /*                    2       X         X   */
211    OPCODE_SLT,       /*   X        X       X       X         X   */
212    OPCODE_SNE,       /*                    2       X         X   */
213    OPCODE_SSG,       /*                    2                     */
214    OPCODE_STR,       /*                    2       X             */
215    OPCODE_SUB,       /*   X        X       1.1     X         X   */
216    OPCODE_SWZ,       /*   X        X                             */
217    OPCODE_TEX,       /*            X       3       X         X   */
218    OPCODE_TXB,       /*            X       3                 X   */
219    OPCODE_TXD,       /*                            X         X   */
220    OPCODE_TXL,       /*                    3       2         X   */
221    OPCODE_TXP,       /*            X                         X   */
222    OPCODE_TXP_NV,    /*                    3       X             */
223    OPCODE_TRUNC,     /*                                      X   */
224    OPCODE_UP2H,      /*                            X             */
225    OPCODE_UP2US,     /*                            X             */
226    OPCODE_UP4B,      /*                            X             */
227    OPCODE_UP4UB,     /*                            X             */
228    OPCODE_X2D,       /*                            X             */
229    OPCODE_XPD,       /*   X        X                         X   */
230    MAX_OPCODE
231 } gl_inst_opcode;
232
233
234 /* temporary, just in case, remove soon */
235 #define OPCODE_INT OPCODE_TRUNC
236
237 /**
238  * Instruction source register.
239  */
240 struct prog_src_register
241 {
242    GLuint File:4;       /**< One of the PROGRAM_* register file values. */
243    GLint Index:9;       /**< May be negative for relative addressing. */
244    GLuint Swizzle:12;
245    GLuint RelAddr:1;
246
247    /**
248     * \name Source register "sign" control.
249     *
250     * The ARB and NV extensions allow varrying degrees of control over the
251     * sign of the source vector components.  These values allow enough control
252     * for all flavors of the extensions.
253     */
254    /*@{*/
255    /**
256     * Per-component negation for the SWZ instruction.  For non-SWZ
257     * instructions the only possible values are NEGATE_XYZW and NEGATE_NONE.
258     *
259     * \since
260     * ARB_vertex_program, ARB_fragment_program
261     */
262    GLuint NegateBase:4;
263
264    /**
265     * Take the component-wise absolute value.
266     *
267     * \since
268     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2,
269     * NV_vertex_program2_option.
270     */
271    GLuint Abs:1;
272
273    /**
274     * Post-absolute value negation (all components).
275     */
276    GLuint NegateAbs:1;
277    /*@}*/
278 };
279
280
281 /**
282  * Instruction destination register.
283  */
284 struct prog_dst_register
285 {
286    /**
287     * One of the PROGRAM_* register file values.
288     */
289    GLuint File:4;
290
291    GLuint Index:8;
292    GLuint WriteMask:4;
293
294    /**
295     * \name Conditional destination update control.
296     *
297     * \since
298     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2,
299     * NV_vertex_program2_option.
300     */
301    /*@{*/
302    /**
303     * Takes one of the 9 possible condition values (EQ, FL, GT, GE, LE, LT,
304     * NE, TR, or UN).  Dest reg is only written to if the matching
305     * (swizzled) condition code value passes.  When a conditional update mask
306     * is not specified, this will be \c COND_TR.
307     */
308    GLuint CondMask:4;
309
310    /**
311     * Condition code swizzle value.
312     */
313    GLuint CondSwizzle:12;
314    
315    /**
316     * Selects the condition code register to use for conditional destination
317     * update masking.  In NV_fragmnet_program or NV_vertex_program2 mode, only
318     * condition code register 0 is available.  In NV_vertex_program3 mode, 
319     * condition code registers 0 and 1 are available.
320     */
321    GLuint CondSrc:1;
322    /*@}*/
323
324    GLuint pad:31;
325 };
326
327
328 /**
329  * Vertex/fragment program instruction.
330  */
331 struct prog_instruction
332 {
333    gl_inst_opcode Opcode;
334 #if FEATURE_MESA_program_debug
335    GLshort StringPos;
336 #endif
337    /**
338     * Arbitrary data.  Used for the PRINT, CAL, and BRA instructions.
339     */
340    void *Data;
341
342    struct prog_src_register SrcReg[3];
343    struct prog_dst_register DstReg;
344
345    /**
346     * Indicates that the instruction should update the condition code
347     * register.
348     *
349     * \since
350     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2,
351     * NV_vertex_program2_option.
352     */
353    GLuint CondUpdate:1;
354
355    /**
356     * If prog_instruction::CondUpdate is \c GL_TRUE, this value selects the
357     * condition code register that is to be updated.
358     *
359     * In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition
360     * code register 0 is available.  In GL_NV_vertex_program3 mode, condition
361     * code registers 0 and 1 are available.
362     *
363     * \since
364     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2,
365     * NV_vertex_program2_option.
366     */
367    GLuint CondDst:1;
368
369    /**
370     * Saturate each value of the vectored result to the range [0,1] or the
371     * range [-1,1].  \c SSAT mode (i.e., saturation to the range [-1,1]) is
372     * only available in NV_fragment_program2 mode.
373     * Value is one of the SATURATE_* tokens.
374     *
375     * \since
376     * NV_fragment_program, NV_fragment_program_option, NV_vertex_program3.
377     */
378    GLuint SaturateMode:2;
379    
380    /**
381     * Per-instruction selectable precision.
382     *
383     * \since
384     * NV_fragment_program, NV_fragment_program_option.
385     */
386    GLuint Precision:3;
387
388    /**
389     * \name Texture source controls.
390     * 
391     * The texture source controls are only used with the \c TEX, \c TXD,
392     * \c TXL, and \c TXP instructions.
393     *
394     * \since
395     * ARB_fragment_program, NV_fragment_program, NV_vertex_program3.
396     */
397    /*@{*/
398    /**
399     * Source texture unit.  OpenGL supports a maximum of 32 texture
400     * units.
401     */
402    GLuint TexSrcUnit:5;
403    
404    /**
405     * Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX.
406     */
407    GLuint TexSrcTarget:3;
408    /*@}*/
409
410    /**
411     * For BRA and CAL instructions, the location to jump to.
412     * For BGNLOOP, points to ENDLOOP (and vice-versa).
413     * For BRK, points to BGNLOOP (which points to ENDLOOP).
414     * For IF, points to else or endif.
415     * For ELSE, points to endif.
416     */
417    GLint BranchTarget;
418
419 #if 0
420    /**
421     * For TEX instructions in shaders, the sampler to use for the
422     * texture lookup.
423     */
424    GLint Sampler;
425 #endif
426
427    const char *Comment;
428 };
429
430
431 extern void
432 _mesa_init_instructions(struct prog_instruction *inst, GLuint count);
433
434 extern struct prog_instruction *
435 _mesa_alloc_instructions(GLuint numInst);
436
437 extern struct prog_instruction *
438 _mesa_realloc_instructions(struct prog_instruction *oldInst,
439                            GLuint numOldInst, GLuint numNewInst);
440
441 extern struct prog_instruction *
442 _mesa_copy_instructions(struct prog_instruction *dest,
443                         const struct prog_instruction *src, GLuint n);
444
445 extern void
446 _mesa_free_instructions(struct prog_instruction *inst, GLuint count);
447
448 extern GLuint
449 _mesa_num_inst_src_regs(gl_inst_opcode opcode);
450
451 extern GLuint
452 _mesa_num_inst_dst_regs(gl_inst_opcode opcode);
453
454 extern GLboolean
455 _mesa_is_tex_instruction(gl_inst_opcode opcode);
456
457 extern const char *
458 _mesa_opcode_string(gl_inst_opcode opcode);
459
460
461 #endif /* PROG_INSTRUCTION_H */