Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Mesa 3-D graphics library |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 3 | * Version: 6.5.3 |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 4 | * |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 5 | * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 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 | * |
Brian | c920d20 | 2007-01-23 17:41:25 -0700 | [diff] [blame] | 29 | * Vertex/fragment program instruction datatypes and constants. |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 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 | |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 41 | /** |
| 42 | * Swizzle indexes. |
| 43 | * Do not change! |
| 44 | */ |
| 45 | /*@{*/ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 46 | #define SWIZZLE_X 0 |
| 47 | #define SWIZZLE_Y 1 |
| 48 | #define SWIZZLE_Z 2 |
| 49 | #define SWIZZLE_W 3 |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 50 | #define SWIZZLE_ZERO 4 /**< For SWZ instruction only */ |
| 51 | #define SWIZZLE_ONE 5 /**< For SWZ instruction only */ |
Brian | b63c100 | 2007-01-31 16:34:54 -0700 | [diff] [blame] | 52 | #define SWIZZLE_NIL 7 /**< used during shader code gen (undefined value) */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 53 | /*@}*/ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 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 | |
Brian | 629ec2b | 2007-03-21 15:40:54 -0600 | [diff] [blame] | 60 | #define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W) |
Brian | bd894c4 | 2007-02-20 10:40:08 -0700 | [diff] [blame] | 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 | |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 66 | |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 67 | /** |
| 68 | * Writemask values, 1 bit per component. |
| 69 | */ |
| 70 | /*@{*/ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 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 |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 86 | /*@}*/ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 87 | |
| 88 | |
| 89 | /** |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 90 | * Condition codes |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 91 | */ |
| 92 | /*@{*/ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 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 */ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 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 { |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 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 */ |
Brian | 01001d8 | 2007-02-05 11:28:15 -0700 | [diff] [blame] | 152 | OPCODE_BGNLOOP, /* opt */ |
| 153 | OPCODE_BGNSUB, /* opt */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 154 | OPCODE_BRA, /* 2 X */ |
Brian | 01001d8 | 2007-02-05 11:28:15 -0700 | [diff] [blame] | 155 | OPCODE_BRK, /* 2 opt */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 156 | OPCODE_CAL, /* 2 2 */ |
| 157 | OPCODE_CMP, /* X */ |
Brian | 01001d8 | 2007-02-05 11:28:15 -0700 | [diff] [blame] | 158 | OPCODE_CONT, /* opt */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 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 */ |
Brian | 01001d8 | 2007-02-05 11:28:15 -0700 | [diff] [blame] | 167 | OPCODE_END, /* X X X X opt */ |
| 168 | OPCODE_ENDIF, /* opt */ |
| 169 | OPCODE_ENDLOOP, /* opt */ |
| 170 | OPCODE_ENDSUB, /* opt */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 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 */ |
Brian | 01001d8 | 2007-02-05 11:28:15 -0700 | [diff] [blame] | 175 | OPCODE_IF, /* opt */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 176 | OPCODE_INT, /* X */ |
| 177 | OPCODE_KIL, /* X */ |
| 178 | OPCODE_KIL_NV, /* X X */ |
| 179 | OPCODE_LG2, /* X X 2 X X */ |
| 180 | OPCODE_LIT, /* X X X X */ |
| 181 | OPCODE_LOG, /* X X X */ |
| 182 | OPCODE_LRP, /* X X */ |
| 183 | OPCODE_MAD, /* X X X X X */ |
| 184 | OPCODE_MAX, /* X X X X X */ |
| 185 | OPCODE_MIN, /* X X X X X */ |
| 186 | OPCODE_MOV, /* X X X X X */ |
| 187 | OPCODE_MUL, /* X X X X X */ |
Brian | 7aece10 | 2007-01-28 19:01:35 -0700 | [diff] [blame] | 188 | OPCODE_NOISE1, /* X */ |
| 189 | OPCODE_NOISE2, /* X */ |
| 190 | OPCODE_NOISE3, /* X */ |
| 191 | OPCODE_NOISE4, /* X */ |
Brian | 6d4e561 | 2007-01-23 17:39:25 -0700 | [diff] [blame] | 192 | OPCODE_PK2H, /* X */ |
| 193 | OPCODE_PK2US, /* X */ |
| 194 | OPCODE_PK4B, /* X */ |
| 195 | OPCODE_PK4UB, /* X */ |
| 196 | OPCODE_POW, /* X X X X */ |
| 197 | OPCODE_POPA, /* 3 */ |
| 198 | OPCODE_PRINT, /* X X */ |
| 199 | OPCODE_PUSHA, /* 3 */ |
| 200 | OPCODE_RCC, /* 1.1 */ |
| 201 | OPCODE_RCP, /* X X X X X */ |
| 202 | OPCODE_RET, /* 2 2 */ |
| 203 | OPCODE_RFL, /* X X */ |
| 204 | OPCODE_RSQ, /* X X X X X */ |
| 205 | OPCODE_SCS, /* X */ |
| 206 | OPCODE_SEQ, /* 2 X X */ |
| 207 | OPCODE_SFL, /* 2 X */ |
| 208 | OPCODE_SGE, /* X X X X X */ |
| 209 | OPCODE_SGT, /* 2 X X */ |
| 210 | OPCODE_SIN, /* X 2 X X */ |
| 211 | OPCODE_SLE, /* 2 X X */ |
| 212 | OPCODE_SLT, /* X X X X X */ |
| 213 | OPCODE_SNE, /* 2 X X */ |
| 214 | OPCODE_SSG, /* 2 */ |
| 215 | OPCODE_STR, /* 2 X */ |
| 216 | OPCODE_SUB, /* X X 1.1 X X */ |
| 217 | OPCODE_SWZ, /* X X */ |
| 218 | OPCODE_TEX, /* X 3 X X */ |
| 219 | OPCODE_TXB, /* X 3 X */ |
| 220 | OPCODE_TXD, /* X X */ |
| 221 | OPCODE_TXL, /* 3 2 X */ |
| 222 | OPCODE_TXP, /* X X */ |
| 223 | OPCODE_TXP_NV, /* 3 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 */ |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 230 | MAX_OPCODE |
| 231 | } gl_inst_opcode; |
| 232 | |
| 233 | |
| 234 | /** |
| 235 | * Instruction source register. |
| 236 | */ |
| 237 | struct prog_src_register |
| 238 | { |
| 239 | GLuint File:4; /**< One of the PROGRAM_* register file values. */ |
| 240 | GLint Index:9; /**< May be negative for relative addressing. */ |
| 241 | GLuint Swizzle:12; |
| 242 | GLuint RelAddr:1; |
| 243 | |
| 244 | /** |
| 245 | * \name Source register "sign" control. |
| 246 | * |
| 247 | * The ARB and NV extensions allow varrying degrees of control over the |
| 248 | * sign of the source vector components. These values allow enough control |
| 249 | * for all flavors of the extensions. |
| 250 | */ |
| 251 | /*@{*/ |
| 252 | /** |
| 253 | * Per-component negation for the SWZ instruction. For non-SWZ |
| 254 | * instructions the only possible values are NEGATE_XYZW and NEGATE_NONE. |
| 255 | * |
| 256 | * \since |
| 257 | * ARB_vertex_program, ARB_fragment_program |
| 258 | */ |
| 259 | GLuint NegateBase:4; |
| 260 | |
| 261 | /** |
| 262 | * Take the component-wise absolute value. |
| 263 | * |
| 264 | * \since |
| 265 | * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, |
| 266 | * NV_vertex_program2_option. |
| 267 | */ |
| 268 | GLuint Abs:1; |
| 269 | |
| 270 | /** |
| 271 | * Post-absolute value negation (all components). |
| 272 | */ |
| 273 | GLuint NegateAbs:1; |
| 274 | /*@}*/ |
| 275 | }; |
| 276 | |
| 277 | |
| 278 | /** |
| 279 | * Instruction destination register. |
| 280 | */ |
| 281 | struct prog_dst_register |
| 282 | { |
| 283 | /** |
| 284 | * One of the PROGRAM_* register file values. |
| 285 | */ |
| 286 | GLuint File:4; |
| 287 | |
| 288 | GLuint Index:8; |
| 289 | GLuint WriteMask:4; |
| 290 | |
| 291 | /** |
| 292 | * \name Conditional destination update control. |
| 293 | * |
| 294 | * \since |
| 295 | * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, |
| 296 | * NV_vertex_program2_option. |
| 297 | */ |
| 298 | /*@{*/ |
| 299 | /** |
| 300 | * Takes one of the 9 possible condition values (EQ, FL, GT, GE, LE, LT, |
Brian | fe20a61 | 2007-03-22 16:07:43 -0600 | [diff] [blame] | 301 | * NE, TR, or UN). Dest reg is only written to if the matching |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 302 | * (swizzled) condition code value passes. When a conditional update mask |
| 303 | * is not specified, this will be \c COND_TR. |
| 304 | */ |
| 305 | GLuint CondMask:4; |
| 306 | |
| 307 | /** |
| 308 | * Condition code swizzle value. |
| 309 | */ |
| 310 | GLuint CondSwizzle:12; |
| 311 | |
| 312 | /** |
| 313 | * Selects the condition code register to use for conditional destination |
| 314 | * update masking. In NV_fragmnet_program or NV_vertex_program2 mode, only |
| 315 | * condition code register 0 is available. In NV_vertex_program3 mode, |
| 316 | * condition code registers 0 and 1 are available. |
| 317 | */ |
| 318 | GLuint CondSrc:1; |
| 319 | /*@}*/ |
| 320 | |
| 321 | GLuint pad:31; |
| 322 | }; |
| 323 | |
| 324 | |
| 325 | /** |
| 326 | * Vertex/fragment program instruction. |
| 327 | */ |
| 328 | struct prog_instruction |
| 329 | { |
| 330 | gl_inst_opcode Opcode; |
| 331 | #if FEATURE_MESA_program_debug |
| 332 | GLshort StringPos; |
| 333 | #endif |
| 334 | /** |
| 335 | * Arbitrary data. Used for the PRINT, CAL, and BRA instructions. |
| 336 | */ |
| 337 | void *Data; |
| 338 | |
| 339 | struct prog_src_register SrcReg[3]; |
| 340 | struct prog_dst_register DstReg; |
| 341 | |
| 342 | /** |
| 343 | * Indicates that the instruction should update the condition code |
| 344 | * register. |
| 345 | * |
| 346 | * \since |
| 347 | * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, |
| 348 | * NV_vertex_program2_option. |
| 349 | */ |
| 350 | GLuint CondUpdate:1; |
| 351 | |
| 352 | /** |
| 353 | * If prog_instruction::CondUpdate is \c GL_TRUE, this value selects the |
| 354 | * condition code register that is to be updated. |
| 355 | * |
| 356 | * In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition |
| 357 | * code register 0 is available. In GL_NV_vertex_program3 mode, condition |
| 358 | * code registers 0 and 1 are available. |
| 359 | * |
| 360 | * \since |
| 361 | * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, |
| 362 | * NV_vertex_program2_option. |
| 363 | */ |
| 364 | GLuint CondDst:1; |
| 365 | |
| 366 | /** |
| 367 | * Saturate each value of the vectored result to the range [0,1] or the |
| 368 | * range [-1,1]. \c SSAT mode (i.e., saturation to the range [-1,1]) is |
| 369 | * only available in NV_fragment_program2 mode. |
| 370 | * Value is one of the SATURATE_* tokens. |
| 371 | * |
| 372 | * \since |
| 373 | * NV_fragment_program, NV_fragment_program_option, NV_vertex_program3. |
| 374 | */ |
| 375 | GLuint SaturateMode:2; |
| 376 | |
| 377 | /** |
| 378 | * Per-instruction selectable precision. |
| 379 | * |
| 380 | * \since |
| 381 | * NV_fragment_program, NV_fragment_program_option. |
| 382 | */ |
| 383 | GLuint Precision:3; |
| 384 | |
| 385 | /** |
| 386 | * \name Texture source controls. |
| 387 | * |
| 388 | * The texture source controls are only used with the \c TEX, \c TXD, |
| 389 | * \c TXL, and \c TXP instructions. |
| 390 | * |
| 391 | * \since |
| 392 | * ARB_fragment_program, NV_fragment_program, NV_vertex_program3. |
| 393 | */ |
| 394 | /*@{*/ |
| 395 | /** |
| 396 | * Source texture unit. OpenGL supports a maximum of 32 texture |
| 397 | * units. |
| 398 | */ |
| 399 | GLuint TexSrcUnit:5; |
| 400 | |
| 401 | /** |
| 402 | * Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX. |
| 403 | */ |
| 404 | GLuint TexSrcTarget:3; |
| 405 | /*@}*/ |
| 406 | |
| 407 | /** |
| 408 | * For BRA and CAL instructions, the location to jump to. |
Brian | d434019 | 2007-02-05 18:04:35 -0700 | [diff] [blame] | 409 | * For BGNLOOP, points to ENDLOOP (and vice-versa). |
| 410 | * For BRK, points to BGNLOOP (which points to ENDLOOP). |
| 411 | * For IF, points to else or endif. |
| 412 | * For ELSE, points to endif. |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 413 | */ |
Brian | c81aede | 2007-02-08 14:09:34 -0700 | [diff] [blame] | 414 | GLint BranchTarget; |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 415 | |
Brian | eef70ff | 2007-01-05 16:01:26 -0700 | [diff] [blame] | 416 | /** |
| 417 | * For TEX instructions in shaders, the sampler to use for the |
| 418 | * texture lookup. |
| 419 | */ |
| 420 | GLint Sampler; |
| 421 | |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 422 | const char *Comment; |
| 423 | }; |
| 424 | |
| 425 | |
| 426 | extern void |
| 427 | _mesa_init_instructions(struct prog_instruction *inst, GLuint count); |
| 428 | |
| 429 | extern struct prog_instruction * |
| 430 | _mesa_alloc_instructions(GLuint numInst); |
| 431 | |
| 432 | extern struct prog_instruction * |
| 433 | _mesa_realloc_instructions(struct prog_instruction *oldInst, |
| 434 | GLuint numOldInst, GLuint numNewInst); |
| 435 | |
Brian | 23d31ef | 2007-03-21 11:57:30 -0600 | [diff] [blame] | 436 | extern struct prog_instruction * |
| 437 | _mesa_copy_instructions(struct prog_instruction *dest, |
| 438 | const struct prog_instruction *src, GLuint n); |
| 439 | |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 440 | extern GLuint |
| 441 | _mesa_num_inst_src_regs(gl_inst_opcode opcode); |
| 442 | |
michal | 4a470f6 | 2007-08-07 15:34:11 +0100 | [diff] [blame] | 443 | extern GLuint |
| 444 | _mesa_num_inst_dst_regs(gl_inst_opcode opcode); |
| 445 | |
Brian | 00cdc0a | 2006-12-14 15:01:06 -0700 | [diff] [blame] | 446 | extern const char * |
| 447 | _mesa_opcode_string(gl_inst_opcode opcode); |
| 448 | |
| 449 | |
| 450 | #endif /* PROG_INSTRUCTION_H */ |