1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5*61046927SAndroid Build Coastguard Worker * 6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 12*61046927SAndroid Build Coastguard Worker * 13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included 14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software. 15*61046927SAndroid Build Coastguard Worker * 16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE. 23*61046927SAndroid Build Coastguard Worker */ 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker /** 27*61046927SAndroid Build Coastguard Worker * \file prog_instruction.h 28*61046927SAndroid Build Coastguard Worker * 29*61046927SAndroid Build Coastguard Worker * Vertex/fragment program instruction datatypes and constants. 30*61046927SAndroid Build Coastguard Worker * 31*61046927SAndroid Build Coastguard Worker * \author Brian Paul 32*61046927SAndroid Build Coastguard Worker * \author Keith Whitwell 33*61046927SAndroid Build Coastguard Worker * \author Ian Romanick <[email protected]> 34*61046927SAndroid Build Coastguard Worker */ 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker #ifndef PROG_INSTRUCTION_H 38*61046927SAndroid Build Coastguard Worker #define PROG_INSTRUCTION_H 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker #include "util/glheader.h" 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker /** 45*61046927SAndroid Build Coastguard Worker * Swizzle indexes. 46*61046927SAndroid Build Coastguard Worker * Do not change! 47*61046927SAndroid Build Coastguard Worker */ 48*61046927SAndroid Build Coastguard Worker /*@{*/ 49*61046927SAndroid Build Coastguard Worker #define SWIZZLE_X 0 50*61046927SAndroid Build Coastguard Worker #define SWIZZLE_Y 1 51*61046927SAndroid Build Coastguard Worker #define SWIZZLE_Z 2 52*61046927SAndroid Build Coastguard Worker #define SWIZZLE_W 3 53*61046927SAndroid Build Coastguard Worker #define SWIZZLE_ZERO 4 /**< For SWZ instruction only */ 54*61046927SAndroid Build Coastguard Worker #define SWIZZLE_ONE 5 /**< For SWZ instruction only */ 55*61046927SAndroid Build Coastguard Worker #define SWIZZLE_NIL 7 /**< used during shader code gen (undefined value) */ 56*61046927SAndroid Build Coastguard Worker /*@}*/ 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker #define MAKE_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9)) 59*61046927SAndroid Build Coastguard Worker #define SWIZZLE_NOOP MAKE_SWIZZLE4(0,1,2,3) 60*61046927SAndroid Build Coastguard Worker #define GET_SWZ(swz, idx) (((swz) >> ((idx)*3)) & 0x7) 61*61046927SAndroid Build Coastguard Worker #define GET_BIT(msk, idx) (((msk) >> (idx)) & 0x1) 62*61046927SAndroid Build Coastguard Worker /** Determine if swz contains SWIZZLE_ZERO/ONE/NIL for any components. */ 63*61046927SAndroid Build Coastguard Worker #define HAS_EXTENDED_SWIZZLE(swz) (swz & 0x924) 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker #define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W) 66*61046927SAndroid Build Coastguard Worker #define SWIZZLE_XXXX MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X) 67*61046927SAndroid Build Coastguard Worker #define SWIZZLE_YYYY MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y) 68*61046927SAndroid Build Coastguard Worker #define SWIZZLE_ZZZZ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z) 69*61046927SAndroid Build Coastguard Worker #define SWIZZLE_WWWW MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W) 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker /** 72*61046927SAndroid Build Coastguard Worker * Per-component negation masks 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker /*@{*/ 75*61046927SAndroid Build Coastguard Worker #define NEGATE_X 0x1 76*61046927SAndroid Build Coastguard Worker #define NEGATE_Y 0x2 77*61046927SAndroid Build Coastguard Worker #define NEGATE_Z 0x4 78*61046927SAndroid Build Coastguard Worker #define NEGATE_W 0x8 79*61046927SAndroid Build Coastguard Worker #define NEGATE_XYZ 0x7 80*61046927SAndroid Build Coastguard Worker #define NEGATE_XYZW 0xf 81*61046927SAndroid Build Coastguard Worker #define NEGATE_NONE 0x0 82*61046927SAndroid Build Coastguard Worker /*@}*/ 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker 85*61046927SAndroid Build Coastguard Worker /** 86*61046927SAndroid Build Coastguard Worker * Program instruction opcodes for vertex, fragment and geometry programs. 87*61046927SAndroid Build Coastguard Worker */ 88*61046927SAndroid Build Coastguard Worker enum prog_opcode { 89*61046927SAndroid Build Coastguard Worker /* ARB_vp ARB_fp NV_vp NV_fp GLSL */ 90*61046927SAndroid Build Coastguard Worker /*------------------------------------------*/ 91*61046927SAndroid Build Coastguard Worker OPCODE_NOP = 0, /* X */ 92*61046927SAndroid Build Coastguard Worker OPCODE_ABS, /* X X 1.1 X */ 93*61046927SAndroid Build Coastguard Worker OPCODE_ADD, /* X X X X X */ 94*61046927SAndroid Build Coastguard Worker OPCODE_ARL, /* X X X */ 95*61046927SAndroid Build Coastguard Worker OPCODE_CMP, /* X X */ 96*61046927SAndroid Build Coastguard Worker OPCODE_COS, /* X 2 X X */ 97*61046927SAndroid Build Coastguard Worker OPCODE_DDX, /* X X */ 98*61046927SAndroid Build Coastguard Worker OPCODE_DDY, /* X X */ 99*61046927SAndroid Build Coastguard Worker OPCODE_DP2, /* 2 X */ 100*61046927SAndroid Build Coastguard Worker OPCODE_DP3, /* X X X X X */ 101*61046927SAndroid Build Coastguard Worker OPCODE_DP4, /* X X X X X */ 102*61046927SAndroid Build Coastguard Worker OPCODE_DPH, /* X X 1.1 */ 103*61046927SAndroid Build Coastguard Worker OPCODE_DST, /* X X X X */ 104*61046927SAndroid Build Coastguard Worker OPCODE_END, /* X X X X opt */ 105*61046927SAndroid Build Coastguard Worker OPCODE_EX2, /* X X 2 X X */ 106*61046927SAndroid Build Coastguard Worker OPCODE_EXP, /* X X */ 107*61046927SAndroid Build Coastguard Worker OPCODE_FLR, /* X X 2 X X */ 108*61046927SAndroid Build Coastguard Worker OPCODE_FRC, /* X X 2 X X */ 109*61046927SAndroid Build Coastguard Worker OPCODE_KIL, /* X X */ 110*61046927SAndroid Build Coastguard Worker OPCODE_LG2, /* X X 2 X X */ 111*61046927SAndroid Build Coastguard Worker OPCODE_LIT, /* X X X X */ 112*61046927SAndroid Build Coastguard Worker OPCODE_LOG, /* X X */ 113*61046927SAndroid Build Coastguard Worker OPCODE_LRP, /* X X */ 114*61046927SAndroid Build Coastguard Worker OPCODE_MAD, /* X X X X X */ 115*61046927SAndroid Build Coastguard Worker OPCODE_MAX, /* X X X X X */ 116*61046927SAndroid Build Coastguard Worker OPCODE_MIN, /* X X X X X */ 117*61046927SAndroid Build Coastguard Worker OPCODE_MOV, /* X X X X X */ 118*61046927SAndroid Build Coastguard Worker OPCODE_MUL, /* X X X X X */ 119*61046927SAndroid Build Coastguard Worker OPCODE_POW, /* X X X X */ 120*61046927SAndroid Build Coastguard Worker OPCODE_RCP, /* X X X X X */ 121*61046927SAndroid Build Coastguard Worker OPCODE_RSQ, /* X X X X X */ 122*61046927SAndroid Build Coastguard Worker OPCODE_SCS, /* X X */ 123*61046927SAndroid Build Coastguard Worker OPCODE_SGE, /* X X X X X */ 124*61046927SAndroid Build Coastguard Worker OPCODE_SIN, /* X 2 X X */ 125*61046927SAndroid Build Coastguard Worker OPCODE_SLT, /* X X X X X */ 126*61046927SAndroid Build Coastguard Worker OPCODE_SSG, /* 2 X */ 127*61046927SAndroid Build Coastguard Worker OPCODE_SUB, /* X X 1.1 X X */ 128*61046927SAndroid Build Coastguard Worker OPCODE_SWZ, /* X X X */ 129*61046927SAndroid Build Coastguard Worker OPCODE_TEX, /* X 3 X X */ 130*61046927SAndroid Build Coastguard Worker OPCODE_TXB, /* X 3 X */ 131*61046927SAndroid Build Coastguard Worker OPCODE_TXD, /* X X */ 132*61046927SAndroid Build Coastguard Worker OPCODE_TXL, /* 3 2 X */ 133*61046927SAndroid Build Coastguard Worker OPCODE_TXP, /* X X */ 134*61046927SAndroid Build Coastguard Worker OPCODE_XPD, /* X X */ 135*61046927SAndroid Build Coastguard Worker MAX_OPCODE 136*61046927SAndroid Build Coastguard Worker }; 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker 139*61046927SAndroid Build Coastguard Worker /** 140*61046927SAndroid Build Coastguard Worker * Number of bits for the src/dst register Index field. 141*61046927SAndroid Build Coastguard Worker * This limits the size of temp/uniform register files. 142*61046927SAndroid Build Coastguard Worker */ 143*61046927SAndroid Build Coastguard Worker #define INST_INDEX_BITS 12 144*61046927SAndroid Build Coastguard Worker 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker /** 147*61046927SAndroid Build Coastguard Worker * Instruction source register. 148*61046927SAndroid Build Coastguard Worker */ 149*61046927SAndroid Build Coastguard Worker struct prog_src_register 150*61046927SAndroid Build Coastguard Worker { 151*61046927SAndroid Build Coastguard Worker GLuint File:4; /**< One of the PROGRAM_* register file values. */ 152*61046927SAndroid Build Coastguard Worker GLint Index:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit. 153*61046927SAndroid Build Coastguard Worker * May be negative for relative addressing. 154*61046927SAndroid Build Coastguard Worker */ 155*61046927SAndroid Build Coastguard Worker GLuint Swizzle:12; 156*61046927SAndroid Build Coastguard Worker GLuint RelAddr:1; 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker /** 159*61046927SAndroid Build Coastguard Worker * Negation. 160*61046927SAndroid Build Coastguard Worker * This will either be NEGATE_NONE or NEGATE_XYZW, except for the SWZ 161*61046927SAndroid Build Coastguard Worker * instruction which allows per-component negation. 162*61046927SAndroid Build Coastguard Worker */ 163*61046927SAndroid Build Coastguard Worker GLuint Negate:4; 164*61046927SAndroid Build Coastguard Worker }; 165*61046927SAndroid Build Coastguard Worker 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker /** 168*61046927SAndroid Build Coastguard Worker * Instruction destination register. 169*61046927SAndroid Build Coastguard Worker */ 170*61046927SAndroid Build Coastguard Worker struct prog_dst_register 171*61046927SAndroid Build Coastguard Worker { 172*61046927SAndroid Build Coastguard Worker GLuint File:4; /**< One of the PROGRAM_* register file values */ 173*61046927SAndroid Build Coastguard Worker GLuint Index:INST_INDEX_BITS; /**< Unsigned, never negative */ 174*61046927SAndroid Build Coastguard Worker GLuint WriteMask:4; 175*61046927SAndroid Build Coastguard Worker GLuint RelAddr:1; 176*61046927SAndroid Build Coastguard Worker }; 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker /** 180*61046927SAndroid Build Coastguard Worker * Vertex/fragment program instruction. 181*61046927SAndroid Build Coastguard Worker */ 182*61046927SAndroid Build Coastguard Worker struct prog_instruction 183*61046927SAndroid Build Coastguard Worker { 184*61046927SAndroid Build Coastguard Worker enum prog_opcode Opcode; 185*61046927SAndroid Build Coastguard Worker struct prog_src_register SrcReg[3]; 186*61046927SAndroid Build Coastguard Worker struct prog_dst_register DstReg; 187*61046927SAndroid Build Coastguard Worker 188*61046927SAndroid Build Coastguard Worker /** 189*61046927SAndroid Build Coastguard Worker * Saturate each value of the vectored result to the range [0,1]. 190*61046927SAndroid Build Coastguard Worker * 191*61046927SAndroid Build Coastguard Worker * \since 192*61046927SAndroid Build Coastguard Worker * ARB_fragment_program 193*61046927SAndroid Build Coastguard Worker */ 194*61046927SAndroid Build Coastguard Worker GLuint Saturate:1; 195*61046927SAndroid Build Coastguard Worker 196*61046927SAndroid Build Coastguard Worker /** 197*61046927SAndroid Build Coastguard Worker * \name Extra fields for TEX, TXB, TXD, TXL, TXP instructions. 198*61046927SAndroid Build Coastguard Worker */ 199*61046927SAndroid Build Coastguard Worker /*@{*/ 200*61046927SAndroid Build Coastguard Worker /** Source texture unit. */ 201*61046927SAndroid Build Coastguard Worker GLuint TexSrcUnit:5; 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker /** Source texture target, one of TEXTURE_{1D,2D,3D,CUBE,RECT}_INDEX */ 204*61046927SAndroid Build Coastguard Worker GLuint TexSrcTarget:4; 205*61046927SAndroid Build Coastguard Worker 206*61046927SAndroid Build Coastguard Worker /** True if tex instruction should do shadow comparison */ 207*61046927SAndroid Build Coastguard Worker GLuint TexShadow:1; 208*61046927SAndroid Build Coastguard Worker /*@}*/ 209*61046927SAndroid Build Coastguard Worker }; 210*61046927SAndroid Build Coastguard Worker 211*61046927SAndroid Build Coastguard Worker 212*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 213*61046927SAndroid Build Coastguard Worker extern "C" { 214*61046927SAndroid Build Coastguard Worker #endif 215*61046927SAndroid Build Coastguard Worker 216*61046927SAndroid Build Coastguard Worker struct gl_program; 217*61046927SAndroid Build Coastguard Worker 218*61046927SAndroid Build Coastguard Worker extern void 219*61046927SAndroid Build Coastguard Worker _mesa_init_instructions(struct prog_instruction *inst, GLuint count); 220*61046927SAndroid Build Coastguard Worker 221*61046927SAndroid Build Coastguard Worker extern GLuint 222*61046927SAndroid Build Coastguard Worker _mesa_num_inst_src_regs(enum prog_opcode opcode); 223*61046927SAndroid Build Coastguard Worker 224*61046927SAndroid Build Coastguard Worker extern GLuint 225*61046927SAndroid Build Coastguard Worker _mesa_num_inst_dst_regs(enum prog_opcode opcode); 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker extern const char * 228*61046927SAndroid Build Coastguard Worker _mesa_opcode_string(enum prog_opcode opcode); 229*61046927SAndroid Build Coastguard Worker 230*61046927SAndroid Build Coastguard Worker 231*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 232*61046927SAndroid Build Coastguard Worker } /* extern "C" */ 233*61046927SAndroid Build Coastguard Worker #endif 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker #endif /* PROG_INSTRUCTION_H */ 236