Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | /************************************************************************** |
2 | * |
||
3 | * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. |
||
4 | * All Rights Reserved. |
||
5 | * |
||
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
7 | * copy of this software and associated documentation files (the |
||
8 | * "Software"), to deal in the Software without restriction, including |
||
9 | * without limitation the rights to use, copy, modify, merge, publish, |
||
10 | * distribute, sub license, and/or sell copies of the Software, and to |
||
11 | * permit persons to whom the Software is furnished to do so, subject to |
||
12 | * the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice (including the |
||
15 | * next paragraph) shall be included in all copies or substantial portions |
||
16 | * of the Software. |
||
17 | * |
||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
19 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||
21 | * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR |
||
22 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||
23 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||
24 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | **************************************************************************/ |
||
27 | |||
28 | |||
29 | #ifndef I915_PROGRAM_H |
||
30 | #define I915_PROGRAM_H |
||
31 | |||
32 | #include "i915_context.h" |
||
33 | #include "i915_reg.h" |
||
34 | |||
35 | |||
36 | |||
37 | /* Having zero and one in here makes the definition of swizzle a lot |
||
38 | * easier. |
||
39 | */ |
||
40 | #define UREG_TYPE_SHIFT 29 |
||
41 | #define UREG_NR_SHIFT 24 |
||
42 | #define UREG_CHANNEL_X_NEGATE_SHIFT 23 |
||
43 | #define UREG_CHANNEL_X_SHIFT 20 |
||
44 | #define UREG_CHANNEL_Y_NEGATE_SHIFT 19 |
||
45 | #define UREG_CHANNEL_Y_SHIFT 16 |
||
46 | #define UREG_CHANNEL_Z_NEGATE_SHIFT 15 |
||
47 | #define UREG_CHANNEL_Z_SHIFT 12 |
||
48 | #define UREG_CHANNEL_W_NEGATE_SHIFT 11 |
||
49 | #define UREG_CHANNEL_W_SHIFT 8 |
||
50 | #define UREG_CHANNEL_ZERO_NEGATE_MBZ 5 |
||
51 | #define UREG_CHANNEL_ZERO_SHIFT 4 |
||
52 | #define UREG_CHANNEL_ONE_NEGATE_MBZ 1 |
||
53 | #define UREG_CHANNEL_ONE_SHIFT 0 |
||
54 | |||
55 | #define UREG_BAD 0xffffffff /* not a valid ureg */ |
||
56 | |||
57 | #define X SRC_X |
||
58 | #define Y SRC_Y |
||
59 | #define Z SRC_Z |
||
60 | #define W SRC_W |
||
61 | #define ZERO SRC_ZERO |
||
62 | #define ONE SRC_ONE |
||
63 | |||
64 | /* Construct a ureg: |
||
65 | */ |
||
66 | #define UREG( type, nr ) (((type)<< UREG_TYPE_SHIFT) | \ |
||
67 | ((nr) << UREG_NR_SHIFT) | \ |
||
68 | (X << UREG_CHANNEL_X_SHIFT) | \ |
||
69 | (Y << UREG_CHANNEL_Y_SHIFT) | \ |
||
70 | (Z << UREG_CHANNEL_Z_SHIFT) | \ |
||
71 | (W << UREG_CHANNEL_W_SHIFT) | \ |
||
72 | (ZERO << UREG_CHANNEL_ZERO_SHIFT) | \ |
||
73 | (ONE << UREG_CHANNEL_ONE_SHIFT)) |
||
74 | |||
75 | #define GET_CHANNEL_SRC( reg, channel ) ((reg<<(channel*4)) & (0xf<<20)) |
||
76 | #define CHANNEL_SRC( src, channel ) (src>>(channel*4)) |
||
77 | |||
78 | #define GET_UREG_TYPE(reg) (((reg)>>UREG_TYPE_SHIFT)®_TYPE_MASK) |
||
79 | #define GET_UREG_NR(reg) (((reg)>>UREG_NR_SHIFT)®_NR_MASK) |
||
80 | |||
81 | |||
82 | |||
83 | #define UREG_XYZW_CHANNEL_MASK 0x00ffff00 |
||
84 | |||
85 | /* One neat thing about the UREG representation: |
||
86 | */ |
||
87 | static INLINE int |
||
88 | swizzle(int reg, int x, int y, int z, int w) |
||
89 | { |
||
90 | return ((reg & ~UREG_XYZW_CHANNEL_MASK) | |
||
91 | CHANNEL_SRC(GET_CHANNEL_SRC(reg, x), 0) | |
||
92 | CHANNEL_SRC(GET_CHANNEL_SRC(reg, y), 1) | |
||
93 | CHANNEL_SRC(GET_CHANNEL_SRC(reg, z), 2) | |
||
94 | CHANNEL_SRC(GET_CHANNEL_SRC(reg, w), 3)); |
||
95 | } |
||
96 | |||
97 | /* Another neat thing about the UREG representation: |
||
98 | */ |
||
99 | static INLINE int |
||
100 | negate(int reg, int x, int y, int z, int w) |
||
101 | { |
||
102 | return reg ^ (((x & 1) << UREG_CHANNEL_X_NEGATE_SHIFT) | |
||
103 | ((y & 1) << UREG_CHANNEL_Y_NEGATE_SHIFT) | |
||
104 | ((z & 1) << UREG_CHANNEL_Z_NEGATE_SHIFT) | |
||
105 | ((w & 1) << UREG_CHANNEL_W_NEGATE_SHIFT)); |
||
106 | } |
||
107 | |||
108 | |||
109 | extern GLuint i915_get_temp(struct i915_fragment_program *p); |
||
110 | extern GLuint i915_get_utemp(struct i915_fragment_program *p); |
||
111 | extern void i915_release_utemps(struct i915_fragment_program *p); |
||
112 | |||
113 | |||
114 | extern GLuint i915_emit_texld(struct i915_fragment_program *p, |
||
115 | GLuint live_regs, |
||
116 | GLuint dest, |
||
117 | GLuint destmask, |
||
118 | GLuint sampler, GLuint coord, GLuint op); |
||
119 | |||
120 | extern GLuint i915_emit_arith(struct i915_fragment_program *p, |
||
121 | GLuint op, |
||
122 | GLuint dest, |
||
123 | GLuint mask, |
||
124 | GLuint saturate, |
||
125 | GLuint src0, GLuint src1, GLuint src2); |
||
126 | |||
127 | extern GLuint i915_emit_decl(struct i915_fragment_program *p, |
||
128 | GLuint type, GLuint nr, GLuint d0_flags); |
||
129 | |||
130 | |||
131 | extern GLuint i915_emit_const1f(struct i915_fragment_program *p, GLfloat c0); |
||
132 | |||
133 | extern GLuint i915_emit_const2f(struct i915_fragment_program *p, |
||
134 | GLfloat c0, GLfloat c1); |
||
135 | |||
136 | extern GLuint i915_emit_const4fv(struct i915_fragment_program *p, |
||
137 | const GLfloat * c); |
||
138 | |||
139 | extern GLuint i915_emit_const4f(struct i915_fragment_program *p, |
||
140 | GLfloat c0, GLfloat c1, |
||
141 | GLfloat c2, GLfloat c3); |
||
142 | |||
143 | |||
144 | extern GLuint i915_emit_param4fv(struct i915_fragment_program *p, |
||
145 | const GLfloat * values); |
||
146 | |||
147 | extern void i915_program_error(struct i915_fragment_program *p, |
||
148 | const char *fmt, ...); |
||
149 | |||
150 | extern void i915_init_program(struct i915_context *i915, |
||
151 | struct i915_fragment_program *p); |
||
152 | |||
153 | extern void i915_upload_program(struct i915_context *i915, |
||
154 | struct i915_fragment_program *p); |
||
155 | |||
156 | extern void i915_fini_program(struct i915_fragment_program *p); |
||
157 | |||
158 | extern void i915_update_program(struct gl_context *ctx); |
||
159 | |||
160 | #endif><>><>><>><>20)) |