xref: /aosp_15_r20/external/mesa3d/src/mesa/program/prog_instruction.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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