blob: ed698103fff92b835ab2e08d186bc837f25153c3 [file] [log] [blame]
/*
* 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_ */