2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
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, sub license,
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
13 * next paragraph) shall be included in all copies or substantial portions
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 NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
27 #ifndef SAVAGECONTEXT_INC
28 #define SAVAGECONTEXT_INC
30 typedef struct savage_context_t savageContext
;
31 typedef struct savage_context_t
*savageContextPtr
;
32 typedef struct savage_texture_object_t
*savageTextureObjectPtr
;
34 #include <X11/Xlibint.h>
39 #include "savage_drm.h"
40 #include "savage_init.h"
42 #include "tnl/t_vertex.h"
44 #include "savagetex.h"
45 #include "savagedma.h"
47 /* Reasons to fallback on all primitives.
49 #define SAVAGE_FALLBACK_TEXTURE 0x1
50 #define SAVAGE_FALLBACK_DRAW_BUFFER 0x2
51 #define SAVAGE_FALLBACK_READ_BUFFER 0x4
52 #define SAVAGE_FALLBACK_COLORMASK 0x8
53 #define SAVAGE_FALLBACK_STIPPLE 0x10
54 #define SAVAGE_FALLBACK_SPECULAR 0x20
55 #define SAVAGE_FALLBACK_LOGICOP 0x40
56 /*frank 2001/11/12 add the stencil fallbak*/
57 #define SAVAGE_FALLBACK_STENCIL 0x80
58 #define SAVAGE_FALLBACK_RENDERMODE 0x100
59 #define SAVAGE_FALLBACK_BLEND_EQ 0x200
64 /* for savagectx.new_state - manage GL->driver state changes
66 #define SAVAGE_NEW_TEXTURE 0x1
67 #define SAVAGE_NEW_CULL 0x2
70 /*define the max numer of vertex in vertex buf*/
71 #define SAVAGE_MAX_VERTEXS 0x10000
73 /* Use the templated vertex formats:
75 #define TAG(x) savage##x
76 #include "tnl_dd/t_dd_vertex.h"
79 typedef void (*savage_tri_func
)( savageContextPtr
, savageVertex
*,
80 savageVertex
*, savageVertex
* );
81 typedef void (*savage_line_func
)( savageContextPtr
,
82 savageVertex
*, savageVertex
* );
83 typedef void (*savage_point_func
)( savageContextPtr
, savageVertex
* );
86 /**************************************************************
87 **************** enums for chip IDs ************************
88 **************************************************************/
90 #define CHIP_S3GX3MS1NB 0x8A25
91 #define CHIP_S3GX3MS1NBK 0x8A26
92 #define CHIP_S3TWISTER 0x8D01
93 #define CHIP_S3TWISTERK 0x8D02
94 #define CHIP_S3TWISTER_P4M 0x8D04
95 #define CHIP_S3PARAMOUNT128 0x8C22 /*SuperSavage 128/MX*/
96 #define CHIP_S3TRISTAR128SDR 0x8C2A /*SuperSavage 128/IX*/
97 #define CHIP_S3TRISTAR64SDRM7 0x8C2C /*SuperSavage/IX M7 Package*/
98 #define CHIP_S3TRISTAR64SDR 0x8C2E /*SuperSavage/IX*/
99 #define CHIP_S3TRISTAR64CDDR 0x8C2F /*SuperSavage/IXC DDR*/
101 #define IS_SAVAGE(imesa) (imesa->savageScreen->deviceID == CHIP_S3GX3MS1NB || \
102 imesa->savageScreen->deviceID == CHIP_S3GX3MS1NBK || \
103 imesa->savageScreen->deviceID == CHIP_S3TWISTER || \
104 imesa->savageScreen->deviceID == CHIP_S3TWISTERK || \
105 imesa->savageScreen->deviceID == CHIP_S3TWISTER_P4M || \
106 imesa->savageScreen->deviceID == CHIP_S3PARAMOUNT128 || \
107 imesa->savageScreen->deviceID == CHIP_S3TRISTAR128SDR || \
108 imesa->savageScreen->deviceID == CHIP_S3TRISTAR64SDRM7 || \
109 imesa->savageScreen->deviceID == CHIP_S3TRISTAR64SDR || \
110 imesa->savageScreen->deviceID == CHIP_S3TRISTAR64CDDR )
115 struct savage_context_t
{
121 savageTextureObjectPtr CurrentTexObj
[2];
123 struct savage_texture_object_t TexObjList
[SAVAGE_NR_TEX_HEAPS
];
124 struct savage_texture_object_t SwappedOut
;
136 savageRegisters regs
, oldRegs
, globalRegMask
;
138 /* Manage our own state */
145 /* DMA command buffer */
149 GLuint apertureBase
[5];
150 GLuint aperturePitch
;
151 /* Manage hardware state */
153 GLboolean lostContext
;
154 memHeap_t
*texHeap
[SAVAGE_NR_TEX_HEAPS
];
156 /* One of the few bits of hardware state that can't be calculated
157 * completely on the fly:
164 struct tnl_attr_map vertex_attrs
[VERT_ATTRIB_MAX
];
165 GLuint vertex_attr_count
;
166 char *verts
; /* points to tnl->clipspace.vertex_buf */
168 /* Rasterization state
170 GLuint SetupNewInputs
;
175 GLenum raster_primitive
;
176 GLenum render_primitive
;
178 GLuint DrawPrimitiveCmd
;
180 /* Fallback rasterization functions
182 savage_point_func draw_point
;
183 savage_line_func draw_line
;
184 savage_tri_func draw_tri
;
186 /* Funny mesa mirrors
191 GLfloat hw_viewport
[16];
193 drmBufPtr vertex_dma_buffer
;
195 GLframebuffer
*glBuffer
;
197 /* Two flags to keep track of fallbacks. */
202 /* These refer to the current draw (front vs. back) buffer:
204 char *drawMap
; /* draw buffer address in virtual mem */
206 int drawX
; /* origin of drawable in draw buffer */
208 GLuint numClipRects
; /* cliprects for that buffer */
210 drm_clip_rect_t
*pClipRects
;
212 /* use this bit to support single/double buffer */
214 /* use this to indicate Fullscreen mode */
215 GLuint IsFullScreen
; /* FIXME - open/close fullscreen is gone, is this needed? */
216 GLuint backup_frontOffset
;
217 GLuint backup_backOffset
;
218 GLuint backup_frontBitmapDesc
;
220 GLuint backup_streamFIFO
;
221 GLuint NotFirstFrame
;
224 GLuint secondLastSwap
;
227 GLuint any_contend
; /* throttle me harder */
230 GLboolean scissorChanged
;
231 drm_clip_rect_t draw_rect
;
232 drm_clip_rect_t scissor_rect
;
233 drm_clip_rect_t tmp_boxes
[2][SAVAGE_NR_SAREA_CLIPRECTS
];
234 /*Texture aging and DMA based aging*/
235 unsigned int texAge
[SAVAGE_NR_TEX_HEAPS
];
237 drm_context_t hHWContext
;
238 drm_hw_lock_t
*driHwLock
;
241 __DRIdrawablePrivate
*driDrawable
;
242 __DRIdrawablePrivate
*driReadable
;
245 * Drawable used by Mesa for software fallbacks for reading and
246 * writing. It is set by Mesa's \c SetBuffer callback, and will always be
247 * either \c mga_context_t::driDrawable or \c mga_context_t::driReadable.
249 __DRIdrawablePrivate
*mesa_drawable
;
251 __DRIscreenPrivate
*driScreen
;
252 savageScreenPrivate
*savageScreen
;
253 drm_savage_sarea_t
*sarea
;
255 GLboolean hw_stencil
;
258 volatile GLuint
*shadowPointer
;
259 volatile GLuint
*eventTag1
;
260 GLuint shadowCounter
;
261 GLboolean shadowStatus
;
264 #define SAVAGE_CONTEXT(ctx) ((savageContextPtr)(ctx->DriverCtx))
266 /* To remove all debugging, make sure SAVAGE_DEBUG is defined as a
267 * preprocessor symbol, and equal to zero.
269 #define SAVAGE_DEBUG 0
271 #warning "Debugging enabled - expect reduced performance"
272 extern int SAVAGE_DEBUG
;
275 #define DEBUG_VERBOSE_2D 0x1
276 #define DEBUG_VERBOSE_RING 0x8
277 #define DEBUG_VERBOSE_OUTREG 0x10
278 #define DEBUG_ALWAYS_SYNC 0x40
279 #define DEBUG_VERBOSE_MSG 0x80
280 #define DEBUG_NO_OUTRING 0x100
281 #define DEBUG_NO_OUTREG 0x200
282 #define DEBUG_VERBOSE_API 0x400
283 #define DEBUG_VALIDATE_RING 0x800
284 #define DEBUG_VERBOSE_LRU 0x1000
285 #define DEBUG_VERBOSE_DRI 0x2000
286 #define DEBUG_VERBOSE_IOCTL 0x4000
288 #define TARGET_FRONT 0x0
289 #define TARGET_BACK 0x1
290 #define TARGET_DEPTH 0x2
292 #define SAVAGEDEBUG 0
293 #define _SAVAGE_DEBUG
294 /*frank remove the least debug information*/
296 #define fprintf fprintf
301 #define SUBPIXEL_X -0.5
302 #define SUBPIXEL_Y -0.375