Rev 56 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
56 | pj | 1 | /* $XFree86$ */ |
2 | /************************************************************************** |
||
3 | |||
4 | Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas. |
||
5 | |||
6 | All Rights Reserved. |
||
7 | |||
8 | Permission is hereby granted, free of charge, to any person obtaining a |
||
9 | copy of this software and associated documentation files (the "Software"), |
||
10 | to deal in the Software without restriction, including without limitation |
||
11 | on the rights to use, copy, modify, merge, publish, distribute, sub |
||
12 | license, and/or sell copies of the Software, and to permit persons to whom |
||
13 | the Software is furnished to do so, subject to the following conditions: |
||
14 | |||
15 | The above copyright notice and this permission notice (including the next |
||
16 | paragraph) shall be included in all copies or substantial portions of the |
||
17 | Software. |
||
18 | |||
19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
21 | FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL |
||
22 | TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, |
||
23 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
||
24 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
||
25 | USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
26 | |||
27 | **************************************************************************/ |
||
28 | |||
29 | /* |
||
30 | * Authors: |
||
31 | * Keith Whitwell <keith@tungstengraphics.com> |
||
32 | * |
||
33 | */ |
||
34 | |||
35 | #ifndef __RADEON_VTXFMT_H__ |
||
36 | #define __RADEON_VTXFMT_H__ |
||
37 | |||
38 | #ifdef GLX_DIRECT_RENDERING |
||
39 | |||
40 | #include "_tnl__context.h" |
||
41 | |||
42 | extern void _tnl_UpdateVtxfmt( GLcontext *ctx ); |
||
43 | extern void _tnl_InitVtxfmt( GLcontext *ctx ); |
||
44 | extern void _tnl_InvalidateVtxfmt( GLcontext *ctx ); |
||
45 | extern void _tnl_DestroyVtxfmt( GLcontext *ctx ); |
||
46 | |||
47 | typedef void (*p4f)( GLfloat, GLfloat, GLfloat, GLfloat ); |
||
48 | typedef void (*p3f)( GLfloat, GLfloat, GLfloat ); |
||
49 | typedef void (*p2f)( GLfloat, GLfloat ); |
||
50 | typedef void (*p1f)( GLfloat ); |
||
51 | typedef void (*pe2f)( GLenum, GLfloat, GLfloat ); |
||
52 | typedef void (*pe1f)( GLenum, GLfloat ); |
||
53 | typedef void (*p4ub)( GLubyte, GLubyte, GLubyte, GLubyte ); |
||
54 | typedef void (*p3ub)( GLubyte, GLubyte, GLubyte ); |
||
55 | typedef void (*pfv)( const GLfloat * ); |
||
56 | typedef void (*pefv)( GLenum, const GLfloat * ); |
||
57 | typedef void (*pubv)( const GLubyte * ); |
||
58 | |||
59 | /* Want to keep a cache of these around. Each is parameterized by |
||
60 | * only a single value which has only a small range. Only expect a |
||
61 | * few, so just rescan the list each time? |
||
62 | */ |
||
63 | struct dynfn { |
||
64 | struct dynfn *next, *prev; |
||
65 | int key; |
||
66 | char *code; |
||
67 | }; |
||
68 | |||
69 | struct dfn_lists { |
||
70 | struct dynfn Vertex2f; |
||
71 | struct dynfn Vertex2fv; |
||
72 | struct dynfn Vertex3f; |
||
73 | struct dynfn Vertex3fv; |
||
74 | struct dynfn Color4ub; |
||
75 | struct dynfn Color4ubv; |
||
76 | struct dynfn Color3ub; |
||
77 | struct dynfn Color3ubv; |
||
78 | struct dynfn Color4f; |
||
79 | struct dynfn Color4fv; |
||
80 | struct dynfn Color3f; |
||
81 | struct dynfn Color3fv; |
||
82 | struct dynfn SecondaryColor3ubEXT; |
||
83 | struct dynfn SecondaryColor3ubvEXT; |
||
84 | struct dynfn SecondaryColor3fEXT; |
||
85 | struct dynfn SecondaryColor3fvEXT; |
||
86 | struct dynfn Normal3f; |
||
87 | struct dynfn Normal3fv; |
||
88 | struct dynfn TexCoord2f; |
||
89 | struct dynfn TexCoord2fv; |
||
90 | struct dynfn TexCoord1f; |
||
91 | struct dynfn TexCoord1fv; |
||
92 | struct dynfn MultiTexCoord2fARB; |
||
93 | struct dynfn MultiTexCoord2fvARB; |
||
94 | struct dynfn MultiTexCoord1fARB; |
||
95 | struct dynfn MultiTexCoord1fvARB; |
||
96 | }; |
||
97 | |||
98 | struct _vb; |
||
99 | |||
100 | struct dfn_generators { |
||
101 | struct dynfn *(*Vertex2f)( struct _vb *, int ); |
||
102 | struct dynfn *(*Vertex2fv)( struct _vb *, int ); |
||
103 | struct dynfn *(*Vertex3f)( struct _vb *, int ); |
||
104 | struct dynfn *(*Vertex3fv)( struct _vb *, int ); |
||
105 | struct dynfn *(*Color4ub)( struct _vb *, int ); |
||
106 | struct dynfn *(*Color4ubv)( struct _vb *, int ); |
||
107 | struct dynfn *(*Color3ub)( struct _vb *, int ); |
||
108 | struct dynfn *(*Color3ubv)( struct _vb *, int ); |
||
109 | struct dynfn *(*Color4f)( struct _vb *, int ); |
||
110 | struct dynfn *(*Color4fv)( struct _vb *, int ); |
||
111 | struct dynfn *(*Color3f)( struct _vb *, int ); |
||
112 | struct dynfn *(*Color3fv)( struct _vb *, int ); |
||
113 | struct dynfn *(*SecondaryColor3ubEXT)( struct _vb *, int ); |
||
114 | struct dynfn *(*SecondaryColor3ubvEXT)( struct _vb *, int ); |
||
115 | struct dynfn *(*SecondaryColor3fEXT)( struct _vb *, int ); |
||
116 | struct dynfn *(*SecondaryColor3fvEXT)( struct _vb *, int ); |
||
117 | struct dynfn *(*Normal3f)( struct _vb *, int ); |
||
118 | struct dynfn *(*Normal3fv)( struct _vb *, int ); |
||
119 | struct dynfn *(*TexCoord2f)( struct _vb *, int ); |
||
120 | struct dynfn *(*TexCoord2fv)( struct _vb *, int ); |
||
121 | struct dynfn *(*TexCoord1f)( struct _vb *, int ); |
||
122 | struct dynfn *(*TexCoord1fv)( struct _vb *, int ); |
||
123 | struct dynfn *(*MultiTexCoord2fARB)( struct _vb *, int ); |
||
124 | struct dynfn *(*MultiTexCoord2fvARB)( struct _vb *, int ); |
||
125 | struct dynfn *(*MultiTexCoord1fARB)( struct _vb *, int ); |
||
126 | struct dynfn *(*MultiTexCoord1fvARB)( struct _vb *, int ); |
||
127 | }; |
||
128 | |||
129 | struct prim { |
||
130 | GLuint start; |
||
131 | GLuint end; |
||
132 | GLuint prim; |
||
133 | }; |
||
134 | |||
135 | #define _TNL__MAX_PRIMS 64 |
||
136 | |||
137 | |||
138 | |||
139 | struct tnl_vbinfo { |
||
140 | /* Keep these first: referenced from codegen templates: |
||
141 | */ |
||
142 | GLint counter; |
||
143 | GLint *dmaptr; |
||
144 | void (*notify)( void ); |
||
145 | union { float f; int i; GLubyte ub4[4]; } vertex[16*4]; |
||
146 | |||
147 | GLfloat *attrptr[16]; |
||
148 | GLuint size[16]; |
||
149 | |||
150 | GLenum *prim; /* &ctx->Driver.CurrentExecPrimitive */ |
||
151 | GLuint primflags; |
||
152 | |||
153 | GLboolean installed; |
||
154 | GLboolean recheck; |
||
155 | |||
156 | GLint vertex_size; |
||
157 | GLint initial_counter; |
||
158 | GLint nrverts; |
||
159 | GLuint vertex_format; |
||
160 | |||
161 | GLuint installed_vertex_format; |
||
162 | |||
163 | struct prim primlist[RADEON_MAX_PRIMS]; |
||
164 | int nrprims; |
||
165 | |||
166 | struct dfn_lists dfn_cache; |
||
167 | struct dfn_generators codegen; |
||
168 | GLvertexformat vtxfmt; |
||
169 | }; |
||
170 | |||
171 | |||
172 | extern void _tnl_InitVtxfmtChoosers( GLvertexformat *vfmt ); |
||
173 | |||
174 | |||
175 | #define FIXUP( CODE, OFFSET, CHECKVAL, NEWVAL ) \ |
||
176 | do { \ |
||
177 | int *icode = (int *)(CODE+OFFSET); \ |
||
178 | assert (*icode == CHECKVAL); \ |
||
179 | *icode = (int)NEWVAL; \ |
||
180 | } while (0) |
||
181 | |||
182 | |||
183 | /* Useful for figuring out the offsets: |
||
184 | */ |
||
185 | #define FIXUP2( CODE, OFFSET, CHECKVAL, NEWVAL ) \ |
||
186 | do { \ |
||
187 | while (*(int *)(CODE+OFFSET) != CHECKVAL) OFFSET++; \ |
||
72 | giacomo | 188 | cprintf("%s/%d CVAL %x OFFSET %d\n", __FUNCTION__, \ |
56 | pj | 189 | __LINE__, CHECKVAL, OFFSET); \ |
190 | *(int *)(CODE+OFFSET) = (int)NEWVAL; \ |
||
191 | OFFSET += 4; \ |
||
192 | } while (0) |
||
193 | |||
194 | /* |
||
195 | */ |
||
196 | void _tnl_InitCodegen( struct dfn_generators *gen ); |
||
197 | void _tnl_InitX86Codegen( struct dfn_generators *gen ); |
||
198 | void _tnl_InitSSECodegen( struct dfn_generators *gen ); |
||
199 | |||
200 | void _tnl_copy_to_current( GLcontext *ctx ); |
||
201 | |||
202 | |||
203 | /* Defined in tnl_vtxfmt_c.c. |
||
204 | */ |
||
205 | struct dynfn *tnl_makeX86Vertex2f( TNLcontext *, int ); |
||
206 | struct dynfn *tnl_makeX86Vertex2fv( TNLcontext *, int ); |
||
207 | struct dynfn *tnl_makeX86Vertex3f( TNLcontext *, int ); |
||
208 | struct dynfn *tnl_makeX86Vertex3fv( TNLcontext *, int ); |
||
209 | struct dynfn *tnl_makeX86Color4ub( TNLcontext *, int ); |
||
210 | struct dynfn *tnl_makeX86Color4ubv( TNLcontext *, int ); |
||
211 | struct dynfn *tnl_makeX86Color3ub( TNLcontext *, int ); |
||
212 | struct dynfn *tnl_makeX86Color3ubv( TNLcontext *, int ); |
||
213 | struct dynfn *tnl_makeX86Color4f( TNLcontext *, int ); |
||
214 | struct dynfn *tnl_makeX86Color4fv( TNLcontext *, int ); |
||
215 | struct dynfn *tnl_makeX86Color3f( TNLcontext *, int ); |
||
216 | struct dynfn *tnl_makeX86Color3fv( TNLcontext *, int ); |
||
217 | struct dynfn *tnl_makeX86SecondaryColor3ubEXT( TNLcontext *, int ); |
||
218 | struct dynfn *tnl_makeX86SecondaryColor3ubvEXT( TNLcontext *, int ); |
||
219 | struct dynfn *tnl_makeX86SecondaryColor3fEXT( TNLcontext *, int ); |
||
220 | struct dynfn *tnl_makeX86SecondaryColor3fvEXT( TNLcontext *, int ); |
||
221 | struct dynfn *tnl_makeX86Normal3f( TNLcontext *, int ); |
||
222 | struct dynfn *tnl_makeX86Normal3fv( TNLcontext *, int ); |
||
223 | struct dynfn *tnl_makeX86TexCoord2f( TNLcontext *, int ); |
||
224 | struct dynfn *tnl_makeX86TexCoord2fv( TNLcontext *, int ); |
||
225 | struct dynfn *tnl_makeX86TexCoord1f( TNLcontext *, int ); |
||
226 | struct dynfn *tnl_makeX86TexCoord1fv( TNLcontext *, int ); |
||
227 | struct dynfn *tnl_makeX86MultiTexCoord2fARB( TNLcontext *, int ); |
||
228 | struct dynfn *tnl_makeX86MultiTexCoord2fvARB( TNLcontext *, int ); |
||
229 | struct dynfn *tnl_makeX86MultiTexCoord1fARB( TNLcontext *, int ); |
||
230 | struct dynfn *tnl_makeX86MultiTexCoord1fvARB( TNLcontext *, int ); |
||
231 | |||
232 | |||
233 | #endif |
||
234 | #endif |