blob: c4573b0da41aa45f13ef25f1bed2a331b18a9bc5 [file] [log] [blame]
/*
* Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
* Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sub license,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
* VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SAVAGECONTEXT_INC
#define SAVAGECONTEXT_INC
typedef struct savage_context_t savageContext;
typedef struct savage_context_t *savageContextPtr;
typedef struct savage_texture_object_t *savageTextureObjectPtr;
#include <X11/Xlibint.h>
#include "dri_util.h"
#include "mtypes.h"
#include "xf86drm.h"
#include "drm.h"
#include "savage_drm.h"
#include "savage_init.h"
#include "savage_3d_reg.h"
#include "mm.h"
#include "tnl/t_vertex.h"
#include "texmem.h"
#include "xmlconfig.h"
/* Reasons to fallback on all primitives.
*/
#define SAVAGE_FALLBACK_TEXTURE 0x1
#define SAVAGE_FALLBACK_DRAW_BUFFER 0x2
#define SAVAGE_FALLBACK_READ_BUFFER 0x4
#define SAVAGE_FALLBACK_COLORMASK 0x8
#define SAVAGE_FALLBACK_SPECULAR 0x10
#define SAVAGE_FALLBACK_LOGICOP 0x20
/*frank 2001/11/12 add the stencil fallbak*/
#define SAVAGE_FALLBACK_STENCIL 0x40
#define SAVAGE_FALLBACK_RENDERMODE 0x80
#define SAVAGE_FALLBACK_BLEND_EQ 0x100
#define SAVAGE_FALLBACK_NORAST 0x200
#define SAVAGE_FALLBACK_PROJ_TEXTURE 0x400
#define HW_CULL 1
/* for savagectx.new_state - manage GL->driver state changes
*/
#define SAVAGE_NEW_TEXTURE 0x1
#define SAVAGE_NEW_CULL 0x2
/* What needs to be changed for the current vertex dma buffer?
* This will go away!
*/
#define SAVAGE_UPLOAD_LOCAL 0x1 /* DrawLocalCtrl (S4) or
DrawCtrl and ZBufCtrl (S3D) */
#define SAVAGE_UPLOAD_TEX0 0x2 /* texture unit 0 */
#define SAVAGE_UPLOAD_TEX1 0x4 /* texture unit 1 (S4 only) */
#define SAVAGE_UPLOAD_FOGTBL 0x8 /* fog table */
#define SAVAGE_UPLOAD_GLOBAL 0x10 /* most global regs */
#define SAVAGE_UPLOAD_TEXGLOBAL 0x20 /* TexBlendColor (S4 only) */
/*define the max numer of vertex in vertex buf*/
#define SAVAGE_MAX_VERTEXS 0x10000
/* Don't make it too big. We don't want to buffer up a whole frame
* that would force the application to wait later. */
#define SAVAGE_CMDBUF_SIZE 1024
/* Use the templated vertex formats:
*/
#define TAG(x) savage##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
typedef void (*savage_tri_func)( savageContextPtr, savageVertex *,
savageVertex *, savageVertex * );
typedef void (*savage_line_func)( savageContextPtr,
savageVertex *, savageVertex * );
typedef void (*savage_point_func)( savageContextPtr, savageVertex * );
/**************************************************************
**************** enums for chip IDs ************************
**************************************************************/
#define CHIP_S3GX3MS1NB 0x8A25
#define CHIP_S3GX3MS1NBK 0x8A26
#define CHIP_S3TWISTER 0x8D01
#define CHIP_S3TWISTERK 0x8D02
#define CHIP_S3TWISTER_P4M 0x8D04
#define CHIP_S3PARAMOUNT128 0x8C22 /*SuperSavage 128/MX*/
#define CHIP_S3TRISTAR128SDR 0x8C2A /*SuperSavage 128/IX*/
#define CHIP_S3TRISTAR64SDRM7 0x8C2C /*SuperSavage/IX M7 Package*/
#define CHIP_S3TRISTAR64SDR 0x8C2E /*SuperSavage/IX*/
#define CHIP_S3TRISTAR64CDDR 0x8C2F /*SuperSavage/IXC DDR*/
#define IS_SAVAGE(imesa) (imesa->savageScreen->deviceID == CHIP_S3GX3MS1NB || \
imesa->savageScreen->deviceID == CHIP_S3GX3MS1NBK || \
imesa->savageScreen->deviceID == CHIP_S3TWISTER || \
imesa->savageScreen->deviceID == CHIP_S3TWISTERK || \
imesa->savageScreen->deviceID == CHIP_S3TWISTER_P4M || \
imesa->savageScreen->deviceID == CHIP_S3PARAMOUNT128 || \
imesa->savageScreen->deviceID == CHIP_S3TRISTAR128SDR || \
imesa->savageScreen->deviceID == CHIP_S3TRISTAR64SDRM7 || \
imesa->savageScreen->deviceID == CHIP_S3TRISTAR64SDR || \
imesa->savageScreen->deviceID == CHIP_S3TRISTAR64CDDR )
struct savage_vtxbuf_t {
GLuint total, used, flushed; /* in 32 bit units */
GLuint idx; /* for DMA buffers */
u_int32_t *buf;
};
struct savage_cmdbuf_t {
GLuint size; /* size in qwords */
drm_savage_cmd_header_t *base; /* initial state starts here */
drm_savage_cmd_header_t *start; /* drawing/state commands start here */
drm_savage_cmd_header_t *write; /* append stuff here */
};
struct savage_elt_t {
GLuint n; /* number of elts currently allocated */
drm_savage_cmd_header_t *cmd; /* the indexed drawing command */
};
struct savage_context_t {
GLint refcount;
GLcontext *glCtx;
int lastTexHeap;
driTexHeap *textureHeaps[SAVAGE_NR_TEX_HEAPS];
driTextureObject swapped;
driTextureObject *CurrentTexObj[2];
/* Hardware state
*/
savageRegisters regs, oldRegs, globalRegMask;
/* Manage our own state */
GLuint new_state;
GLuint new_gl_state;
GLboolean ptexHack;
/* Command buffer */
struct savage_cmdbuf_t cmdBuf;
/* Elt book-keeping */
struct savage_elt_t elts;
GLint firstElt;
/* Vertex buffers */
struct savage_vtxbuf_t dmaVtxBuf, clientVtxBuf;
struct savage_vtxbuf_t *vtxBuf;
/* aperture base */
GLubyte *apertureBase[5];
GLuint aperturePitch;
/* Manage hardware state */
GLuint dirty;
GLboolean lostContext;
GLuint bTexEn1;
/* One of the few bits of hardware state that can't be calculated
* completely on the fly:
*/
GLuint LcsCullMode;
GLuint texEnvColor;
/* Vertex state
*/
GLuint vertex_size;
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
GLuint vertex_attr_count;
char *verts; /* points to tnl->clipspace.vertex_buf */
/* Rasterization state
*/
GLuint SetupNewInputs;
GLuint SetupIndex;
GLuint RenderIndex;
GLuint hw_primitive;
GLenum raster_primitive;
GLenum render_primitive;
GLuint skip;
GLubyte HwPrim;
GLuint HwVertexSize;
/* Fallback rasterization functions
*/
savage_point_func draw_point;
savage_line_func draw_line;
savage_tri_func draw_tri;
/* Funny mesa mirrors
*/
GLuint MonoColor;
GLuint ClearColor;
GLfloat depth_scale;
GLfloat hw_viewport[16];
/* DRI stuff */
GLuint bufferSize;
GLframebuffer *glBuffer;
/* Two flags to keep track of fallbacks. */
GLuint Fallback;
GLuint needClip;
/* These refer to the current draw (front vs. back) buffer:
*/
int drawX; /* origin of drawable in draw buffer */
int drawY;
GLuint numClipRects; /* cliprects for that buffer */
GLint currentClip;
drm_clip_rect_t *pClipRects;
/* use this bit to support single/double buffer */
GLuint IsDouble;
/* use this to indicate Fullscreen mode */
GLuint IsFullScreen; /* FIXME - open/close fullscreen is gone, is this needed? */
GLuint backup_frontOffset;
GLuint backup_backOffset;
GLuint backup_frontBitmapDesc;
GLuint toggle;
GLuint backup_streamFIFO;
GLuint NotFirstFrame;
GLboolean inSwap;
GLuint lastSwap;
GLuint ctxAge;
GLuint dirtyAge;
GLuint any_contend; /* throttle me harder */
/* Scissor state needs to be mirrored so buffered commands can be
* emitted with the old scissor state when scissor state changes.
*/
struct {
GLboolean enabled;
GLint x, y;
GLsizei w, h;
} scissor;
drm_context_t hHWContext;
drm_hw_lock_t *driHwLock;
GLuint driFd;
__DRIdrawablePrivate *driDrawable;
__DRIdrawablePrivate *driReadable;
__DRIscreenPrivate *driScreen;
savageScreenPrivate *savageScreen;
drm_savage_sarea_t *sarea;
GLboolean hw_stencil;
/* Performance counters
*/
GLuint c_textureSwaps;
/* Configuration cache
*/
driOptionCache optionCache;
GLint texture_depth;
GLboolean no_rast;
GLboolean float_depth;
GLboolean enable_fastpath;
GLboolean enable_vdma;
GLboolean sync_frames;
};
#define SAVAGE_CONTEXT(ctx) ((savageContextPtr)(ctx->DriverCtx))
/* To remove all debugging, make sure SAVAGE_DEBUG is defined as a
* preprocessor symbol, and equal to zero.
*/
#ifndef SAVAGE_DEBUG
extern int SAVAGE_DEBUG;
#endif
#define DEBUG_FALLBACKS 0x001
#define DEBUG_VERBOSE_API 0x002
#define DEBUG_VERBOSE_TEX 0x004
#define DEBUG_VERBOSE_MSG 0x008
#define DEBUG_DMA 0x010
#define DEBUG_STATE 0x020
#define TARGET_FRONT 0x0
#define TARGET_BACK 0x1
#define TARGET_DEPTH 0x2
#define SUBPIXEL_X -0.5
#define SUBPIXEL_Y -0.375
#endif