r200_context.h revision 95a0bd6762737bb25bdf5c4147da9d1372f6aac3
1/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_context.h,v 1.2 2002/12/16 16:18:54 dawes Exp $ */
2/*
3Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
4
5The Weather Channel (TM) funded Tungsten Graphics to develop the
6initial release of the Radeon 8500 driver under the XFree86 license.
7This notice must be preserved.
8
9Permission is hereby granted, free of charge, to any person obtaining
10a copy of this software and associated documentation files (the
11"Software"), to deal in the Software without restriction, including
12without limitation the rights to use, copy, modify, merge, publish,
13distribute, sublicense, and/or sell copies of the Software, and to
14permit persons to whom the Software is furnished to do so, subject to
15the following conditions:
16
17The above copyright notice and this permission notice (including the
18next paragraph) shall be included in all copies or substantial
19portions of the Software.
20
21THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29**************************************************************************/
30
31/*
32 * Authors:
33 *   Keith Whitwell <keith@tungstengraphics.com>
34 */
35
36#ifndef __R200_CONTEXT_H__
37#define __R200_CONTEXT_H__
38
39#ifdef GLX_DIRECT_RENDERING
40
41#include "tnl/t_vertex.h"
42#include "drm.h"
43#include "radeon_drm.h"
44#include "dri_util.h"
45#include "texmem.h"
46
47#include "macros.h"
48#include "mtypes.h"
49#include "colormac.h"
50#include "r200_reg.h"
51
52#define ENABLE_HW_3D_TEXTURE 1  /* XXX this is temporary! */
53
54struct r200_context;
55typedef struct r200_context r200ContextRec;
56typedef struct r200_context *r200ContextPtr;
57
58#include "r200_lock.h"
59#include "r200_screen.h"
60#include "mm.h"
61
62/* Flags for software fallback cases */
63/* See correponding strings in r200_swtcl.c */
64#define R200_FALLBACK_TEXTURE           0x1
65#define R200_FALLBACK_DRAW_BUFFER       0x2
66#define R200_FALLBACK_STENCIL           0x4
67#define R200_FALLBACK_RENDER_MODE       0x8
68#define R200_FALLBACK_BLEND_EQ          0x10
69#define R200_FALLBACK_BLEND_FUNC        0x20
70#define R200_FALLBACK_DISABLE           0x40
71#define R200_FALLBACK_BORDER_MODE       0x80
72
73/* The blit width for texture uploads
74 */
75#define BLIT_WIDTH_BYTES 1024
76
77/* Use the templated vertex format:
78 */
79#define COLOR_IS_RGBA
80#define TAG(x) r200##x
81#include "tnl_dd/t_dd_vertex.h"
82#undef TAG
83
84typedef void (*r200_tri_func)( r200ContextPtr,
85				 r200Vertex *,
86				 r200Vertex *,
87				 r200Vertex * );
88
89typedef void (*r200_line_func)( r200ContextPtr,
90				  r200Vertex *,
91				  r200Vertex * );
92
93typedef void (*r200_point_func)( r200ContextPtr,
94				   r200Vertex * );
95
96
97struct r200_colorbuffer_state {
98   GLuint clear;
99   GLint drawOffset, drawPitch;
100   int roundEnable;
101};
102
103
104struct r200_depthbuffer_state {
105   GLfloat scale;
106};
107
108struct r200_pixel_state {
109   GLint readOffset, readPitch;
110};
111
112struct r200_scissor_state {
113   drm_clip_rect_t rect;
114   GLboolean enabled;
115
116   GLuint numClipRects;			/* Cliprects active */
117   GLuint numAllocedClipRects;		/* Cliprects available */
118   drm_clip_rect_t *pClipRects;
119};
120
121struct r200_stencilbuffer_state {
122   GLboolean hwBuffer;
123   GLuint clear;			/* rb3d_stencilrefmask value */
124};
125
126struct r200_stipple_state {
127   GLuint mask[32];
128};
129
130
131
132#define TEX_0   0x1
133#define TEX_1   0x2
134#define TEX_ALL 0x3
135
136typedef struct r200_tex_obj r200TexObj, *r200TexObjPtr;
137
138/* Texture object in locally shared texture space.
139 */
140struct r200_tex_obj {
141   driTextureObject   base;
142
143   GLuint bufAddr;			/* Offset to start of locally
144					   shared texture block */
145
146   GLuint dirty_state;		        /* Flags (1 per texunit) for
147					   whether or not this texobj
148					   has dirty hardware state
149					   (pp_*) that needs to be
150					   brought into the
151					   texunit. */
152
153   drm_radeon_tex_image_t image[6][RADEON_MAX_TEXTURE_LEVELS];
154					/* Six, for the cube faces */
155
156   GLuint pp_txfilter;		        /* hardware register values */
157   GLuint pp_txformat;
158   GLuint pp_txformat_x;
159   GLuint pp_txoffset;		        /* Image location in texmem.
160					   All cube faces follow. */
161   GLuint pp_txsize;		        /* npot only */
162   GLuint pp_txpitch;		        /* npot only */
163   GLuint pp_border_color;
164   GLuint pp_cubic_faces;	        /* cube face 1,2,3,4 log2 sizes */
165
166   GLboolean  border_fallback;
167};
168
169
170struct r200_texture_env_state {
171   r200TexObjPtr texobj;
172   GLenum format;
173   GLenum envMode;
174};
175
176#define R200_MAX_TEXTURE_UNITS 3
177
178struct r200_texture_state {
179   struct r200_texture_env_state unit[R200_MAX_TEXTURE_UNITS];
180};
181
182
183struct r200_state_atom {
184   struct r200_state_atom *next, *prev;
185   const char *name;		         /* for debug */
186   int cmd_size;		         /* size in bytes */
187   GLuint idx;
188   int *cmd;			         /* one or more cmd's */
189   int *lastcmd;			 /* one or more cmd's */
190   GLboolean dirty;
191   GLboolean (*check)( GLcontext *, int );    /* is this state active? */
192};
193
194
195
196/* Trying to keep these relatively short as the variables are becoming
197 * extravagently long.  Drop the driver name prefix off the front of
198 * everything - I think we know which driver we're in by now, and keep the
199 * prefix to 3 letters unless absolutely impossible.
200 */
201
202#define CTX_CMD_0             0
203#define CTX_PP_MISC           1
204#define CTX_PP_FOG_COLOR      2
205#define CTX_RE_SOLID_COLOR    3
206#define CTX_RB3D_BLENDCNTL    4
207#define CTX_RB3D_DEPTHOFFSET  5
208#define CTX_RB3D_DEPTHPITCH   6
209#define CTX_RB3D_ZSTENCILCNTL 7
210#define CTX_CMD_1             8
211#define CTX_PP_CNTL           9
212#define CTX_RB3D_CNTL         10
213#define CTX_RB3D_COLOROFFSET  11
214#define CTX_CMD_2             12 /* why */
215#define CTX_RB3D_COLORPITCH   13 /* why */
216#define CTX_STATE_SIZE        14
217
218#define SET_CMD_0               0
219#define SET_SE_CNTL             1
220#define SET_RE_CNTL             2 /* replace se_coord_fmt */
221#define SET_STATE_SIZE          3
222
223#define VTE_CMD_0               0
224#define VTE_SE_VTE_CNTL         1
225#define VTE_STATE_SIZE          2
226
227#define LIN_CMD_0               0
228#define LIN_RE_LINE_PATTERN     1
229#define LIN_RE_LINE_STATE       2
230#define LIN_CMD_1               3
231#define LIN_SE_LINE_WIDTH       4
232#define LIN_STATE_SIZE          5
233
234#define MSK_CMD_0               0
235#define MSK_RB3D_STENCILREFMASK 1
236#define MSK_RB3D_ROPCNTL        2
237#define MSK_RB3D_PLANEMASK      3
238#define MSK_STATE_SIZE          4
239
240#define VPT_CMD_0           0
241#define VPT_SE_VPORT_XSCALE          1
242#define VPT_SE_VPORT_XOFFSET         2
243#define VPT_SE_VPORT_YSCALE          3
244#define VPT_SE_VPORT_YOFFSET         4
245#define VPT_SE_VPORT_ZSCALE          5
246#define VPT_SE_VPORT_ZOFFSET         6
247#define VPT_STATE_SIZE      7
248
249#define ZBS_CMD_0               0
250#define ZBS_SE_ZBIAS_FACTOR     1
251#define ZBS_SE_ZBIAS_CONSTANT   2
252#define ZBS_STATE_SIZE          3
253
254#define MSC_CMD_0               0
255#define MSC_RE_MISC             1
256#define MSC_STATE_SIZE          2
257
258#define TAM_CMD_0               0
259#define TAM_DEBUG3              1
260#define TAM_STATE_SIZE          2
261
262#define TEX_CMD_0                   0
263#define TEX_PP_TXFILTER             1  /*2c00*/
264#define TEX_PP_TXFORMAT             2  /*2c04*/
265#define TEX_PP_TXFORMAT_X           3  /*2c08*/
266#define TEX_PP_TXSIZE               4  /*2c0c*/
267#define TEX_PP_TXPITCH              5  /*2c10*/
268#define TEX_PP_BORDER_COLOR         6  /*2c14*/
269#define TEX_CMD_1                   7
270#define TEX_PP_TXOFFSET             8  /*2d00 */
271#define TEX_STATE_SIZE              9
272
273#define CUBE_CMD_0                  0  /* 1 register follows */
274#define CUBE_PP_CUBIC_FACES         1  /* 0x2c18 */
275#define CUBE_CMD_1                  2  /* 5 registers follow */
276#define CUBE_PP_CUBIC_OFFSET_F1     3  /* 0x2d04 */
277#define CUBE_PP_CUBIC_OFFSET_F2     4  /* 0x2d08 */
278#define CUBE_PP_CUBIC_OFFSET_F3     5  /* 0x2d0c */
279#define CUBE_PP_CUBIC_OFFSET_F4     6  /* 0x2d10 */
280#define CUBE_PP_CUBIC_OFFSET_F5     7  /* 0x2d14 */
281#define CUBE_STATE_SIZE             8
282
283#define PIX_CMD_0                   0
284#define PIX_PP_TXCBLEND             1
285#define PIX_PP_TXCBLEND2            2
286#define PIX_PP_TXABLEND             3
287#define PIX_PP_TXABLEND2            4
288#define PIX_STATE_SIZE              5
289
290#define TF_CMD_0                    0
291#define TF_TFACTOR_0                1
292#define TF_TFACTOR_1                2
293#define TF_TFACTOR_2                3
294#define TF_TFACTOR_3                4
295#define TF_TFACTOR_4                5
296#define TF_TFACTOR_5                6
297#define TF_STATE_SIZE               7
298
299#define TCL_CMD_0                 0
300#define TCL_LIGHT_MODEL_CTL_0     1
301#define TCL_LIGHT_MODEL_CTL_1     2
302#define TCL_PER_LIGHT_CTL_0       3
303#define TCL_PER_LIGHT_CTL_1       4
304#define TCL_PER_LIGHT_CTL_2       5
305#define TCL_PER_LIGHT_CTL_3       6
306#define TCL_CMD_1                 7
307#define TCL_UCP_VERT_BLEND_CTL    8
308#define TCL_STATE_SIZE            9
309
310#define MSL_CMD_0                     0
311#define MSL_MATRIX_SELECT_0           1
312#define MSL_MATRIX_SELECT_1           2
313#define MSL_MATRIX_SELECT_2           3
314#define MSL_MATRIX_SELECT_3           4
315#define MSL_MATRIX_SELECT_4           5
316#define MSL_STATE_SIZE                6
317
318#define TCG_CMD_0                 0
319#define TCG_TEX_PROC_CTL_2            1
320#define TCG_TEX_PROC_CTL_3            2
321#define TCG_TEX_PROC_CTL_0            3
322#define TCG_TEX_PROC_CTL_1            4
323#define TCG_TEX_CYL_WRAP_CTL      5
324#define TCG_STATE_SIZE            6
325
326#define MTL_CMD_0            0
327#define MTL_EMMISSIVE_RED    1
328#define MTL_EMMISSIVE_GREEN  2
329#define MTL_EMMISSIVE_BLUE   3
330#define MTL_EMMISSIVE_ALPHA  4
331#define MTL_AMBIENT_RED      5
332#define MTL_AMBIENT_GREEN    6
333#define MTL_AMBIENT_BLUE     7
334#define MTL_AMBIENT_ALPHA    8
335#define MTL_DIFFUSE_RED      9
336#define MTL_DIFFUSE_GREEN    10
337#define MTL_DIFFUSE_BLUE     11
338#define MTL_DIFFUSE_ALPHA    12
339#define MTL_SPECULAR_RED     13
340#define MTL_SPECULAR_GREEN   14
341#define MTL_SPECULAR_BLUE    15
342#define MTL_SPECULAR_ALPHA   16
343#define MTL_CMD_1            17
344#define MTL_SHININESS        18
345#define MTL_STATE_SIZE       19
346
347#define VAP_CMD_0                   0
348#define VAP_SE_VAP_CNTL             1
349#define VAP_STATE_SIZE              2
350
351/* Replaces a lot of packet info from radeon
352 */
353#define VTX_CMD_0                   0
354#define VTX_VTXFMT_0            1
355#define VTX_VTXFMT_1            2
356#define VTX_TCL_OUTPUT_VTXFMT_0 3
357#define VTX_TCL_OUTPUT_VTXFMT_1 4
358#define VTX_CMD_1               5
359#define VTX_TCL_OUTPUT_COMPSEL  6
360#define VTX_CMD_2               7
361#define VTX_STATE_CNTL          8
362#define VTX_STATE_SIZE          9
363
364
365#define VTX_COLOR(v,n)   (((v)>>(R200_VTX_COLOR_0_SHIFT+(n)*2))&\
366                         R200_VTX_COLOR_MASK)
367
368/**
369 * Given the \c R200_SE_VTX_FMT_1 for the current vertex state, determine
370 * how many components are in texture coordinate \c n.
371 */
372#define VTX_TEXn_COUNT(v,n)   (((v) >> (3 * n)) & 0x07)
373
374#define MAT_CMD_0              0
375#define MAT_ELT_0              1
376#define MAT_STATE_SIZE         17
377
378#define GRD_CMD_0                  0
379#define GRD_VERT_GUARD_CLIP_ADJ    1
380#define GRD_VERT_GUARD_DISCARD_ADJ 2
381#define GRD_HORZ_GUARD_CLIP_ADJ    3
382#define GRD_HORZ_GUARD_DISCARD_ADJ 4
383#define GRD_STATE_SIZE             5
384
385/* position changes frequently when lighting in modelpos - separate
386 * out to new state item?
387 */
388#define LIT_CMD_0                  0
389#define LIT_AMBIENT_RED            1
390#define LIT_AMBIENT_GREEN          2
391#define LIT_AMBIENT_BLUE           3
392#define LIT_AMBIENT_ALPHA          4
393#define LIT_DIFFUSE_RED            5
394#define LIT_DIFFUSE_GREEN          6
395#define LIT_DIFFUSE_BLUE           7
396#define LIT_DIFFUSE_ALPHA          8
397#define LIT_SPECULAR_RED           9
398#define LIT_SPECULAR_GREEN         10
399#define LIT_SPECULAR_BLUE          11
400#define LIT_SPECULAR_ALPHA         12
401#define LIT_POSITION_X             13
402#define LIT_POSITION_Y             14
403#define LIT_POSITION_Z             15
404#define LIT_POSITION_W             16
405#define LIT_DIRECTION_X            17
406#define LIT_DIRECTION_Y            18
407#define LIT_DIRECTION_Z            19
408#define LIT_DIRECTION_W            20
409#define LIT_ATTEN_QUADRATIC        21
410#define LIT_ATTEN_LINEAR           22
411#define LIT_ATTEN_CONST            23
412#define LIT_ATTEN_XXX              24
413#define LIT_CMD_1                  25
414#define LIT_SPOT_DCD               26
415#define LIT_SPOT_DCM               27
416#define LIT_SPOT_EXPONENT          28
417#define LIT_SPOT_CUTOFF            29
418#define LIT_SPECULAR_THRESH        30
419#define LIT_RANGE_CUTOFF           31 /* ? */
420#define LIT_ATTEN_CONST_INV        32
421#define LIT_STATE_SIZE             33
422
423/* Fog
424 */
425#define FOG_CMD_0      0
426#define FOG_R          1
427#define FOG_C          2
428#define FOG_D          3
429#define FOG_PAD        4
430#define FOG_STATE_SIZE 5
431
432/* UCP
433 */
434#define UCP_CMD_0      0
435#define UCP_X          1
436#define UCP_Y          2
437#define UCP_Z          3
438#define UCP_W          4
439#define UCP_STATE_SIZE 5
440
441/* GLT - Global ambient
442 */
443#define GLT_CMD_0      0
444#define GLT_RED        1
445#define GLT_GREEN      2
446#define GLT_BLUE       3
447#define GLT_ALPHA      4
448#define GLT_STATE_SIZE 5
449
450/* EYE
451 */
452#define EYE_CMD_0          0
453#define EYE_X              1
454#define EYE_Y              2
455#define EYE_Z              3
456#define EYE_RESCALE_FACTOR 4
457#define EYE_STATE_SIZE     5
458
459/* CST - constant state
460 */
461#define CST_CMD_0                             0
462#define CST_PP_CNTL_X                         1
463#define CST_CMD_1                             2
464#define CST_RB3D_DEPTHXY_OFFSET               3
465#define CST_CMD_2                             4
466#define CST_RE_AUX_SCISSOR_CNTL               5
467#define CST_CMD_3                             6
468#define CST_RE_SCISSOR_TL_0                   7
469#define CST_RE_SCISSOR_BR_0                   8
470#define CST_CMD_4                             9
471#define CST_SE_VAP_CNTL_STATUS                10
472#define CST_CMD_5                             11
473#define CST_RE_POINTSIZE                      12
474#define CST_CMD_6                             13
475#define CST_SE_TCL_INPUT_VTX_0                14
476#define CST_SE_TCL_INPUT_VTX_1                15
477#define CST_SE_TCL_INPUT_VTX_2                16
478#define CST_SE_TCL_INPUT_VTX_3                17
479#define CST_STATE_SIZE                        18
480
481
482
483
484struct r200_hw_state {
485   /* All state should be on one of these lists:
486    */
487   struct r200_state_atom dirty; /* dirty list head placeholder */
488   struct r200_state_atom clean; /* clean list head placeholder */
489
490   /* Hardware state, stored as cmdbuf commands:
491    *   -- Need to doublebuffer for
492    *           - reviving state after loss of context
493    *           - eliding noop statechange loops? (except line stipple count)
494    */
495   struct r200_state_atom ctx;
496   struct r200_state_atom set;
497   struct r200_state_atom vte;
498   struct r200_state_atom lin;
499   struct r200_state_atom msk;
500   struct r200_state_atom vpt;
501   struct r200_state_atom vap;
502   struct r200_state_atom vtx;
503   struct r200_state_atom tcl;
504   struct r200_state_atom msl;
505   struct r200_state_atom tcg;
506   struct r200_state_atom msc;
507   struct r200_state_atom cst;
508   struct r200_state_atom tam;
509   struct r200_state_atom tf;
510   struct r200_state_atom tex[2];
511   struct r200_state_atom cube[2];
512   struct r200_state_atom zbs;
513   struct r200_state_atom mtl[2];
514   struct r200_state_atom mat[5];
515   struct r200_state_atom lit[8]; /* includes vec, scl commands */
516   struct r200_state_atom ucp[6];
517   struct r200_state_atom pix[6]; /* pixshader stages */
518   struct r200_state_atom eye; /* eye pos */
519   struct r200_state_atom grd; /* guard band clipping */
520   struct r200_state_atom fog;
521   struct r200_state_atom glt;
522};
523
524struct r200_state {
525   /* Derived state for internal purposes:
526    */
527   struct r200_colorbuffer_state color;
528   struct r200_depthbuffer_state depth;
529   struct r200_pixel_state pixel;
530   struct r200_scissor_state scissor;
531   struct r200_stencilbuffer_state stencil;
532   struct r200_stipple_state stipple;
533   struct r200_texture_state texture;
534};
535
536/* Need refcounting on dma buffers:
537 */
538struct r200_dma_buffer {
539   int refcount;		/* the number of retained regions in buf */
540   drmBufPtr buf;
541};
542
543#define GET_START(rvb) (rmesa->r200Screen->gart_buffer_offset +		\
544			(rvb)->address - rmesa->dma.buf0_address +	\
545			(rvb)->start)
546
547/* A retained region, eg vertices for indexed vertices.
548 */
549struct r200_dma_region {
550   struct r200_dma_buffer *buf;
551   char *address;		/* == buf->address */
552   int start, end, ptr;		/* offsets from start of buf */
553   int aos_start;
554   int aos_stride;
555   int aos_size;
556};
557
558
559struct r200_dma {
560   /* Active dma region.  Allocations for vertices and retained
561    * regions come from here.  Also used for emitting random vertices,
562    * these may be flushed by calling flush_current();
563    */
564   struct r200_dma_region current;
565
566   void (*flush)( r200ContextPtr );
567
568   char *buf0_address;		/* start of buf[0], for index calcs */
569   GLuint nr_released_bufs;	/* flush after so many buffers released */
570};
571
572struct r200_dri_mirror {
573   __DRIcontextPrivate	*context;	/* DRI context */
574   __DRIscreenPrivate	*screen;	/* DRI screen */
575   __DRIdrawablePrivate	*drawable;	/* DRI drawable bound to this ctx */
576
577   drmContext hwContext;
578   drm_hw_lock_t *hwLock;
579   int fd;
580   int drmMinor;
581};
582
583
584#define R200_CMD_BUF_SZ  (8*1024)
585
586struct r200_store {
587   GLuint statenr;
588   GLuint primnr;
589   char cmd_buf[R200_CMD_BUF_SZ];
590   int cmd_used;
591   int elts_start;
592};
593
594
595/* r200_tcl.c
596 */
597struct r200_tcl_info {
598   GLuint vertex_format;
599   GLint last_offset;
600   GLuint hw_primitive;
601
602   struct r200_dma_region *aos_components[8];
603   GLuint nr_aos_components;
604
605   GLuint *Elts;
606
607   struct r200_dma_region indexed_verts;
608   struct r200_dma_region obj;
609   struct r200_dma_region rgba;
610   struct r200_dma_region spec;
611   struct r200_dma_region fog;
612   struct r200_dma_region tex[R200_MAX_TEXTURE_UNITS];
613   struct r200_dma_region norm;
614};
615
616
617/* r200_swtcl.c
618 */
619struct r200_swtcl_info {
620   GLuint RenderIndex;
621
622   /**
623    * Size of a hardware vertex.  This is calculated when \c ::vertex_attrs is
624    * installed in the Mesa state vector.
625    */
626   GLuint vertex_size;
627
628   /**
629    * Attributes instructing the Mesa TCL pipeline where / how to put vertex
630    * data in the hardware buffer.
631    */
632   struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
633
634   /**
635    * Number of elements of \c ::vertex_attrs that are actually used.
636    */
637   GLuint vertex_attr_count;
638
639   /**
640    * Cached pointer to the buffer where Mesa will store vertex data.
641    */
642   GLubyte *verts;
643
644   /* Fallback rasterization functions
645    */
646   r200_point_func draw_point;
647   r200_line_func draw_line;
648   r200_tri_func draw_tri;
649
650   GLuint hw_primitive;
651   GLenum render_primitive;
652   GLuint numverts;
653
654   /**
655    * Offset of the 4UB color data within a hardware (swtcl) vertex.
656    */
657   GLuint coloroffset;
658
659   /**
660    * Offset of the 3UB specular color data within a hardware (swtcl) vertex.
661    */
662   GLuint specoffset;
663
664   /**
665    * Should Mesa project vertex data or will the hardware do it?
666    */
667   GLboolean needproj;
668
669   struct r200_dma_region indexed_verts;
670};
671
672
673struct r200_ioctl {
674   GLuint vertex_offset;
675   GLuint vertex_size;
676};
677
678
679
680#define R200_MAX_PRIMS 64
681
682
683/* Want to keep a cache of these around.  Each is parameterized by
684 * only a single value which has only a small range.  Only expect a
685 * few, so just rescan the list each time?
686 */
687struct dynfn {
688   struct dynfn *next, *prev;
689   int key[2];
690   char *code;
691};
692
693struct dfn_lists {
694   struct dynfn Vertex2f;
695   struct dynfn Vertex2fv;
696   struct dynfn Vertex3f;
697   struct dynfn Vertex3fv;
698   struct dynfn Color4ub;
699   struct dynfn Color4ubv;
700   struct dynfn Color3ub;
701   struct dynfn Color3ubv;
702   struct dynfn Color4f;
703   struct dynfn Color4fv;
704   struct dynfn Color3f;
705   struct dynfn Color3fv;
706   struct dynfn SecondaryColor3ubEXT;
707   struct dynfn SecondaryColor3ubvEXT;
708   struct dynfn SecondaryColor3fEXT;
709   struct dynfn SecondaryColor3fvEXT;
710   struct dynfn Normal3f;
711   struct dynfn Normal3fv;
712   struct dynfn TexCoord3f;
713   struct dynfn TexCoord3fv;
714   struct dynfn TexCoord2f;
715   struct dynfn TexCoord2fv;
716   struct dynfn TexCoord1f;
717   struct dynfn TexCoord1fv;
718   struct dynfn MultiTexCoord3fARB;
719   struct dynfn MultiTexCoord3fvARB;
720   struct dynfn MultiTexCoord2fARB;
721   struct dynfn MultiTexCoord2fvARB;
722   struct dynfn MultiTexCoord1fARB;
723   struct dynfn MultiTexCoord1fvARB;
724};
725
726struct dfn_generators {
727   struct dynfn *(*Vertex2f)( GLcontext *, const int * );
728   struct dynfn *(*Vertex2fv)( GLcontext *, const int * );
729   struct dynfn *(*Vertex3f)( GLcontext *, const int * );
730   struct dynfn *(*Vertex3fv)( GLcontext *, const int * );
731   struct dynfn *(*Color4ub)( GLcontext *, const int * );
732   struct dynfn *(*Color4ubv)( GLcontext *, const int * );
733   struct dynfn *(*Color3ub)( GLcontext *, const int * );
734   struct dynfn *(*Color3ubv)( GLcontext *, const int * );
735   struct dynfn *(*Color4f)( GLcontext *, const int * );
736   struct dynfn *(*Color4fv)( GLcontext *, const int * );
737   struct dynfn *(*Color3f)( GLcontext *, const int * );
738   struct dynfn *(*Color3fv)( GLcontext *, const int * );
739   struct dynfn *(*SecondaryColor3ubEXT)( GLcontext *, const int * );
740   struct dynfn *(*SecondaryColor3ubvEXT)( GLcontext *, const int * );
741   struct dynfn *(*SecondaryColor3fEXT)( GLcontext *, const int * );
742   struct dynfn *(*SecondaryColor3fvEXT)( GLcontext *, const int * );
743   struct dynfn *(*Normal3f)( GLcontext *, const int * );
744   struct dynfn *(*Normal3fv)( GLcontext *, const int * );
745   struct dynfn *(*TexCoord3f)( GLcontext *, const int * );
746   struct dynfn *(*TexCoord3fv)( GLcontext *, const int * );
747   struct dynfn *(*TexCoord2f)( GLcontext *, const int * );
748   struct dynfn *(*TexCoord2fv)( GLcontext *, const int * );
749   struct dynfn *(*TexCoord1f)( GLcontext *, const int * );
750   struct dynfn *(*TexCoord1fv)( GLcontext *, const int * );
751   struct dynfn *(*MultiTexCoord3fARB)( GLcontext *, const int * );
752   struct dynfn *(*MultiTexCoord3fvARB)( GLcontext *, const int * );
753   struct dynfn *(*MultiTexCoord2fARB)( GLcontext *, const int * );
754   struct dynfn *(*MultiTexCoord2fvARB)( GLcontext *, const int * );
755   struct dynfn *(*MultiTexCoord1fARB)( GLcontext *, const int * );
756   struct dynfn *(*MultiTexCoord1fvARB)( GLcontext *, const int * );
757};
758
759
760
761struct r200_prim {
762   GLuint start;
763   GLuint end;
764   GLuint prim;
765};
766
767struct r200_vbinfo {
768   GLint counter, initial_counter;
769   GLint *dmaptr;
770   void (*notify)( void );
771   GLint vertex_size;
772
773   /* A maximum total of 17 elements per vertex:  3 floats for position, 3
774    * floats for normal, 4 floats for color, 4 bytes for secondary color,
775    * 3 floats for each texture unit (6 floats total).
776    *
777    * As soon as the 3rd through 6th TMUs are supported, this value will grow.
778    *
779    * The position data is never actually stored here, so 3 elements could be
780    * trimmed out of the buffer.
781    */
782   union { float f; int i; r200_color_t color; } vertex[17];
783
784   GLfloat *normalptr;
785   GLfloat *floatcolorptr;
786   r200_color_t *colorptr;
787   GLfloat *floatspecptr;
788   r200_color_t *specptr;
789   GLfloat *texcoordptr[2];
790
791
792   GLenum *prim;		/* &ctx->Driver.CurrentExecPrimitive */
793   GLuint primflags;
794   GLboolean enabled;		/* *_NO_VTXFMT / *_NO_TCL env vars */
795   GLboolean installed;
796   GLboolean fell_back;
797   GLboolean recheck;
798   GLint nrverts;
799   GLuint vtxfmt_0, vtxfmt_1;
800
801   GLuint installed_vertex_format;
802   GLuint installed_color_3f_sz;
803
804   struct r200_prim primlist[R200_MAX_PRIMS];
805   int nrprims;
806
807   struct dfn_lists dfn_cache;
808   struct dfn_generators codegen;
809   GLvertexformat vtxfmt;
810};
811
812
813
814
815struct r200_context {
816   GLcontext *glCtx;			/* Mesa context */
817
818   /* Driver and hardware state management
819    */
820   struct r200_hw_state hw;
821   struct r200_state state;
822
823   /* Texture object bookkeeping
824    */
825   unsigned              nr_heaps;
826   driTexHeap          * texture_heaps[ R200_NR_TEX_HEAPS ];
827   driTextureObject      swapped;
828   int                   texture_depth;
829   float                 initialMaxAnisotropy;
830
831   /* Rasterization and vertex state:
832    */
833   GLuint TclFallback;
834   GLuint Fallback;
835   GLuint NewGLState;
836
837   /* Vertex buffers
838    */
839   struct r200_ioctl ioctl;
840   struct r200_dma dma;
841   struct r200_store store;
842
843   /* Page flipping
844    */
845   GLuint doPageFlip;
846
847   /* Busy waiting
848    */
849   GLuint do_usleeps;
850   GLuint do_irqs;
851   GLuint irqsEmitted;
852   drm_radeon_irq_wait_t iw;
853
854   /* Clientdata textures;
855    */
856   GLuint prefer_gart_client_texturing;
857
858   /* Drawable, cliprect and scissor information
859    */
860   GLuint numClipRects;			/* Cliprects for the draw buffer */
861   drm_clip_rect_t *pClipRects;
862   unsigned int lastStamp;
863   GLboolean lost_context;
864   r200ScreenPtr r200Screen;	/* Screen private DRI data */
865   drm_radeon_sarea_t *sarea;		/* Private SAREA data */
866
867   /* TCL stuff
868    */
869   GLmatrix TexGenMatrix[R200_MAX_TEXTURE_UNITS];
870   GLboolean recheck_texgen[R200_MAX_TEXTURE_UNITS];
871   GLboolean TexGenNeedNormals[R200_MAX_TEXTURE_UNITS];
872   GLuint TexMatEnabled;
873   GLuint TexMatCompSel;
874   GLuint TexGenEnabled;
875   GLuint TexGenInputs;
876   GLuint TexGenCompSel;
877   GLmatrix tmpmat;
878
879   /* VBI / buffer swap
880    */
881   GLuint vbl_seq;
882   GLuint vblank_flags;
883
884   int64_t swap_ust;
885   int64_t swap_missed_ust;
886
887   GLuint swap_count;
888   GLuint swap_missed_count;
889
890   PFNGLXGETUSTPROC get_ust;
891
892   /* r200_tcl.c
893    */
894   struct r200_tcl_info tcl;
895
896   /* r200_swtcl.c
897    */
898   struct r200_swtcl_info swtcl;
899
900   /* r200_vtxfmt.c
901    */
902   struct r200_vbinfo vb;
903
904   /* Mirrors of some DRI state
905    */
906   struct r200_dri_mirror dri;
907
908   /* Configuration cache
909    */
910   driOptionCache optionCache;
911};
912
913#define R200_CONTEXT(ctx)		((r200ContextPtr)(ctx->DriverCtx))
914
915
916static __inline GLuint r200PackColor( GLuint cpp,
917					GLubyte r, GLubyte g,
918					GLubyte b, GLubyte a )
919{
920   switch ( cpp ) {
921   case 2:
922      return PACK_COLOR_565( r, g, b );
923   case 4:
924      return PACK_COLOR_8888( a, r, g, b );
925   default:
926      return 0;
927   }
928}
929
930#define R200_OLD_PACKETS 0
931
932
933extern void r200DestroyContext( __DRIcontextPrivate *driContextPriv );
934extern GLboolean r200CreateContext( const __GLcontextModes *glVisual,
935				    __DRIcontextPrivate *driContextPriv,
936				    void *sharedContextPrivate);
937extern void r200SwapBuffers( __DRIdrawablePrivate *dPriv );
938extern GLboolean r200MakeCurrent( __DRIcontextPrivate *driContextPriv,
939				  __DRIdrawablePrivate *driDrawPriv,
940				  __DRIdrawablePrivate *driReadPriv );
941extern GLboolean r200UnbindContext( __DRIcontextPrivate *driContextPriv );
942
943/* ================================================================
944 * Debugging:
945 */
946#define DO_DEBUG		1
947
948#if DO_DEBUG
949extern int R200_DEBUG;
950#else
951#define R200_DEBUG		0
952#endif
953
954#define DEBUG_TEXTURE	0x001
955#define DEBUG_STATE	0x002
956#define DEBUG_IOCTL	0x004
957#define DEBUG_PRIMS	0x008
958#define DEBUG_VERTS	0x010
959#define DEBUG_FALLBACKS	0x020
960#define DEBUG_VFMT	0x040
961#define DEBUG_CODEGEN	0x080
962#define DEBUG_VERBOSE	0x100
963#define DEBUG_DRI       0x200
964#define DEBUG_DMA       0x400
965#define DEBUG_SANITY    0x800
966#define DEBUG_SYNC      0x1000
967#define DEBUG_PIXEL     0x2000
968#define DEBUG_MEMORY    0x4000
969
970#endif
971#endif /* __R200_CONTEXT_H__ */
972