1 /* 2 * Mesa 3-D graphics library 3 * Version: 7.3 4 * 5 * Copyright (C) 1999-2008 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 #include "main/glheader.h" 42 43 44 /** 45 * Swizzle indexes. 46 * Do not change! 47 */ 48 /*@{*/ 49 #define SWIZZLE_X 0 50 #define SWIZZLE_Y 1 51 #define SWIZZLE_Z 2 52 #define SWIZZLE_W 3 53 #define SWIZZLE_ZERO 4 /**< For SWZ instruction only */ 54 #define SWIZZLE_ONE 5 /**< For SWZ instruction only */ 55 #define SWIZZLE_NIL 7 /**< used during shader code gen (undefined value) */ 56 /*@}*/ 57 58 #define MAKE_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9)) 59 #define SWIZZLE_NOOP MAKE_SWIZZLE4(0,1,2,3) 60 #define GET_SWZ(swz, idx) (((swz) >> ((idx)*3)) & 0x7) 61 #define GET_BIT(msk, idx) (((msk) >> (idx)) & 0x1) 62 63 #define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W) 64 #define SWIZZLE_XXXX MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X) 65 #define SWIZZLE_YYYY MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y) 66 #define SWIZZLE_ZZZZ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z) 67 #define SWIZZLE_WWWW MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W) 68 69 70 /** 71 * Writemask values, 1 bit per component. 72 */ 73 /*@{*/ 74 #define WRITEMASK_X 0x1 75 #define WRITEMASK_Y 0x2 76 #define WRITEMASK_XY 0x3 77 #define WRITEMASK_Z 0x4 78 #define WRITEMASK_XZ 0x5 79 #define WRITEMASK_YZ 0x6 80 #define WRITEMASK_XYZ 0x7 81 #define WRITEMASK_W 0x8 82 #define WRITEMASK_XW 0x9 83 #define WRITEMASK_YW 0xa 84 #define WRITEMASK_XYW 0xb 85 #define WRITEMASK_ZW 0xc 86 #define WRITEMASK_XZW 0xd 87 #define WRITEMASK_YZW 0xe 88 #define WRITEMASK_XYZW 0xf 89 /*@}*/ 90 91 92 /** 93 * Condition codes 94 */ 95 /*@{*/ 96 #define COND_GT 1 /**< greater than zero */ 97 #define COND_EQ 2 /**< equal to zero */ 98 #define COND_LT 3 /**< less than zero */ 99 #define COND_UN 4 /**< unordered (NaN) */ 100 #define COND_GE 5 /**< greater than or equal to zero */ 101 #define COND_LE 6 /**< less than or equal to zero */ 102 #define COND_NE 7 /**< not equal to zero */ 103 #define COND_TR 8 /**< always true */ 104 #define COND_FL 9 /**< always false */ 105 /*@}*/ 106 107 108 /** 109 * Instruction precision for GL_NV_fragment_program 110 */ 111 /*@{*/ 112 #define FLOAT32 0x1 113 #define FLOAT16 0x2 114 #define FIXED12 0x4 115 /*@}*/ 116 117 118 /** 119 * Saturation modes when storing values. 120 */ 121 /*@{*/ 122 #define SATURATE_OFF 0 123 #define SATURATE_ZERO_ONE 1 124 /*@}*/ 125 126 127 /** 128 * Per-component negation masks 129 */ 130 /*@{*/ 131 #define NEGATE_X 0x1 132 #define NEGATE_Y 0x2 133 #define NEGATE_Z 0x4 134 #define NEGATE_W 0x8 135 #define NEGATE_XYZ 0x7 136 #define NEGATE_XYZW 0xf 137 #define NEGATE_NONE 0x0 138 /*@}*/ 139 140 141 /** 142 * Program instruction opcodes for vertex, fragment and geometry programs. 143 */ 144 typedef enum prog_opcode { 145 /* ARB_vp ARB_fp NV_vp NV_fp GLSL */ 146 /*------------------------------------------*/ 147 OPCODE_NOP = 0, /* X */ 148 OPCODE_ABS, /* X X 1.1 X */ 149 OPCODE_ADD, /* X X X X X */ 150 OPCODE_AND, /* */ 151 OPCODE_ARA, /* 2 */ 152 OPCODE_ARL, /* X X X */ 153 OPCODE_ARL_NV, /* 2 */ 154 OPCODE_ARR, /* 2 */ 155 OPCODE_BGNLOOP, /* opt */ 156 OPCODE_BGNSUB, /* opt */ 157 OPCODE_BRA, /* 2 */ 158 OPCODE_BRK, /* 2 opt */ 159 OPCODE_CAL, /* 2 2 opt */ 160 OPCODE_CMP, /* X X */ 161 OPCODE_CONT, /* opt */ 162 OPCODE_COS, /* X 2 X X */ 163 OPCODE_DDX, /* X X */ 164 OPCODE_DDY, /* X X */ 165 OPCODE_DP2, /* 2 X */ 166 OPCODE_DP2A, /* 2 */ 167 OPCODE_DP3, /* X X X X X */ 168 OPCODE_DP4, /* X X X X X */ 169 OPCODE_DPH, /* X X 1.1 */ 170 OPCODE_DST, /* X X X X */ 171 OPCODE_ELSE, /* opt */ 172 OPCODE_EMIT_VERTEX,/* X */ 173 OPCODE_END, /* X X X X opt */ 174 OPCODE_END_PRIMITIVE,/* X */ 175 OPCODE_ENDIF, /* opt */ 176 OPCODE_ENDLOOP, /* opt */ 177 OPCODE_ENDSUB, /* opt */ 178 OPCODE_EX2, /* X X 2 X X */ 179 OPCODE_EXP, /* X X */ 180 OPCODE_FLR, /* X X 2 X X */ 181 OPCODE_FRC, /* X X 2 X X */ 182 OPCODE_IF, /* opt */ 183 OPCODE_KIL, /* X X */ 184 OPCODE_KIL_NV, /* X X */ 185 OPCODE_LG2, /* X X 2 X X */ 186 OPCODE_LIT, /* X X X X */ 187 OPCODE_LOG, /* X X */ 188 OPCODE_LRP, /* X X */ 189 OPCODE_MAD, /* X X X X X */ 190 OPCODE_MAX, /* X X X X X */ 191 OPCODE_MIN, /* X X X X X */ 192 OPCODE_MOV, /* X X X X X */ 193 OPCODE_MUL, /* X X X X X */ 194 OPCODE_NOISE1, /* X */ 195 OPCODE_NOISE2, /* X */ 196 OPCODE_NOISE3, /* X */ 197 OPCODE_NOISE4, /* X */ 198 OPCODE_NOT, /* */ 199 OPCODE_NRM3, /* */ 200 OPCODE_NRM4, /* */ 201 OPCODE_OR, /* */ 202 OPCODE_PK2H, /* X */ 203 OPCODE_PK2US, /* X */ 204 OPCODE_PK4B, /* X */ 205 OPCODE_PK4UB, /* X */ 206 OPCODE_POW, /* X X X X */ 207 OPCODE_POPA, /* 3 */ 208 OPCODE_PRINT, /* X X */ 209 OPCODE_PUSHA, /* 3 */ 210 OPCODE_RCC, /* 1.1 */ 211 OPCODE_RCP, /* X X X X X */ 212 OPCODE_RET, /* 2 2 opt */ 213 OPCODE_RFL, /* X X */ 214 OPCODE_RSQ, /* X X X X X */ 215 OPCODE_SCS, /* X X */ 216 OPCODE_SEQ, /* 2 X X */ 217 OPCODE_SFL, /* 2 X */ 218 OPCODE_SGE, /* X X X X X */ 219 OPCODE_SGT, /* 2 X X */ 220 OPCODE_SIN, /* X 2 X X */ 221 OPCODE_SLE, /* 2 X X */ 222 OPCODE_SLT, /* X X X X X */ 223 OPCODE_SNE, /* 2 X X */ 224 OPCODE_SSG, /* 2 X */ 225 OPCODE_STR, /* 2 X */ 226 OPCODE_SUB, /* X X 1.1 X X */ 227 OPCODE_SWZ, /* X X X */ 228 OPCODE_TEX, /* X 3 X X */ 229 OPCODE_TXB, /* X 3 X */ 230 OPCODE_TXD, /* X X */ 231 OPCODE_TXL, /* 3 2 X */ 232 OPCODE_TXP, /* X X */ 233 OPCODE_TXP_NV, /* 3 X */ 234 OPCODE_TRUNC, /* X */ 235 OPCODE_UP2H, /* X */ 236 OPCODE_UP2US, /* X */ 237 OPCODE_UP4B, /* X */ 238 OPCODE_UP4UB, /* X */ 239 OPCODE_X2D, /* X */ 240 OPCODE_XOR, /* */ 241 OPCODE_XPD, /* X X */ 242 MAX_OPCODE 243 } gl_inst_opcode; 244 245 246 /** 247 * Number of bits for the src/dst register Index field. 248 * This limits the size of temp/uniform register files. 249 */ 250 #define INST_INDEX_BITS 12 251 252 253 /** 254 * Instruction source register. 255 */ 256 struct prog_src_register 257 { 258 GLuint File:4; /**< One of the PROGRAM_* register file values. */ 259 GLint Index:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. 260 * May be negative for relative addressing. 261 */ 262 GLuint Swizzle:12; 263 GLuint RelAddr:1; 264 265 /** Take the component-wise absolute value */ 266 GLuint Abs:1; 267 268 /** 269 * Post-Abs negation. 270 * This will either be NEGATE_NONE or NEGATE_XYZW, except for the SWZ 271 * instruction which allows per-component negation. 272 */ 273 GLuint Negate:4; 274 275 /** 276 * Is the register two-dimensional. 277 * Two dimensional registers are of the 278 * REGISTER[index][index2] format. 279 * They are used by the geometry shaders where 280 * the first index is the index within an array 281 * and the second index is the semantic of the 282 * array, e.g. gl_PositionIn[index] would become 283 * INPUT[index][gl_PositionIn] 284 */ 285 GLuint HasIndex2:1; 286 GLuint RelAddr2:1; 287 GLint Index2:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. 288 * May be negative for relative 289 * addressing. */ 290 }; 291 292 293 /** 294 * Instruction destination register. 295 */ 296 struct prog_dst_register 297 { 298 GLuint File:4; /**< One of the PROGRAM_* register file values */ 299 GLuint Index:INST_INDEX_BITS; /**< Unsigned, never negative */ 300 GLuint WriteMask:4; 301 GLuint RelAddr:1; 302 303 /** 304 * \name Conditional destination update control. 305 * 306 * \since 307 * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, 308 * NV_vertex_program2_option. 309 */ 310 /*@{*/ 311 /** 312 * Takes one of the 9 possible condition values (EQ, FL, GT, GE, LE, LT, 313 * NE, TR, or UN). Dest reg is only written to if the matching 314 * (swizzled) condition code value passes. When a conditional update mask 315 * is not specified, this will be \c COND_TR. 316 */ 317 GLuint CondMask:4; 318 319 /** 320 * Condition code swizzle value. 321 */ 322 GLuint CondSwizzle:12; 323 324 /** 325 * Selects the condition code register to use for conditional destination 326 * update masking. In NV_fragmnet_program or NV_vertex_program2 mode, only 327 * condition code register 0 is available. In NV_vertex_program3 mode, 328 * condition code registers 0 and 1 are available. 329 */ 330 GLuint CondSrc:1; 331 /*@}*/ 332 }; 333 334 335 /** 336 * Vertex/fragment program instruction. 337 */ 338 struct prog_instruction 339 { 340 gl_inst_opcode Opcode; 341 struct prog_src_register SrcReg[3]; 342 struct prog_dst_register DstReg; 343 344 /** 345 * Indicates that the instruction should update the condition code 346 * register. 347 * 348 * \since 349 * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, 350 * NV_vertex_program2_option. 351 */ 352 GLuint CondUpdate:1; 353 354 /** 355 * If prog_instruction::CondUpdate is \c GL_TRUE, this value selects the 356 * condition code register that is to be updated. 357 * 358 * In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition 359 * code register 0 is available. In GL_NV_vertex_program3 mode, condition 360 * code registers 0 and 1 are available. 361 * 362 * \since 363 * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, 364 * NV_vertex_program2_option. 365 */ 366 GLuint CondDst:1; 367 368 /** 369 * Saturate each value of the vectored result to the range [0,1] or the 370 * range [-1,1]. \c SSAT mode (i.e., saturation to the range [-1,1]) is 371 * only available in NV_fragment_program2 mode. 372 * Value is one of the SATURATE_* tokens. 373 * 374 * \since 375 * NV_fragment_program, NV_fragment_program_option, NV_vertex_program3. 376 */ 377 GLuint SaturateMode:2; 378 379 /** 380 * Per-instruction selectable precision: FLOAT32, FLOAT16, FIXED12. 381 * 382 * \since 383 * NV_fragment_program, NV_fragment_program_option. 384 */ 385 GLuint Precision:3; 386 387 /** 388 * \name Extra fields for TEX, TXB, TXD, TXL, TXP instructions. 389 */ 390 /*@{*/ 391 /** Source texture unit. */ 392 GLuint TexSrcUnit:5; 393 394 /** Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX */ 395 GLuint TexSrcTarget:4; 396 397 /** True if tex instruction should do shadow comparison */ 398 GLuint TexShadow:1; 399 /*@}*/ 400 401 /** 402 * For BRA and CAL instructions, the location to jump to. 403 * For BGNLOOP, points to ENDLOOP (and vice-versa). 404 * For BRK, points to ENDLOOP 405 * For IF, points to ELSE or ENDIF. 406 * For ELSE, points to ENDIF. 407 */ 408 GLint BranchTarget; 409 410 /** for debugging purposes */ 411 const char *Comment; 412 413 /** Arbitrary data. Used for OPCODE_PRINT and some drivers */ 414 void *Data; 415 416 /** for driver use (try to remove someday) */ 417 GLint Aux; 418 }; 419 420 421 extern void 422 _mesa_init_instructions(struct prog_instruction *inst, GLuint count); 423 424 extern struct prog_instruction * 425 _mesa_alloc_instructions(GLuint numInst); 426 427 extern struct prog_instruction * 428 _mesa_realloc_instructions(struct prog_instruction *oldInst, 429 GLuint numOldInst, GLuint numNewInst); 430 431 extern struct prog_instruction * 432 _mesa_copy_instructions(struct prog_instruction *dest, 433 const struct prog_instruction *src, GLuint n); 434 435 extern void 436 _mesa_free_instructions(struct prog_instruction *inst, GLuint count); 437 438 extern GLuint 439 _mesa_num_inst_src_regs(gl_inst_opcode opcode); 440 441 extern GLuint 442 _mesa_num_inst_dst_regs(gl_inst_opcode opcode); 443 444 extern GLboolean 445 _mesa_is_tex_instruction(gl_inst_opcode opcode); 446 447 extern GLboolean 448 _mesa_check_soa_dependencies(const struct prog_instruction *inst); 449 450 extern const char * 451 _mesa_opcode_string(gl_inst_opcode opcode); 452 453 454 #endif /* PROG_INSTRUCTION_H */ 455