#ifndef _sis_ctx_h_
#define _sis_ctx_h_
#include "context.h"
#include "dri_util.h"
#include "sis_screen.h"
#include "sis_common2.h"
#include "sis_dri.h"
#include <GL/gl.h>
#define PCI_CHIP_SIS300 0x0300
#define PCI_CHIP_SIS630 0x6300
#define PCI_CHIP_SIS540 0x5300
#define NEW_TEXTURING 0x1
#define NEW_TEXTURE_ENV 0x2
#define SIS_FALLBACK_TEXTURE 0x0001
#define SIS_FALLBACK_TEXTURE0 0x0002
#define SIS_FALLBACK_TEXTURE1 0x0004
#define SIS_FALLBACK_TEXENV0 0x0008
#define SIS_FALLBACK_TEXENV1 0x0010
#define SIS_FALLBACK_DRAW_BUFFER 0x0020
#define SIS_FALLBACK_STENCIL 0x0040
#define SIS_FALLBACK_FORCE 0x8000
#define GFLAG_ENABLESETTING 0x00000001
#define GFLAG_ENABLESETTING2 0x00000002
#define GFLAG_ZSETTING 0x00000004
#define GFLAG_ALPHASETTING 0x00000008
#define GFLAG_DESTSETTING 0x00000010
#define GFLAG_LINESETTING 0x00000020
#define GFLAG_STENCILSETTING 0x00000040
#define GFLAG_FOGSETTING 0x00000080
#define GFLAG_DSTBLEND 0x00000100
#define GFLAG_CLIPPING 0x00000200
#define CFLAG_TEXTURERESET 0x00000400
#define GFLAG_TEXTUREMIPMAP 0x00000800
#define GFLAG_TEXBORDERCOLOR 0x00001000
#define GFLAG_TEXTUREADDRESS 0x00002000
#define GFLAG_TEXTUREENV 0x00004000
#define CFLAG_TEXTURERESET_1 0x00008000
#define GFLAG_TEXTUREMIPMAP_1 0x00010000
#define GFLAG_TEXBORDERCOLOR_1 0x00020000
#define GFLAG_TEXTUREADDRESS_1 0x00040000
#define GFLAG_TEXTUREENV_1 0x00080000
#define GFLAG_ALL 0x000fffff
#define GFLAG_TEXTURE_STATES (CFLAG_TEXTURERESET | GFLAG_TEXTUREMIPMAP | \
GFLAG_TEXBORDERCOLOR | GFLAG_TEXTUREADDRESS | \
CFLAG_TEXTURERESET_1 | GFLAG_TEXTUREMIPMAP_1 | \
GFLAG_TEXBORDERCOLOR_1 | \
GFLAG_TEXTUREADDRESS_1 | \
GFLAG_TEXTUREENV | GFLAG_TEXTUREENV_1)
#define GFLAG_RENDER_STATES (GFLAG_ENABLESETTING | GFLAG_ENABLESETTING2 | \
GFLAG_ZSETTING | GFLAG_ALPHASETTING | \
GFLAG_DESTSETTING | GFLAG_FOGSETTING | \
GFLAG_STENCILSETTING | GFLAG_DSTBLEND | \
GFLAG_CLIPPING)
#define TAG(x) sis##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
#define SUBPIXEL_X (-0.5F)
#define SUBPIXEL_Y (-0.5F)
#define SIS_MAX_TEXTURE_LEVELS 11
typedef struct {
GLbyte *Data;
GLuint memType;
void *handle;
GLuint pitch;
GLuint size;
} sisTexImage;
typedef struct sis_tex_obj {
sisTexImage image[SIS_MAX_TEXTURE_LEVELS];
GLenum format;
GLint hwformat;
GLint numImages;
} sisTexObj, *sisTexObjPtr;
typedef struct __GLSiSTextureRec
{
GLint hwTextureSet;
GLint hwTextureMip;
GLint hwTextureClrHigh;
GLint hwTextureClrLow;
GLint hwTextureBorderColor;
GLint texOffset0;
GLint texOffset1;
GLint texOffset2;
GLint texOffset3;
GLint texOffset4;
GLint texOffset5;
GLint texOffset6;
GLint texOffset7;
GLint texOffset8;
GLint texOffset9;
GLint texOffset10;
GLint texOffset11;
GLint texPitch01;
GLint texPitch23;
GLint texPitch45;
GLint texPitch67;
GLint texPitch89;
GLint texPitch10;
} __GLSiSTexture;
typedef struct __GLSiSHardwareRec
{
GLint hwCapEnable, hwCapEnable2;
GLint hwOffsetZ, hwZ;
GLint hwZBias, hwZMask;
GLint hwAlpha;
GLint hwDstSet, hwDstMask;
GLint hwOffsetDest;
GLint hwLinePattern;
GLint hwFog;
GLint hwFogFar, hwFogInverse;
GLint hwFogDensity;
GLint hwStSetting, hwStSetting2;
GLint hwStOffset;
GLint hwDstSrcBlend;
GLint clipTopBottom;
GLint clipLeftRight;
struct __GLSiSTextureRec texture[2];
GLint hwTexEnvColor;
GLint hwTexBlendColor0;
GLint hwTexBlendColor1;
GLint hwTexBlendAlpha0;
GLint hwTexBlendAlpha1;
}
__GLSiSHardware;
typedef struct sis_context sisContextRec;
typedef struct sis_context *sisContextPtr;
typedef void (*sis_quad_func)( sisContextPtr,
sisVertex *,
sisVertex *,
sisVertex *,
sisVertex * );
typedef void (*sis_tri_func)( sisContextPtr,
sisVertex *,
sisVertex *,
sisVertex * );
typedef void (*sis_line_func)( sisContextPtr,
sisVertex *,
sisVertex * );
typedef void (*sis_point_func)( sisContextPtr,
sisVertex * );
struct sis_context
{
GLcontext *glCtx;
struct gl_client_array UbyteColor;
struct gl_client_array UbyteSecondaryColor;
GLuint NewGLState;
GLuint Fallback;
GLuint SetupIndex;
GLuint SetupNewInputs;
GLuint RenderIndex;
GLfloat hw_viewport[16];
GLfloat depth_scale;
GLuint vertex_size;
GLuint vertex_stride_shift;
GLuint vertex_format;
GLuint num_verts;
GLubyte *verts;
unsigned int virtualX, virtualY;
unsigned int bytesPerPixel;
unsigned char *IOBase;
unsigned char *FbBase;
unsigned int displayWidth;
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int redMask, greenMask, blueMask, alphaMask;
unsigned int colorFormat;
unsigned int zFormat;
unsigned int clearColorPattern;
unsigned int clearZStencilPattern;
sis_point_func draw_point;
sis_line_func draw_line;
sis_tri_func draw_tri;
sis_quad_func draw_quad;
GLuint hw_primitive;
GLenum raster_primitive;
GLenum render_primitive;
int driFd;
unsigned int AGPSize;
unsigned char *AGPBase;
unsigned int AGPAddr;
unsigned char *AGPCmdBufBase;
GLint AGPCmdBufAddr;
unsigned int AGPCmdBufSize;
GLint *pAGPCmdBufNext;
GLboolean AGPCmdModeEnabled;
GLint AGPParseSet;
GLint dwPrimitiveSet;
__GLSiSHardware prev, current;
int Chipset;
GLint drawableID;
GLboolean blockWrite;
GLint GlobalFlag;
GLboolean isFullScreen;
GLboolean useStereo;
GLboolean stereoEnabled;
int stereo_drawIndex;
int stereo_drawSide;
GLboolean irqEnabled;
GLboolean clearTexCache;
GLuint TexStates[SIS_MAX_TEXTURES];
GLuint PrevTexFormat[SIS_MAX_TEXTURES];
int *CurrentQueueLenPtr;
unsigned int *FrameCountPtr;
GLuint width, height;
GLint bottom;
GLvoid *backbuffer;
unsigned int backOffset;
unsigned int backPitch;
GLvoid *depthbuffer;
unsigned int depthOffset;
unsigned int depthPitch;
void *zbFree, *bbFree;
ENGPACKET zClearPacket, cbClearPacket;
GLint drawOffset, drawPitch;
GLint readOffset, readPitch;
__DRIcontextPrivate *driContext;
__DRIscreenPrivate *driScreen;
__DRIdrawablePrivate *driDrawable;
unsigned int lastStamp;
drmContext hHWContext;
drmLock *driHwLock;
sisScreenPtr sisScreen;
SISSAREAPrivPtr sarea;
};
#define SIS_CONTEXT(ctx) ((sisContextPtr)(ctx->DriverCtx))
#define GET_IOBase(x) ((x)->IOBase)
#define Y_FLIP(Y) (smesa->bottom - (Y))
#define SISPACKCOLOR565( r, g, b ) \
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
#define SISPACKCOLOR8888( r, g, b, a ) \
(((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
#define SIS_VERBOSE 0
#define MMIO(reg, value) \
{\
*(GLint *)(GET_IOBase(smesa) + (reg)) = value; \
}
#define MMIO_READ(reg) *(volatile GLint *)(smesa->IOBase + (reg))
#define MMIO_READf(reg) *(volatile GLfloat *)(smesa->IOBase + (reg))
#define mEndPrimitive() \
{ \
*(GET_IOBase(smesa) + REG_3D_EndPrimitiveList) = 0xFF; \
*(GLint *)(GET_IOBase(smesa) + 0x8b60) = (GLint)(-1); \
}
#define mWait3DCmdQueue(wLen) \
\
if (*(smesa->CurrentQueueLenPtr) < (wLen)) { \
*(smesa->CurrentQueueLenPtr) = \
(*(GLint *)(GET_IOBase(smesa) + REG_CommandQueue) & MASK_QueueLen) - 20; \
\
if (*(smesa->CurrentQueueLenPtr) < (wLen)) \
WaitingFor3dIdle(smesa, wLen); \
*(smesa->CurrentQueueLenPtr) -= wLen; \
}
enum _sis_verbose {
VERBOSE_SIS_BUFFER = 0x1,
VERBOSE_SIS_MEMORY = 0x2
};
extern GLboolean sisCreateContext( const __GLcontextModes *glVisual,
__DRIcontextPrivate *driContextPriv,
void *sharedContextPrivate );
extern void sisDestroyContext( __DRIcontextPrivate * );
extern GLboolean sisMakeCurrent( __DRIcontextPrivate *driContextPriv,
__DRIdrawablePrivate *driDrawPriv,
__DRIdrawablePrivate *driReadPriv );
extern GLboolean sisUnbindContext( __DRIcontextPrivate *driContextPriv );
void WaitEngIdle (sisContextPtr smesa);
void Wait2DEngIdle (sisContextPtr smesa);
void WaitingFor3dIdle(sisContextPtr smesa, int wLen);
extern void sis_update_texture_state( sisContextPtr smesa );
extern void sis_update_render_state( sisContextPtr smesa );
void sis_fatal_error (void);
#endif