2
* Copyright 2000 Gareth Hughes
5
* Permission is hereby granted, free of charge, to any person obtaining a
6
* copy of this software and associated documentation files (the "Software"),
7
* to deal in the Software without restriction, including without limitation
8
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
* and/or sell copies of the Software, and to permit persons to whom the
10
* Software is furnished to do so, subject to the following conditions:
12
* The above copyright notice and this permission notice (including the next
13
* paragraph) shall be included in all copies or substantial portions of the
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* GARETH HUGHES BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
* Gareth Hughes <gareth@valinux.com>
27
#ifndef __MGA_SAREA_H__
28
#define __MGA_SAREA_H__
30
/* WARNING: If you change any of these defines, make sure to change
31
* the kernel include file as well (mga_drm.h)
33
#ifndef __MGA_SAREA_DEFINES__
34
#define __MGA_SAREA_DEFINES__
38
#define MGA_F 0x1 /* fog */
39
#define MGA_A 0x2 /* alpha */
40
#define MGA_S 0x4 /* specular */
41
#define MGA_T2 0x8 /* multitexture */
43
#define MGA_WARP_TGZ 0
44
#define MGA_WARP_TGZF (MGA_F)
45
#define MGA_WARP_TGZA (MGA_A)
46
#define MGA_WARP_TGZAF (MGA_F|MGA_A)
47
#define MGA_WARP_TGZS (MGA_S)
48
#define MGA_WARP_TGZSF (MGA_S|MGA_F)
49
#define MGA_WARP_TGZSA (MGA_S|MGA_A)
50
#define MGA_WARP_TGZSAF (MGA_S|MGA_F|MGA_A)
51
#define MGA_WARP_T2GZ (MGA_T2)
52
#define MGA_WARP_T2GZF (MGA_T2|MGA_F)
53
#define MGA_WARP_T2GZA (MGA_T2|MGA_A)
54
#define MGA_WARP_T2GZAF (MGA_T2|MGA_A|MGA_F)
55
#define MGA_WARP_T2GZS (MGA_T2|MGA_S)
56
#define MGA_WARP_T2GZSF (MGA_T2|MGA_S|MGA_F)
57
#define MGA_WARP_T2GZSA (MGA_T2|MGA_S|MGA_A)
58
#define MGA_WARP_T2GZSAF (MGA_T2|MGA_S|MGA_F|MGA_A)
60
#define MGA_MAX_G200_PIPES 8 /* no multitex */
61
#define MGA_MAX_G400_PIPES 16
62
#define MGA_MAX_WARP_PIPES MGA_MAX_G400_PIPES
63
#define MGA_WARP_UCODE_SIZE 32768 /* in bytes */
65
#define MGA_CARD_TYPE_G200 1
66
#define MGA_CARD_TYPE_G400 2
73
/* What needs to be changed for the current vertex dma buffer?
75
#define MGA_UPLOAD_CONTEXT 0x1
76
#define MGA_UPLOAD_TEX0 0x2
77
#define MGA_UPLOAD_TEX1 0x4
78
#define MGA_UPLOAD_PIPE 0x8
79
#define MGA_UPLOAD_TEX0IMAGE 0x10
80
#define MGA_UPLOAD_TEX1IMAGE 0x20
81
#define MGA_UPLOAD_2D 0x40
82
#define MGA_WAIT_AGE 0x80 /* handled client-side */
83
#define MGA_UPLOAD_CLIPRECTS 0x100 /* handled client-side */
85
#define MGA_DMA_FLUSH 0x200 /* set when someone gets the lock
89
/* 32 buffers of 64k each, total 1 meg.
91
#define MGA_BUFFER_SIZE (1 << 16)
92
#define MGA_NUM_BUFFERS 128
94
/* Keep these small for testing.
96
#define MGA_NR_SAREA_CLIPRECTS 8
98
/* 2 heaps (1 for card, 1 for agp), each divided into upto 128
99
* regions, subject to a minimum region size of (1<<16) == 64k.
101
* Clients may subdivide regions internally, but when sharing between
102
* clients, the region size is the minimum granularity.
105
#define MGA_CARD_HEAP 0
106
#define MGA_AGP_HEAP 1
107
#define MGA_NR_TEX_HEAPS 2
108
#define MGA_NR_TEX_REGIONS 16
109
#define MGA_LOG_MIN_TEX_REGION_SIZE 16
111
#endif /* __MGA_SAREA_DEFINES__ */
114
/* Setup registers for 3D context
118
unsigned int maccess;
121
unsigned int alphactrl;
122
unsigned int fogcolor;
124
unsigned int tdualstage0;
125
unsigned int tdualstage1;
127
unsigned int stencil;
128
unsigned int stencilctl;
129
} mga_context_regs_t;
131
/* Setup registers for 2D, X server
137
/* Setup registers for each texture unit
141
unsigned int texctl2;
142
unsigned int texfilter;
143
unsigned int texbordercol;
145
unsigned int texwidth;
146
unsigned int texheight;
147
unsigned int texorg1;
148
unsigned int texorg2;
149
unsigned int texorg3;
150
unsigned int texorg4;
151
} mga_texture_regs_t;
153
/* General ageing mechanism
156
unsigned int head; /* Position of head pointer */
157
unsigned int wrap; /* Primary DMA wrap count */
161
/* WARNING: Do not change the SAREA structure without changing the kernel
165
/* The channel for communication of state information to the kernel
166
* on firing a vertex dma buffer.
168
mga_context_regs_t ContextState;
169
mga_server_regs_t ServerState;
170
mga_texture_regs_t TexState[2];
171
unsigned int WarpPipe;
173
unsigned int vertsize;
175
/* The current cliprects, or a subset thereof.
177
drm_clip_rect_t boxes[MGA_NR_SAREA_CLIPRECTS];
180
/* Information about the most recently used 3d drawable. The
181
* client fills in the req_* fields, the server fills in the
182
* exported_ fields and puts the cliprects into boxes, above.
184
* The client clears the exported_drawable field before
185
* clobbering the boxes data.
187
unsigned int req_drawable; /* the X drawable id */
188
unsigned int req_draw_buffer; /* MGA_FRONT or MGA_BACK */
190
unsigned int exported_drawable;
191
unsigned int exported_index;
192
unsigned int exported_stamp;
193
unsigned int exported_buffers;
194
unsigned int exported_nfront; /* FIXME: verify signedness... */
195
unsigned int exported_nback;
196
int exported_back_x, exported_front_x, exported_w;
197
int exported_back_y, exported_front_y, exported_h;
198
drm_clip_rect_t exported_boxes[MGA_NR_SAREA_CLIPRECTS];
200
/* Counters for aging textures and for client-side throttling.
202
unsigned int status[4];
203
unsigned int last_wrap;
205
mga_age_t last_frame;
206
unsigned int last_enqueue; /* last time a buffer was enqueued */
207
unsigned int last_dispatch; /* age of the most recently dispatched buffer */
208
unsigned int last_quiescent; /* */
210
/* LRU lists for texture memory in agp space and on the card.
212
drmTextureRegion texList[MGA_NR_TEX_HEAPS][MGA_NR_TEX_REGIONS+1];
213
unsigned int texAge[MGA_NR_TEX_HEAPS];
215
/* Last context that uploaded statel
218
} MGASAREAPrivRec, *MGASAREAPrivPtr;