/*
 * Author: Max Lingua <sunmax@libero.it>
 */

#ifndef _S3V_CONTEXT_H_
#define _S3V_CONTEXT_H_

#include "dri_util.h"

#include "s3v_dri.h"
#include "s3v_regs.h"
#include "s3v_macros.h"
#include "s3v_screen.h"
#include "colormac.h"
#include "macros.h"
#include "mtypes.h"
#include "drm.h"
#include "mm.h"
#include "drirenderbuffer.h"

/* Flags for context */
#define S3V_FRONT_BUFFER    0x00000001
#define S3V_BACK_BUFFER     0x00000002
#define S3V_DEPTH_BUFFER    0x00000004

	/* FIXME: check */
#define S3V_MAX_TEXTURE_SIZE    2048

/* These are the minimum requirements and should probably be increased */
#define MAX_MODELVIEW_STACK    16
#define MAX_PROJECTION_STACK    2
#define MAX_TEXTURE_STACK       2

extern void	  	s3vDDUpdateHWState(GLcontext *ctx);
extern s3vScreenPtr	s3vCreateScreen(__DRIscreenPrivate *sPriv);
extern void	  	s3vDestroyScreen(__DRIscreenPrivate *sPriv);
extern GLboolean 	s3vCreateContext(const __GLcontextModes *glVisual,
                                     __DRIcontextPrivate *driContextPriv,
                                     void *sharedContextPrivate);

#define S3V_UPLOAD_ALL			0xffffffff
/* #define S3V_UPLOAD_CLIPRECTS		0x00000002 */
#define S3V_UPLOAD_ALPHA		0x00000004
#define S3V_UPLOAD_BLEND		0x00000008
#define S3V_UPLOAD_DEPTH		0x00000010
#define S3V_UPLOAD_VIEWPORT		0x00000020
#define S3V_UPLOAD_SHADE		0x00000040
#define S3V_UPLOAD_CLIP			0x00000080
#define S3V_UPLOAD_MASKS		0x00000100
#define S3V_UPLOAD_WINDOW		0x00000200 /* defunct */
#define S3V_UPLOAD_GEOMETRY		0x00000400
#define S3V_UPLOAD_POLYGON		0x00000800
#define S3V_UPLOAD_DITHER		0x00001000
#define S3V_UPLOAD_LOGICOP		0x00002000
#define S3V_UPLOAD_FOG			0x00004000
#define S3V_UPLOAD_LIGHT		0x00008000
#define S3V_UPLOAD_CONTEXT		0x00010000
#define S3V_UPLOAD_TEX0			0x00020000
#define S3V_UPLOAD_STIPPLE		0x00040000
#define S3V_UPLOAD_TRANSFORM		0x00080000
#define S3V_UPLOAD_LINEMODE		0x00100000
#define S3V_UPLOAD_POINTMODE		0x00200000
#define S3V_UPLOAD_TRIMODE		0x00400000

#define S3V_NEW_CLIP			0x00000001
#define S3V_NEW_WINDOW			0x00000002
#define S3V_NEW_CONTEXT			0x00000004
#define S3V_NEW_TEXTURE			0x00000008 /* defunct */
#define S3V_NEW_ALPHA			0x00000010
#define S3V_NEW_DEPTH			0x00000020
#define S3V_NEW_MASKS			0x00000040
#define S3V_NEW_POLYGON			0x00000080
#define S3V_NEW_CULL			0x00000100
#define S3V_NEW_LOGICOP			0x00000200
#define S3V_NEW_FOG			0x00000400
#define S3V_NEW_LIGHT			0x00000800
#define S3V_NEW_STIPPLE			0x00001000
#define S3V_NEW_ALL			0xffffffff

#define S3V_FALLBACK_TRI		0x00000001
#define S3V_FALLBACK_TEXTURE		0x00000002

struct s3v_context;
typedef struct s3v_context s3vContextRec;
typedef struct s3v_context *s3vContextPtr;
typedef struct s3v_texture_object_t *s3vTextureObjectPtr;

#define VALID_S3V_TEXTURE_OBJECT(tobj)  (tobj) 

#define S3V_TEX_MAXLEVELS 12

/* For shared texture space managment, these texture objects may also
 * be used as proxies for regions of texture memory containing other
 * client's textures.  Such proxy textures (not to be confused with GL
 * proxy textures) are subject to the same LRU aging we use for our
 * own private textures, and thus we have a mechanism where we can
 * fairly decide between kicking out our own textures and those of
 * other clients.
 *
 * Non-local texture objects have a valid MemBlock to describe the
 * region managed by the other client, and can be identified by
 * 't->globj == 0' 
 */
struct s3v_texture_object_t {
	struct s3v_texture_object_t *next, *prev;

	GLuint age;   
	struct gl_texture_object *globj;
     
	int Pitch;
	int Height;
	int WidthLog2;
	int texelBytes;
	int totalSize;
	int bound;

	struct mem_block *MemBlock;   
	GLuint BufAddr;
   
	GLuint min_level;
	GLuint max_level;
	GLuint dirty_images;

	GLint firstLevel, lastLevel;  /* upload tObj->Image[first .. lastLevel] */

	struct { 
		const struct gl_texture_image *image;
      		int offset;		/* into BufAddr */
      		int height;
      		int internalFormat;
   	} image[S3V_TEX_MAXLEVELS];

	GLuint TextureCMD;

	GLuint TextureColorMode;
	GLuint TextureFilterMode;
	GLuint TextureBorderColor;
	GLuint TextureWrap;
	GLuint TextureMipSize;

	GLuint TextureBaseAddr[S3V_TEX_MAXLEVELS];
	GLuint TextureFormat;
	GLuint TextureReadMode;
};		

#define S3V_NO_PALETTE        0x0
#define S3V_USE_PALETTE       0x1
#define S3V_UPDATE_PALETTE    0x2
#define S3V_FALLBACK_PALETTE  0x4

void s3vUpdateTextureState( GLcontext *ctx );

void s3vDestroyTexObj( s3vContextPtr vmesa, s3vTextureObjectPtr t);
void s3vUploadTexImages( s3vContextPtr vmesa, s3vTextureObjectPtr t );

void s3vResetGlobalLRU( s3vContextPtr vmesa );
void s3vTexturesGone( s3vContextPtr vmesa, 
		       GLuint start, GLuint end, 
		       GLuint in_use ); 

void s3vEmitHwState( s3vContextPtr vmesa );
void s3vGetLock( s3vContextPtr vmesa, GLuint flags );
void s3vInitExtensions( GLcontext *ctx );
void s3vInitDriverFuncs( GLcontext *ctx );
void s3vSetSpanFunctions(driRenderbuffer *rb, const GLvisual *vis);
void s3vInitState( s3vContextPtr vmesa );
void s3vInitHW( s3vContextPtr vmesa );
void s3vInitStateFuncs( GLcontext *ctx );
void s3vInitTextureFuncs( GLcontext *ctx );
void s3vInitTriFuncs( GLcontext *ctx );

void s3vUpdateWindow( GLcontext *ctx );
void s3vUpdateViewportOffset( GLcontext *ctx );

void s3vPrintLocalLRU( s3vContextPtr vmesa );
void s3vPrintGlobalLRU( s3vContextPtr vmesa );

extern void s3vFallback( s3vContextPtr vmesa, GLuint bit, GLboolean mode );
#define FALLBACK( imesa, bit, mode ) s3vFallback( imesa, bit, mode )

/* Use the templated vertex formats.  Only one of these is used in s3v.
 */
#define TAG(x) s3v##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG

typedef void (*s3v_quad_func)( s3vContextPtr, 
				const s3vVertex *, 
				const s3vVertex *,
				const s3vVertex *,
				const s3vVertex * );
typedef void (*s3v_tri_func)( s3vContextPtr, 
				const s3vVertex *, 
				const s3vVertex *,
				const s3vVertex * );
typedef void (*s3v_line_func)( s3vContextPtr, 
				const s3vVertex *, 
				const s3vVertex * );
typedef void (*s3v_point_func)( s3vContextPtr, 
				 const s3vVertex * );


/* static void s3v_lines_emit(GLcontext *ctx, GLuint start, GLuint end); */
typedef void (*emit_func)( GLcontext *, GLuint, GLuint);

struct s3v_context {
	GLcontext 		*glCtx;		/* Mesa context */

	__DRIcontextPrivate	*driContext;
	__DRIscreenPrivate	*driScreen;
	__DRIdrawablePrivate	*driDrawable;

	GLuint new_gl_state;
	GLuint new_state;
	GLuint dirty;

	S3VSAREAPtr	sarea; 

	/* Temporaries for translating away float colors
	 */
	struct gl_client_array UbyteColor;
	struct gl_client_array UbyteSecondaryColor;

   	/* Mirrors of some DRI state
    	 */

	drm_context_t hHWContext;
	drmLock *driHwLock;
	int driFd;

	GLuint numClipRects;		/* Cliprects for the draw buffer */
	drm_clip_rect_t *pClipRects;

	GLuint*	buf;			/* FIXME */
	GLuint*	_buf[2];
	int		_bufNum;
	int		bufIndex[2];
	int		bufSize;
	int		bufCount;

	s3vScreenPtr 	s3vScreen;		/* Screen private DRI data */

	int		drawOffset;
	int		readOffset;

	s3v_point_func	draw_point;
	s3v_line_func	draw_line;
	s3v_tri_func	draw_tri;
	s3v_quad_func	draw_quad;

	GLuint Fallback;
	GLuint RenderIndex;
	GLuint SetupNewInputs;
	GLuint SetupIndex;

	GLuint vertex_format;
	GLuint vertex_size;
	GLuint vertex_stride_shift;
	char *verts;

	GLfloat hw_viewport[16];
	GLuint hw_primitive;
	GLenum render_primitive;

	GLfloat	depth_scale;

	s3vTextureObjectPtr CurrentTexObj[2];
	struct s3v_texture_object_t TexObjList;
	struct s3v_texture_object_t SwappedOut; 
	GLenum TexEnvImageFmt[2];

	struct mem_block *texHeap;

   	int lastSwap;
   	int texAge;
   	int ctxAge;
	int dirtyAge;
	int lastStamp;

	/* max was here: don't touch */
   
	unsigned int S3V_REG[S3V_REGS_NUM];

	GLuint texMode;
	GLuint alphaMode;
	GLuint lightMode;

	GLuint SrcBase;
	GLuint DestBase;
	GLuint DestBlit;
	GLuint ScissorLR;
	GLuint ScissorTB;
	GLuint ScissorWH; /* SubScissorWH */ /* RectWH */
	GLuint FrontStride;
	GLuint BackStride;
	GLuint SrcStride;
	GLuint DestStride;
	GLuint SrcXY;
	GLuint DestXY;

   	GLuint ClearColor;
	GLuint Color;
	GLuint DitherMode;
   	GLuint ClearDepth;

	GLuint TextureBorderColor;
	GLuint TexOffset;
	GLuint TexStride;

	GLuint CMD;
	GLuint prim_cmd;
	GLuint _tri[2]; /* 0 = gouraud; 1 = tex (lit or unlit) */
	GLuint alpha_cmd; /* actual alpha cmd */
	GLuint _alpha[2];
	GLuint _alpha_tex; /* tex alpha type */
	/* (3d_mode) 0 = 3d line/gourad tri; 1 = 3d tex tri */
	GLuint _3d_mode;
	
	GLfloat backface_sign;
	GLfloat cull_zero;

	int restore_primitive;

/* *** 2check *** */

	GLuint		FogMode;
	GLuint		AreaStippleMode;
	GLuint		LBReadFormat;
	GLuint		LBWriteFormat;
	GLuint		LineMode;
	GLuint		PointMode;
	GLuint		TriangleMode;
	GLuint		AntialiasMode;
	GLfloat		ViewportScaleX;
	GLfloat		ViewportScaleY;
	GLfloat		ViewportScaleZ;
	GLfloat		ViewportOffsetX;
	GLfloat		ViewportOffsetY;
	GLfloat		ViewportOffsetZ;
	int		MatrixMode;
	int		DepthMode;
	int		TransformMode;
	int		LBReadMode;
	int		FBReadMode;
	int		FBWindowBase;
	int		LBWindowBase;
	int		ColorDDAMode;
	int		GeometryMode;
	int		AlphaTestMode;
	int		AlphaBlendMode;
	int		AB_FBReadMode;
	int		AB_FBReadMode_Save;
	int		DeltaMode;
	int		ColorMaterialMode;
	int		FBHardwareWriteMask;
	int		MaterialMode;
	int		NormalizeMode;
	int		LightingMode;
	int		Light0Mode;
	int		Light1Mode;
	int		Light2Mode;
	int		Light3Mode;
	int		Light4Mode;
	int		Light5Mode;
	int		Light6Mode;
	int		Light7Mode;
	int		Light8Mode;
	int		Light9Mode;
	int		Light10Mode;
	int		Light11Mode;
	int		Light12Mode;
	int		Light13Mode;
	int		Light14Mode;
	int		Light15Mode;
	int		LogicalOpMode;
	int		ScissorMode;
	int		ScissorMaxXY;
	int		ScissorMinXY;
	int		Window; /* GID part probably should be in draw priv */
	int		WindowOrigin;
	int		x, y, w, h; /* Probably should be in drawable priv */
	int		FrameCount; /* Probably should be in drawable priv */
	int		NotClipped; /* Probably should be in drawable priv */
	int		WindowChanged; /* Probably should be in drawabl... */
	int		Flags;
	int		EnabledFlags;
	int		DepthSize;
	int		Begin;
	GLenum		ErrorValue;
	int		Texture1DEnabled;
	int		Texture2DEnabled;

	float		ModelView[16];
	float		Proj[16];
	float		ModelViewProj[16];
	float		Texture[16];

	float		ModelViewStack[(MAX_MODELVIEW_STACK-1)*16];
	int		ModelViewCount;
	float		ProjStack[(MAX_PROJECTION_STACK-1)*16];
	int		ProjCount;
	float		TextureStack[(MAX_TEXTURE_STACK-1)*16];
	int		TextureCount;
};

#define S3VIRGEPACKCOLOR555( r, g, b, a ) \
    ((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
     ((a) ? 0x8000 : 0))

#define S3VIRGEPACKCOLOR565( r, g, b ) \
    ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))

#define S3VIRGEPACKCOLOR888( r, g, b ) \
    (((r) << 16) | ((g) << 8) | (b))

#define S3VIRGEPACKCOLOR8888( r, g, b, a ) \
    (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))

#define S3VIRGEPACKCOLOR4444( r, g, b, a ) \
    ((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))

static INLINE GLuint s3vPackColor( GLuint cpp,
                                   GLubyte r, GLubyte g,
                                   GLubyte b, GLubyte a )
{
	unsigned int ret;
	DEBUG(("cpp = %i, r=0x%x, g=0x%x, b=0x%x, a=0x%x\n", cpp, r, g, b, a));

	switch ( cpp ) {
	case 2:
		ret = S3VIRGEPACKCOLOR555( r, g, b, a );
		DEBUG(("ret = 0x%x\n", ret));
		return ret;
	case 4:
		return PACK_COLOR_8888( a, r, g, b );
	default:
    	return 0;
	}
}

#define S3V_CONTEXT(ctx)	((s3vContextPtr)(ctx->DriverCtx))

#endif /* _S3V_CONTEXT_H_ */
