Properly input stencil info contributed by Wladimir.
[profile/ivi/mesa.git] / src / mesa / drivers / dri / r300 / r300_context.h
1 /*
2 Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /*
31  * Authors:
32  *   Keith Whitwell <keith@tungstengraphics.com>
33  *   Nicolai Haehnle <prefect_@gmx.net>
34  */
35
36 #ifndef __R300_CONTEXT_H__
37 #define __R300_CONTEXT_H__
38
39 #include "tnl/t_vertex.h"
40 #include "drm.h"
41 #include "radeon_drm.h"
42 #include "dri_util.h"
43 #include "texmem.h"
44
45 #include "macros.h"
46 #include "mtypes.h"
47 #include "colormac.h"
48 #include "radeon_context.h"
49
50 struct r300_context;
51 typedef struct r300_context r300ContextRec;
52 typedef struct r300_context *r300ContextPtr;
53
54 #include "radeon_lock.h"
55 #include "mm.h"
56
57
58 typedef GLuint uint32_t;
59 typedef GLubyte uint8_t;
60
61   /* We should probably change types within vertex_shader 
62       and pixel_shader structure later on */
63 #define CARD32 GLuint
64 #include "vertex_shader.h"
65 #include "pixel_shader.h"
66 #undef CARD32
67
68 static __inline__ uint32_t r300PackFloat32(float fl)
69 {
70         union { float fl; uint32_t u; } u;
71
72         u.fl = fl;
73         return u.u;
74 }
75
76
77 /************ DMA BUFFERS **************/
78
79 /* Need refcounting on dma buffers:
80  */
81 struct r300_dma_buffer {
82         int refcount;           /* the number of retained regions in buf */
83         drmBufPtr buf;
84 };
85
86 #define GET_START(rvb) (rmesa->radeon.radeonScreen->gart_buffer_offset +                \
87                         (rvb)->address - rmesa->dma.buf0_address +      \
88                         (rvb)->start)
89
90 /* A retained region, eg vertices for indexed vertices.
91  */
92 struct r300_dma_region {
93         struct r300_dma_buffer *buf;
94         char *address;          /* == buf->address */
95         int start, end, ptr;    /* offsets from start of buf */
96         int aos_start;
97         int aos_stride;
98         int aos_size;
99 };
100
101 struct r300_dma {
102         /* Active dma region.  Allocations for vertices and retained
103          * regions come from here.  Also used for emitting random vertices,
104          * these may be flushed by calling flush_current();
105          */
106         struct r300_dma_region current;
107
108         void (*flush) (r300ContextPtr);
109
110         char *buf0_address;     /* start of buf[0], for index calcs */
111         GLuint nr_released_bufs;        /* flush after so many buffers released */
112 };
113
114        /* Texture related */
115
116 #define TEX_0   0x1
117 #define TEX_1   0x2
118 #define TEX_2   0x4
119 #define TEX_3   0x8
120 #define TEX_4   0x10
121 #define TEX_5   0x20
122 #define TEX_6   0x40
123 #define TEX_7   0x80
124 #define TEX_ALL 0xff
125
126 typedef struct r300_tex_obj r300TexObj, *r300TexObjPtr;
127
128 /* Texture object in locally shared texture space.
129  */
130 struct r300_tex_obj {
131         driTextureObject base;
132
133         GLuint bufAddr;         /* Offset to start of locally
134                                    shared texture block */
135
136         GLuint dirty_state;     /* Flags (1 per texunit) for
137                                    whether or not this texobj
138                                    has dirty hardware state
139                                    (pp_*) that needs to be
140                                    brought into the
141                                    texunit. */
142
143         drm_radeon_tex_image_t image[6][RADEON_MAX_TEXTURE_LEVELS];
144         /* Six, for the cube faces */
145
146
147         /* hardware register values */
148         /* Note that R200 has 8 registers per texture and R300 only 7 */
149         GLuint filter;  
150         GLuint pitch; /* one of the unknown registers.. unknown 1 ?*/
151         GLuint size;    /* npot only */
152         GLuint format;
153         GLuint offset;  /* Image location in texmem.
154                                    All cube faces follow. */
155         GLuint unknown4;
156         GLuint unknown5; 
157         /* end hardware registers */
158         
159         /* registers computed by r200 code - keep them here to 
160            compare against what is actually written.
161            
162            to be removed later.. */
163         GLuint pp_border_color;
164         GLuint pp_cubic_faces;  /* cube face 1,2,3,4 log2 sizes */
165         GLuint format_x;
166         
167         
168         GLboolean border_fallback;
169 };
170
171 struct r300_texture_env_state {
172         r300TexObjPtr texobj;
173         GLenum format;
174         GLenum envMode;
175 };
176
177 #define R300_MAX_TEXTURE_UNITS 8
178
179 struct r300_texture_state {
180         struct r300_texture_env_state unit[R300_MAX_TEXTURE_UNITS];
181         int tc_count; /* number of incoming texture coordinates from VAP */
182 };
183
184 /**
185  * A block of hardware state.
186  *
187  * When check returns non-zero, the returned number of dwords must be
188  * copied verbatim into the command buffer in order to update a state atom
189  * when it is dirty.
190  */
191 struct r300_state_atom {
192         struct r300_state_atom *next, *prev;
193         const char* name;       /* for debug */
194         int cmd_size;           /* maximum size in dwords */
195         GLuint idx;             /* index in an array (e.g. textures) */
196         uint32_t* cmd;
197         GLboolean dirty;
198
199         int (*check)(r300ContextPtr, struct r300_state_atom* atom);
200 };
201
202
203 #define R300_VPT_CMD_0          0
204 #define R300_VPT_XSCALE         1
205 #define R300_VPT_XOFFSET        2
206 #define R300_VPT_YSCALE         3
207 #define R300_VPT_YOFFSET        4
208 #define R300_VPT_ZSCALE         5
209 #define R300_VPT_ZOFFSET        6
210 #define R300_VPT_CMDSIZE        7
211
212 #define R300_VIR_CMD_0          0 /* vir is variable size (at least 1) */
213 #define R300_VIR_CNTL_0         1
214 #define R300_VIR_CNTL_1         2
215 #define R300_VIR_CNTL_2         3
216 #define R300_VIR_CNTL_3         4
217 #define R300_VIR_CNTL_4         5
218 #define R300_VIR_CNTL_5         6
219 #define R300_VIR_CNTL_6         7
220 #define R300_VIR_CNTL_7         8
221 #define R300_VIR_CMDSIZE        9
222
223 #define R300_VIC_CMD_0          0
224 #define R300_VIC_CNTL_0         1
225 #define R300_VIC_CNTL_1         2
226 #define R300_VIC_CMDSIZE        3
227
228 #define R300_VOF_CMD_0          0
229 #define R300_VOF_CNTL_0         1
230 #define R300_VOF_CNTL_1         2
231 #define R300_VOF_CMDSIZE        3
232
233
234 #define R300_PVS_CMD_0          0
235 #define R300_PVS_CNTL_1         1
236 #define R300_PVS_CNTL_2         2
237 #define R300_PVS_CNTL_3         3
238 #define R300_PVS_CMDSIZE        4
239
240 #define R300_GB_MISC_CMD_0              0
241 #define R300_GB_MISC_MSPOS_0            1
242 #define R300_GB_MISC_MSPOS_1            2
243 #define R300_GB_MISC_TILE_CONFIG        3
244 #define R300_GB_MISC_SELECT             4
245 #define R300_GB_MISC_AA_CONFIG          5
246 #define R300_GB_MISC_CMDSIZE            6
247
248 #define R300_TXE_CMD_0          0
249 #define R300_TXE_ENABLE         1
250 #define R300_TXE_CMDSIZE        2
251
252 #define R300_PS_CMD_0           0
253 #define R300_PS_POINTSIZE       1
254 #define R300_PS_CMDSIZE         2
255
256 #define R300_CUL_CMD_0          0
257 #define R300_CUL_CULL           1
258 #define R300_CUL_CMDSIZE        2
259
260 #define R300_RC_CMD_0           0
261 #define R300_RC_CNTL_0          1
262 #define R300_RC_CNTL_1          2
263 #define R300_RC_CMDSIZE         3
264
265 #define R300_RI_CMD_0           0
266 #define R300_RI_INTERP_0        1
267 #define R300_RI_INTERP_1        2
268 #define R300_RI_INTERP_2        3
269 #define R300_RI_INTERP_3        4
270 #define R300_RI_INTERP_4        5
271 #define R300_RI_INTERP_5        6
272 #define R300_RI_INTERP_6        7
273 #define R300_RI_INTERP_7        8
274 #define R300_RI_CMDSIZE         9
275
276 #define R300_RR_CMD_0           0 /* rr is variable size (at least 1) */
277 #define R300_RR_ROUTE_0         1
278 #define R300_RR_ROUTE_1         2
279 #define R300_RR_ROUTE_2         3
280 #define R300_RR_ROUTE_3         4
281 #define R300_RR_ROUTE_4         5
282 #define R300_RR_ROUTE_5         6
283 #define R300_RR_ROUTE_6         7
284 #define R300_RR_ROUTE_7         8
285 #define R300_RR_CMDSIZE         9
286
287 #define R300_FP_CMD_0           0
288 #define R300_FP_CNTL0           1
289 #define R300_FP_CNTL1           2
290 #define R300_FP_CNTL2           3
291 #define R300_FP_CMD_1           4
292 #define R300_FP_NODE0           5
293 #define R300_FP_NODE1           6
294 #define R300_FP_NODE2           7
295 #define R300_FP_NODE3           8
296 #define R300_FP_CMDSIZE         9
297
298 #define R300_FPT_CMD_0          0
299 #define R300_FPT_INSTR_0        1
300 #define R300_FPT_CMDSIZE        65
301
302 #define R300_FPI_CMD_0          0
303 #define R300_FPI_INSTR_0        1
304 #define R300_FPI_CMDSIZE        65
305
306 #define R300_FPP_CMD_0          0
307 #define R300_FPP_PARAM_0        1
308 #define R300_FPP_CMDSIZE        (32*4+1)
309
310 #define R300_AT_CMD_0           0
311 #define R300_AT_ALPHA_TEST      1
312 #define R300_AT_UNKNOWN         2
313 #define R300_AT_CMDSIZE         3
314
315 #define R300_BLD_CMD_0          0
316 #define R300_BLD_CBLEND         1
317 #define R300_BLD_ABLEND         2
318 #define R300_BLD_CMDSIZE        3
319
320 #define R300_CMK_CMD_0          0
321 #define R300_CMK_COLORMASK      1
322 #define R300_CMK_CMDSIZE        2
323
324 #define R300_CB_CMD_0           0
325 #define R300_CB_OFFSET          1
326 #define R300_CB_CMD_1           2
327 #define R300_CB_PITCH           3
328 #define R300_CB_CMDSIZE         4
329
330 #define R300_ZS_CMD_0           0
331 #define R300_ZS_CNTL_0          1
332 #define R300_ZS_CNTL_1          2
333 #define R300_ZS_CNTL_2          3
334 #define R300_ZS_CMDSIZE         4
335
336 #define R300_ZB_CMD_0           0
337 #define R300_ZB_OFFSET          1
338 #define R300_ZB_PITCH           2
339 #define R300_ZB_CMDSIZE         3
340
341 #define R300_VPI_CMD_0          0
342 #define R300_VPI_INSTR_0        1
343 #define R300_VPI_CMDSIZE        1025 /* 256 16 byte instructions */
344
345 #define R300_VPP_CMD_0          0
346 #define R300_VPP_PARAM_0        1
347 #define R300_VPP_CMDSIZE        1025 /* 256 4-component parameters */
348
349 #define R300_VPS_CMD_0          0
350 #define R300_VPS_ZERO_0         1
351 #define R300_VPS_ZERO_1         2
352 #define R300_VPS_POINTSIZE      3
353 #define R300_VPS_ZERO_3         4
354 #define R300_VPS_CMDSIZE        5
355
356         /* the layout is common for all fields inside tex */
357 #define R300_TEX_CMD_0          0
358 #define R300_TEX_VALUE_0        1
359 /* We don't really use this, instead specify mtu+1 dynamically 
360 #define R300_TEX_CMDSIZE        (MAX_TEXTURE_UNITS+1)
361 */
362
363 /**
364  * Cache for hardware register state.
365  */
366 struct r300_hw_state {
367         struct r300_state_atom atomlist;
368
369         GLboolean       is_dirty;
370         GLboolean       all_dirty;
371         int             max_state_size; /* in dwords */
372
373         struct r300_state_atom vpt;     /* viewport (1D98) */
374         struct r300_state_atom unk2080; /* (2080) */
375         struct r300_state_atom vof;     /* VAP output format register 0x2090 */
376         struct r300_state_atom vte;     /* (20B0) */
377         struct r300_state_atom unk2134; /* (2134) */
378         struct r300_state_atom unk2140; /* (2140) */
379         struct r300_state_atom vir[2];  /* vap input route (2150/21E0) */
380         struct r300_state_atom vic;     /* vap input control (2180) */
381         struct r300_state_atom unk21DC; /* (21DC) */
382         struct r300_state_atom unk221C; /* (221C) */
383         struct r300_state_atom unk2220; /* (2220) */
384         struct r300_state_atom unk2288; /* (2288) */
385         struct r300_state_atom pvs;     /* pvs_cntl (22D0) */
386         struct r300_state_atom gb_enable; /* (4008) */
387         struct r300_state_atom gb_misc; /* Multisampling position shifts ? (4010) */
388         struct r300_state_atom unk4200; /* (4200) */
389         struct r300_state_atom unk4214; /* (4214) */
390         struct r300_state_atom ps;      /* pointsize (421C) */
391         struct r300_state_atom unk4230; /* (4230) */
392         struct r300_state_atom unk4260; /* (4260) */
393         struct r300_state_atom unk4274; /* (4274) */
394         struct r300_state_atom unk4288; /* (4288) */
395         struct r300_state_atom unk42A0; /* (42A0) */
396         struct r300_state_atom unk42B4; /* (42B4) */
397         struct r300_state_atom cul;     /* cull cntl (42B8) */
398         struct r300_state_atom unk42C0; /* (42C0) */
399         struct r300_state_atom rc;      /* rs control (4300) */
400         struct r300_state_atom ri;      /* rs interpolators (4310) */
401         struct r300_state_atom rr;      /* rs route (4330) */
402         struct r300_state_atom unk43A4; /* (43A4) */
403         struct r300_state_atom unk43E8; /* (43E8) */
404         struct r300_state_atom fp;      /* fragment program cntl + nodes (4600) */
405         struct r300_state_atom fpt;     /* texi - (4620) */
406         struct r300_state_atom unk46A4; /* (46A4) */
407         struct r300_state_atom fpi[4];  /* fp instructions (46C0/47C0/48C0/49C0) */
408         struct r300_state_atom unk4BC0; /* (4BC0) */
409         struct r300_state_atom unk4BC8; /* (4BC8) */
410         struct r300_state_atom at;      /* alpha test (4BD4) */
411         struct r300_state_atom unk4BD8; /* (4BD8) */
412         struct r300_state_atom fpp;     /* 0x4C00 and following */
413         struct r300_state_atom unk4E00; /* (4E00) */
414         struct r300_state_atom bld;     /* blending (4E04) */
415         struct r300_state_atom cmk;     /* colormask (4E0C) */
416         struct r300_state_atom unk4E10; /* (4E10) */
417         struct r300_state_atom cb;      /* colorbuffer (4E28) */
418         struct r300_state_atom unk4E50; /* (4E50) */
419         struct r300_state_atom unk4E88; /* (4E88) */
420         struct r300_state_atom unk4EA0; /* (4E88) I saw it only written on RV350 hardware..  */
421         struct r300_state_atom zs;      /* zstencil control (4F00) */
422         struct r300_state_atom unk4F10; /* (4F10) */
423         struct r300_state_atom zb;      /* z buffer (4F20) */
424         struct r300_state_atom unk4F28; /* (4F28) */
425         struct r300_state_atom unk4F30; /* (4F30) */
426         struct r300_state_atom unk4F44; /* (4F44) */
427         struct r300_state_atom unk4F54; /* (4F54) */
428
429         struct r300_state_atom vpi;     /* vp instructions */
430         struct r300_state_atom vpp;     /* vp parameters */
431         struct r300_state_atom vps;     /* vertex point size (?) */
432
433                 /* 8 texture units */
434                 /* the state is grouped by function and not by 
435                    texture unit. This makes single unit updates
436                    really awkward - we are much better off 
437                    updating the whole thing at once */
438         struct {
439                 struct r300_state_atom filter;
440                 struct r300_state_atom unknown1;
441                 struct r300_state_atom size;
442                 struct r300_state_atom format;
443                 struct r300_state_atom offset;
444                 struct r300_state_atom unknown4;
445                 struct r300_state_atom unknown5;
446                 struct r300_state_atom border_color;
447                 } tex;
448         struct r300_state_atom txe;     /* tex enable (4104) */
449 };
450
451
452 /**
453  * This structure holds the command buffer while it is being constructed.
454  *
455  * The first batch of commands in the buffer is always the state that needs
456  * to be re-emitted when the context is lost. This batch can be skipped
457  * otherwise.
458  */
459 struct r300_cmdbuf {
460         int             size;           /* DWORDs allocated for buffer */
461         uint32_t*       cmd_buf;
462         int             count_used;     /* DWORDs filled so far */
463         int             count_reemit;   /* size of re-emission batch */
464 };
465
466
467 /**
468  * State cache
469  */
470  
471 struct r300_depthbuffer_state {
472         GLfloat scale;
473 };
474
475 struct r300_vap_reg_state {
476            /* input register assigments */
477            int i_coords;
478            int i_color[2];
479            int i_tex[R300_MAX_TEXTURE_UNITS];
480         };
481
482 /* Vertex shader state */
483
484 /* 64 appears to be the maximum */
485 #define VSF_MAX_FRAGMENT_LENGTH 64
486
487
488 struct r300_vertex_shader_fragment {
489         int length;
490         union {
491                 GLuint d[VSF_MAX_FRAGMENT_LENGTH];  
492                 float f[VSF_MAX_FRAGMENT_LENGTH];
493                 VERTEX_SHADER_INSTRUCTION i[VSF_MAX_FRAGMENT_LENGTH/4];
494                 } body;
495         };
496
497 #define VSF_DEST_PROGRAM        0x0
498 #define VSF_DEST_MATRIX0        0x200
499 #define VSF_DEST_MATRIX1        0x204
500 #define VSF_DEST_MATRIX2        0x208
501 #define VSF_DEST_VECTOR0        0x20c
502 #define VSF_DEST_VECTOR1        0x20d
503 #define VSF_DEST_UNKNOWN1       0x400
504 #define VSF_DEST_UNKNOWN2       0x406
505
506 struct r300_vertex_shader_state {
507         struct r300_vertex_shader_fragment program;
508
509         /* a bit of a waste - each uses only a subset of allocated space..
510             but easier to program */
511         struct r300_vertex_shader_fragment matrix[3];
512         struct r300_vertex_shader_fragment vector[2];
513                 
514         struct r300_vertex_shader_fragment unknown1;
515         struct r300_vertex_shader_fragment unknown2;
516                 
517         int program_start;
518         int unknown_ptr1;  /* pointer within program space */
519         int program_end;
520                 
521         int param_offset;
522         int param_count;
523                 
524         int unknown_ptr2;  /* pointer within program space */
525         int unknown_ptr3;  /* pointer within program space */
526         };
527
528 /* 64 appears to be the maximum */
529 #define PSF_MAX_PROGRAM_LENGTH 64
530
531 struct r300_pixel_shader_program {
532         struct {
533                 int length;
534                 GLuint inst[PSF_MAX_PROGRAM_LENGTH];
535                 } tex;
536         
537         /* ALU intructions (logic and integer) */
538         struct {
539                 int length;
540                 struct {
541                         GLuint inst0;
542                         GLuint inst1;
543                         GLuint inst2;
544                         GLuint inst3;
545                         } inst[PSF_MAX_PROGRAM_LENGTH];
546                 } alu;
547         
548         /* node information */
549         /* nodes are used to synchronize ALU and TEX streams */
550         /* There could be up to 4 nodes each consisting of
551            a number of TEX instructions followed by some ALU
552            instructions */
553         /* the last node of a program should always be node3 */
554         struct {
555                 int tex_offset;
556                 int tex_end;            
557                 int alu_offset;
558                 int alu_end;
559                 } node[4];
560                 
561         int active_nodes;       /* must be between 1 and 4, inclusive */
562         int first_node_has_tex;  /* other nodes always have it */
563         
564         int temp_register_count;  /* magic value goes into PFS_CNTL_1 */
565         
566         /* entire program */
567         int tex_offset;
568         int tex_end;
569         int alu_offset;
570         int alu_end;
571         
572         };
573         
574         #define MAX_PIXEL_SHADER_PARAMS 32
575 struct r300_pixel_shader_state {
576         struct r300_pixel_shader_program program;
577         
578         /* parameters */                
579         int param_length;  /* to limit the number of unnecessary writes */
580         struct {
581                 float x;
582                 float y;
583                 float z;
584                 float w;
585                 } param[MAX_PIXEL_SHADER_PARAMS];
586         };
587         
588 /* 8 is somewhat bogus... it is probably something like 24 */
589 #define R300_MAX_AOS_ARRAYS             8
590
591 struct r300_aos_rec {
592         GLuint offset;
593         int element_size; /* in dwords */
594         int stride;       /* distance between elements, in dwords */
595         
596         #define AOS_FORMAT_FLOAT        1
597         #define AOS_FORMAT_UBYTE        2
598         #define AOS_FORMAT_FLOAT_COLOR  3
599         int format;     
600         
601         int ncomponents; /* number of components - between 1 and 4, inclusive */
602
603          /* just guesses */
604         #define REG_COORDS      0
605         #define REG_COLOR0      1
606         #define REG_TEX0        2
607         int reg; /* which register they are assigned to. */
608                         
609         };
610
611 struct r300_state {
612         struct r300_depthbuffer_state depth;
613         struct r300_texture_state texture;
614         struct r300_vap_reg_state vap_reg;
615         struct r300_vertex_shader_state vertex_shader;
616         struct r300_pixel_shader_state pixel_shader;
617         struct r300_aos_rec aos[R300_MAX_AOS_ARRAYS];
618         int aos_count;
619         
620         int hw_stencil;
621 };
622
623
624 /**
625  * R300 context structure.
626  */
627 struct r300_context {
628         struct radeon_context radeon; /* parent class, must be first */
629
630         struct r300_hw_state hw;
631         struct r300_cmdbuf cmdbuf;
632         struct r300_state state;
633         
634         /* Vertex buffers */
635         int elt_count;  /* size of the buffer for vertices */
636         int attrib_count; /* size of the buffer for vertex attributes.. Somehow it can be different ? */
637         
638
639         /* Vertex buffers
640          */
641         #if 0 /* we'll need it later, but not now */
642         struct r300_ioctl ioctl;
643         #endif
644         struct r300_dma dma;
645         GLboolean save_on_next_unlock;
646
647         /* Texture object bookkeeping
648          */
649         unsigned nr_heaps;
650         driTexHeap *texture_heaps[R200_NR_TEX_HEAPS];
651         driTextureObject swapped;
652         int texture_depth;
653         float initialMaxAnisotropy;
654
655         /* Clientdata textures;
656          */
657         GLuint prefer_gart_client_texturing;
658
659         /* TCL stuff
660          */
661         GLmatrix TexGenMatrix[R300_MAX_TEXTURE_UNITS];
662         GLboolean recheck_texgen[R300_MAX_TEXTURE_UNITS];
663         GLboolean TexGenNeedNormals[R300_MAX_TEXTURE_UNITS];
664         GLuint TexMatEnabled;
665         GLuint TexMatCompSel;
666         GLuint TexGenEnabled;
667         GLuint TexGenInputs;
668         GLuint TexGenCompSel;
669         GLmatrix tmpmat;
670 };
671
672 #define R300_CONTEXT(ctx)               ((r300ContextPtr)(ctx->DriverCtx))
673
674 extern void r300DestroyContext(__DRIcontextPrivate * driContextPriv);
675 extern GLboolean r300CreateContext(const __GLcontextModes * glVisual,
676                                    __DRIcontextPrivate * driContextPriv,
677                                    void *sharedContextPrivate);
678
679 #endif                          /* __R300_CONTEXT_H__ */