Get Polygon offset fill to work.
[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 /* Checkpoint.. for convenience */
58 #define CPT     { fprintf(stderr, "%s:%s line %d\n", __FILE__, __FUNCTION__, __LINE__); }
59 #define WARN_ONCE(a)    { \
60         static int warn##__LINE__=1; \
61         if(warn##__LINE__){ \
62                 fprintf(stderr, "%s:%s line %d ***WARN_ONCE*** " a, \
63                         __FILE__, __FUNCTION__, __LINE__); \
64                 warn##__LINE__=0;\
65                 } \
66         }
67
68 typedef GLuint uint32_t;
69 typedef GLubyte uint8_t;
70
71   /* We should probably change types within vertex_shader
72       and pixel_shader structure later on */
73 #define CARD32 GLuint
74 #include "vertex_shader.h"
75 #include "pixel_shader.h"
76 #undef CARD32
77
78 static __inline__ uint32_t r300PackFloat32(float fl)
79 {
80         union { float fl; uint32_t u; } u;
81
82         u.fl = fl;
83         return u.u;
84 }
85
86
87 /************ DMA BUFFERS **************/
88
89 /* Need refcounting on dma buffers:
90  */
91 struct r300_dma_buffer {
92         int refcount;           /* the number of retained regions in buf */
93         drmBufPtr buf;
94 };
95
96 #define GET_START(rvb) (rmesa->radeon.radeonScreen->gart_buffer_offset +                \
97                         (rvb)->address - rmesa->dma.buf0_address +      \
98                         (rvb)->start)
99
100 /* A retained region, eg vertices for indexed vertices.
101  */
102 struct r300_dma_region {
103         struct r300_dma_buffer *buf;
104         char *address;          /* == buf->address */
105         int start, end, ptr;    /* offsets from start of buf */
106         int aos_start;
107         int aos_stride;
108         int aos_size;
109 };
110
111 struct r300_dma {
112         /* Active dma region.  Allocations for vertices and retained
113          * regions come from here.  Also used for emitting random vertices,
114          * these may be flushed by calling flush_current();
115          */
116         struct r300_dma_region current;
117
118         void (*flush) (r300ContextPtr);
119
120         char *buf0_address;     /* start of buf[0], for index calcs */
121         GLuint nr_released_bufs;        /* flush after so many buffers released */
122 };
123
124        /* Texture related */
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_ZBS_CMD_0          0
213 #define R300_ZBS_FACTOR         1
214 #define R300_ZBS_CONSTANT       2
215 #define R300_ZBS_CMDSIZE        3
216
217 #define R300_VIR_CMD_0          0 /* vir is variable size (at least 1) */
218 #define R300_VIR_CNTL_0         1
219 #define R300_VIR_CNTL_1         2
220 #define R300_VIR_CNTL_2         3
221 #define R300_VIR_CNTL_3         4
222 #define R300_VIR_CNTL_4         5
223 #define R300_VIR_CNTL_5         6
224 #define R300_VIR_CNTL_6         7
225 #define R300_VIR_CNTL_7         8
226 #define R300_VIR_CMDSIZE        9
227
228 #define R300_VIC_CMD_0          0
229 #define R300_VIC_CNTL_0         1
230 #define R300_VIC_CNTL_1         2
231 #define R300_VIC_CMDSIZE        3
232
233 #define R300_VOF_CMD_0          0
234 #define R300_VOF_CNTL_0         1
235 #define R300_VOF_CNTL_1         2
236 #define R300_VOF_CMDSIZE        3
237
238
239 #define R300_PVS_CMD_0          0
240 #define R300_PVS_CNTL_1         1
241 #define R300_PVS_CNTL_2         2
242 #define R300_PVS_CNTL_3         3
243 #define R300_PVS_CMDSIZE        4
244
245 #define R300_GB_MISC_CMD_0              0
246 #define R300_GB_MISC_MSPOS_0            1
247 #define R300_GB_MISC_MSPOS_1            2
248 #define R300_GB_MISC_TILE_CONFIG        3
249 #define R300_GB_MISC_SELECT             4
250 #define R300_GB_MISC_AA_CONFIG          5
251 #define R300_GB_MISC_CMDSIZE            6
252
253 #define R300_TXE_CMD_0          0
254 #define R300_TXE_ENABLE         1
255 #define R300_TXE_CMDSIZE        2
256
257 #define R300_PS_CMD_0           0
258 #define R300_PS_POINTSIZE       1
259 #define R300_PS_CMDSIZE         2
260
261 #define R300_CUL_CMD_0          0
262 #define R300_CUL_CULL           1
263 #define R300_CUL_CMDSIZE        2
264
265 #define R300_RC_CMD_0           0
266 #define R300_RC_CNTL_0          1
267 #define R300_RC_CNTL_1          2
268 #define R300_RC_CMDSIZE         3
269
270 #define R300_RI_CMD_0           0
271 #define R300_RI_INTERP_0        1
272 #define R300_RI_INTERP_1        2
273 #define R300_RI_INTERP_2        3
274 #define R300_RI_INTERP_3        4
275 #define R300_RI_INTERP_4        5
276 #define R300_RI_INTERP_5        6
277 #define R300_RI_INTERP_6        7
278 #define R300_RI_INTERP_7        8
279 #define R300_RI_CMDSIZE         9
280
281 #define R300_RR_CMD_0           0 /* rr is variable size (at least 1) */
282 #define R300_RR_ROUTE_0         1
283 #define R300_RR_ROUTE_1         2
284 #define R300_RR_ROUTE_2         3
285 #define R300_RR_ROUTE_3         4
286 #define R300_RR_ROUTE_4         5
287 #define R300_RR_ROUTE_5         6
288 #define R300_RR_ROUTE_6         7
289 #define R300_RR_ROUTE_7         8
290 #define R300_RR_CMDSIZE         9
291
292 #define R300_FP_CMD_0           0
293 #define R300_FP_CNTL0           1
294 #define R300_FP_CNTL1           2
295 #define R300_FP_CNTL2           3
296 #define R300_FP_CMD_1           4
297 #define R300_FP_NODE0           5
298 #define R300_FP_NODE1           6
299 #define R300_FP_NODE2           7
300 #define R300_FP_NODE3           8
301 #define R300_FP_CMDSIZE         9
302
303 #define R300_FPT_CMD_0          0
304 #define R300_FPT_INSTR_0        1
305 #define R300_FPT_CMDSIZE        65
306
307 #define R300_FPI_CMD_0          0
308 #define R300_FPI_INSTR_0        1
309 #define R300_FPI_CMDSIZE        65
310
311 #define R300_FPP_CMD_0          0
312 #define R300_FPP_PARAM_0        1
313 #define R300_FPP_CMDSIZE        (32*4+1)
314
315 #define R300_AT_CMD_0           0
316 #define R300_AT_ALPHA_TEST      1
317 #define R300_AT_UNKNOWN         2
318 #define R300_AT_CMDSIZE         3
319
320 #define R300_BLD_CMD_0          0
321 #define R300_BLD_CBLEND         1
322 #define R300_BLD_ABLEND         2
323 #define R300_BLD_CMDSIZE        3
324
325 #define R300_CMK_CMD_0          0
326 #define R300_CMK_COLORMASK      1
327 #define R300_CMK_CMDSIZE        2
328
329 #define R300_CB_CMD_0           0
330 #define R300_CB_OFFSET          1
331 #define R300_CB_CMD_1           2
332 #define R300_CB_PITCH           3
333 #define R300_CB_CMDSIZE         4
334
335 #define R300_ZS_CMD_0           0
336 #define R300_ZS_CNTL_0          1
337 #define R300_ZS_CNTL_1          2
338 #define R300_ZS_CNTL_2          3
339 #define R300_ZS_CMDSIZE         4
340
341 #define R300_ZB_CMD_0           0
342 #define R300_ZB_OFFSET          1
343 #define R300_ZB_PITCH           2
344 #define R300_ZB_CMDSIZE         3
345
346 #define R300_VPI_CMD_0          0
347 #define R300_VPI_INSTR_0        1
348 #define R300_VPI_CMDSIZE        1025 /* 256 16 byte instructions */
349
350 #define R300_VPP_CMD_0          0
351 #define R300_VPP_PARAM_0        1
352 #define R300_VPP_CMDSIZE        1025 /* 256 4-component parameters */
353
354 #define R300_VPS_CMD_0          0
355 #define R300_VPS_ZERO_0         1
356 #define R300_VPS_ZERO_1         2
357 #define R300_VPS_POINTSIZE      3
358 #define R300_VPS_ZERO_3         4
359 #define R300_VPS_CMDSIZE        5
360
361         /* the layout is common for all fields inside tex */
362 #define R300_TEX_CMD_0          0
363 #define R300_TEX_VALUE_0        1
364 /* We don't really use this, instead specify mtu+1 dynamically
365 #define R300_TEX_CMDSIZE        (MAX_TEXTURE_UNITS+1)
366 */
367
368 /**
369  * Cache for hardware register state.
370  */
371 struct r300_hw_state {
372         struct r300_state_atom atomlist;
373
374         GLboolean       is_dirty;
375         GLboolean       all_dirty;
376         int             max_state_size; /* in dwords */
377
378         struct r300_state_atom vpt;     /* viewport (1D98) */
379         struct r300_state_atom zbs;     /* zbias (1DB0) */
380         struct r300_state_atom unk2080; /* (2080) */
381         struct r300_state_atom vof;     /* VAP output format register 0x2090 */
382         struct r300_state_atom vte;     /* (20B0) */
383         struct r300_state_atom unk2134; /* (2134) */
384         struct r300_state_atom unk2140; /* (2140) */
385         struct r300_state_atom vir[2];  /* vap input route (2150/21E0) */
386         struct r300_state_atom vic;     /* vap input control (2180) */
387         struct r300_state_atom unk21DC; /* (21DC) */
388         struct r300_state_atom unk221C; /* (221C) */
389         struct r300_state_atom unk2220; /* (2220) */
390         struct r300_state_atom unk2288; /* (2288) */
391         struct r300_state_atom pvs;     /* pvs_cntl (22D0) */
392         struct r300_state_atom gb_enable; /* (4008) */
393         struct r300_state_atom gb_misc; /* Multisampling position shifts ? (4010) */
394         struct r300_state_atom unk4200; /* (4200) */
395         struct r300_state_atom unk4214; /* (4214) */
396         struct r300_state_atom ps;      /* pointsize (421C) */
397         struct r300_state_atom unk4230; /* (4230) */
398         struct r300_state_atom unk4260; /* (4260) */
399         struct r300_state_atom unk4274; /* (4274) */
400         struct r300_state_atom unk4288; /* (4288) */
401         struct r300_state_atom unk42A0; /* (42A0) */
402         struct r300_state_atom unk42B4; /* (42B4) */
403         struct r300_state_atom cul;     /* cull cntl (42B8) */
404         struct r300_state_atom unk42C0; /* (42C0) */
405         struct r300_state_atom rc;      /* rs control (4300) */
406         struct r300_state_atom ri;      /* rs interpolators (4310) */
407         struct r300_state_atom rr;      /* rs route (4330) */
408         struct r300_state_atom unk43A4; /* (43A4) */
409         struct r300_state_atom unk43E8; /* (43E8) */
410         struct r300_state_atom fp;      /* fragment program cntl + nodes (4600) */
411         struct r300_state_atom fpt;     /* texi - (4620) */
412         struct r300_state_atom unk46A4; /* (46A4) */
413         struct r300_state_atom fpi[4];  /* fp instructions (46C0/47C0/48C0/49C0) */
414         struct r300_state_atom unk4BC0; /* (4BC0) */
415         struct r300_state_atom unk4BC8; /* (4BC8) */
416         struct r300_state_atom at;      /* alpha test (4BD4) */
417         struct r300_state_atom unk4BD8; /* (4BD8) */
418         struct r300_state_atom fpp;     /* 0x4C00 and following */
419         struct r300_state_atom unk4E00; /* (4E00) */
420         struct r300_state_atom bld;     /* blending (4E04) */
421         struct r300_state_atom cmk;     /* colormask (4E0C) */
422         struct r300_state_atom unk4E10; /* (4E10) */
423         struct r300_state_atom cb;      /* colorbuffer (4E28) */
424         struct r300_state_atom unk4E50; /* (4E50) */
425         struct r300_state_atom unk4E88; /* (4E88) */
426         struct r300_state_atom unk4EA0; /* (4E88) I saw it only written on RV350 hardware..  */
427         struct r300_state_atom zs;      /* zstencil control (4F00) */
428         struct r300_state_atom unk4F10; /* (4F10) */
429         struct r300_state_atom zb;      /* z buffer (4F20) */
430         struct r300_state_atom unk4F28; /* (4F28) */
431         struct r300_state_atom unk4F30; /* (4F30) */
432         struct r300_state_atom unk4F44; /* (4F44) */
433         struct r300_state_atom unk4F54; /* (4F54) */
434
435         struct r300_state_atom vpi;     /* vp instructions */
436         struct r300_state_atom vpp;     /* vp parameters */
437         struct r300_state_atom vps;     /* vertex point size (?) */
438
439                 /* 8 texture units */
440                 /* the state is grouped by function and not by
441                    texture unit. This makes single unit updates
442                    really awkward - we are much better off
443                    updating the whole thing at once */
444         struct {
445                 struct r300_state_atom filter;
446                 struct r300_state_atom unknown1;
447                 struct r300_state_atom size;
448                 struct r300_state_atom format;
449                 struct r300_state_atom offset;
450                 struct r300_state_atom unknown4;
451                 struct r300_state_atom unknown5;
452                 //struct r300_state_atom border_color;
453                 } tex;
454         struct r300_state_atom txe;     /* tex enable (4104) */
455 };
456
457
458 /**
459  * This structure holds the command buffer while it is being constructed.
460  *
461  * The first batch of commands in the buffer is always the state that needs
462  * to be re-emitted when the context is lost. This batch can be skipped
463  * otherwise.
464  */
465 struct r300_cmdbuf {
466         int             size;           /* DWORDs allocated for buffer */
467         uint32_t*       cmd_buf;
468         int             count_used;     /* DWORDs filled so far */
469         int             count_reemit;   /* size of re-emission batch */
470 };
471
472
473 /**
474  * State cache
475  */
476
477 struct r300_depthbuffer_state {
478         GLfloat scale;
479 };
480
481 struct r300_vap_reg_state {
482            /* input register assigments */
483            int i_coords;
484            int i_normal;
485            int i_color[2];
486            int i_fog;
487            int i_tex[R300_MAX_TEXTURE_UNITS];
488            int i_index;
489            int i_pointsize;
490         };
491
492 /* Vertex shader state */
493
494 /* 64 appears to be the maximum */
495 #define VSF_MAX_FRAGMENT_LENGTH 64
496
497
498 struct r300_vertex_shader_fragment {
499         int length;
500         union {
501                 GLuint d[VSF_MAX_FRAGMENT_LENGTH];
502                 float f[VSF_MAX_FRAGMENT_LENGTH];
503                 VERTEX_SHADER_INSTRUCTION i[VSF_MAX_FRAGMENT_LENGTH/4];
504                 } body;
505         };
506
507 #define VSF_DEST_PROGRAM        0x0
508 #define VSF_DEST_MATRIX0        0x200
509 #define VSF_DEST_MATRIX1        0x204
510 #define VSF_DEST_MATRIX2        0x208
511 #define VSF_DEST_VECTOR0        0x20c
512 #define VSF_DEST_VECTOR1        0x20d
513 #define VSF_DEST_UNKNOWN1       0x400
514 #define VSF_DEST_UNKNOWN2       0x406
515
516 struct r300_vertex_shader_state {
517         struct r300_vertex_shader_fragment program;
518
519         /* a bit of a waste - each uses only a subset of allocated space..
520             but easier to program */
521         struct r300_vertex_shader_fragment matrix[3];
522         struct r300_vertex_shader_fragment vector[2];
523
524         struct r300_vertex_shader_fragment unknown1;
525         struct r300_vertex_shader_fragment unknown2;
526
527         int program_start;
528         int unknown_ptr1;  /* pointer within program space */
529         int program_end;
530
531         int param_offset;
532         int param_count;
533
534         int unknown_ptr2;  /* pointer within program space */
535         int unknown_ptr3;  /* pointer within program space */
536         };
537         
538 /* r300_vertex_shader_state and r300_vertex_program should probably be merged together someday.
539  * Keeping them them seperate for now should ensure fixed pipeline keeps functioning properly.
540  */     
541 struct r300_vertex_program {
542         struct vertex_program mesa_program; /* Must be first */
543         int translated;
544         
545         struct r300_vertex_shader_fragment program;
546         struct r300_vertex_shader_fragment params;
547         
548         int t2rs;
549         unsigned long num_temporaries; /* Number of temp vars used by program */
550         int inputs[VERT_ATTRIB_MAX];
551 };
552
553 /* 64 appears to be the maximum */
554 #define PSF_MAX_PROGRAM_LENGTH 64
555
556 struct r300_pixel_shader_program {
557         struct {
558                 int length;
559                 GLuint inst[PSF_MAX_PROGRAM_LENGTH];
560                 } tex;
561
562         /* ALU intructions (logic and integer) */
563         struct {
564                 int length;
565                 struct {
566                         GLuint inst0;
567                         GLuint inst1;
568                         GLuint inst2;
569                         GLuint inst3;
570                         } inst[PSF_MAX_PROGRAM_LENGTH];
571                 } alu;
572
573         /* node information */
574         /* nodes are used to synchronize ALU and TEX streams */
575         /* There could be up to 4 nodes each consisting of
576            a number of TEX instructions followed by some ALU
577            instructions */
578         /* the last node of a program should always be node3 */
579         struct {
580                 int tex_offset;
581                 int tex_end;
582                 int alu_offset;
583                 int alu_end;
584                 } node[4];
585
586         int active_nodes;       /* must be between 1 and 4, inclusive */
587         int first_node_has_tex;  /* other nodes always have it */
588
589         int temp_register_count;  /* magic value goes into PFS_CNTL_1 */
590
591         /* entire program */
592         int tex_offset;
593         int tex_end;
594         int alu_offset;
595         int alu_end;
596
597         };
598
599 #define MAX_PIXEL_SHADER_PARAMS 32
600 struct r300_pixel_shader_state {
601         struct r300_pixel_shader_program program;
602
603         /* parameters */
604         int param_length;  /* to limit the number of unnecessary writes */
605         struct {
606                 float x;
607                 float y;
608                 float z;
609                 float w;
610                 } param[MAX_PIXEL_SHADER_PARAMS];
611         };
612
613 /* 8 is somewhat bogus... it is probably something like 24 */
614 #define R300_MAX_AOS_ARRAYS             8
615
616 #define AOS_FORMAT_FLOAT        1
617 #define AOS_FORMAT_UBYTE        2
618 #define AOS_FORMAT_FLOAT_COLOR  3
619
620 #define REG_COORDS      0
621 #define REG_COLOR0      1
622 #define REG_TEX0        2
623
624 struct r300_aos_rec {
625         GLuint offset;
626         int element_size; /* in dwords */
627         int stride;       /* distance between elements, in dwords */
628
629         int format;
630
631         int ncomponents; /* number of components - between 1 and 4, inclusive */
632
633         int reg; /* which register they are assigned to. */
634
635         };
636
637 struct r300_state {
638         struct r300_depthbuffer_state depth;
639         struct r300_texture_state texture;
640         struct r300_vap_reg_state vap_reg;
641         struct r300_vertex_shader_state vertex_shader;
642         struct r300_pixel_shader_state pixel_shader;
643         struct r300_aos_rec aos[R300_MAX_AOS_ARRAYS];
644         int aos_count;
645
646         int hw_stencil;
647 };
648
649
650 /**
651  * R300 context structure.
652  */
653 struct r300_context {
654         struct radeon_context radeon; /* parent class, must be first */
655
656         struct r300_hw_state hw;
657         struct r300_cmdbuf cmdbuf;
658         struct r300_state state;
659
660         /* Vertex buffers
661          */
662         struct r300_dma dma;
663         GLboolean save_on_next_unlock;
664
665         /* Texture object bookkeeping
666          */
667         unsigned nr_heaps;
668         driTexHeap *texture_heaps[R200_NR_TEX_HEAPS];
669         driTextureObject swapped;
670         int texture_depth;
671         float initialMaxAnisotropy;
672
673         /* Clientdata textures;
674          */
675         GLuint prefer_gart_client_texturing;
676
677         /* TCL stuff
678          */
679         GLmatrix TexGenMatrix[R300_MAX_TEXTURE_UNITS];
680         GLboolean recheck_texgen[R300_MAX_TEXTURE_UNITS];
681         GLboolean TexGenNeedNormals[R300_MAX_TEXTURE_UNITS];
682         GLuint TexMatEnabled;
683         GLuint TexMatCompSel;
684         GLuint TexGenEnabled;
685         GLuint TexGenInputs;
686         GLuint TexGenCompSel;
687         GLmatrix tmpmat;
688         
689         struct r300_vertex_program *current_vp;
690 };
691
692 #define R300_CONTEXT(ctx)               ((r300ContextPtr)(ctx->DriverCtx))
693
694 extern void r300DestroyContext(__DRIcontextPrivate * driContextPriv);
695 extern GLboolean r300CreateContext(const __GLcontextModes * glVisual,
696                                    __DRIcontextPrivate * driContextPriv,
697                                    void *sharedContextPrivate);
698
699 extern void r300InitVertexProgFuncs(struct dd_function_table *functions);
700 extern void r300VertexProgUpdateParams(GLcontext *ctx, struct r300_vertex_program *vp);
701
702 #endif                          /* __R300_CONTEXT_H__ */