blob: ef7119c2101ddefd184c038d92b3f5abaf8df96b [file] [log] [blame]
/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_context.h,v 1.6 2002/12/16 16:18:50 dawes Exp $ */
/*
* Copyright 2001 by Alan Hourihane.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Alan Hourihane not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Alan Hourihane makes no representations
* about the suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* Authors: Alan Hourihane, <alanh@tungstengraphics.com>
*
*/
#ifndef _GAMMA_CONTEXT_H_
#define _GAMMA_CONTEXT_H_
#include "dri_util.h"
#include "drm.h"
#include "drm_sarea.h"
#include "colormac.h"
#include "gamma_regs.h"
#include "gamma_macros.h"
#include "gamma_screen.h"
#include "macros.h"
#include "mtypes.h"
#include "glint_dri.h"
#include "mm.h"
typedef union {
unsigned int i;
float f;
} dmaBufRec, *dmaBuf;
/* Flags for context */
#define GAMMA_FRONT_BUFFER 0x00000001
#define GAMMA_BACK_BUFFER 0x00000002
#define GAMMA_DEPTH_BUFFER 0x00000004
#define GAMMA_STENCIL_BUFFER 0x00000008
#define GAMMA_ACCUM_BUFFER 0x00000010
#define GAMMA_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 gammaDDUpdateHWState(GLcontext *ctx);
extern gammaScreenPtr gammaCreateScreen(__DRIscreenPrivate *sPriv);
extern void gammaDestroyScreen(__DRIscreenPrivate *sPriv);
extern GLboolean gammaCreateContext( const __GLcontextModes *glVisual,
__DRIcontextPrivate *driContextPriv,
void *sharedContextPrivate);
#define GAMMA_UPLOAD_ALL 0xffffffff
#define GAMMA_UPLOAD_CLIPRECTS 0x00000002
#define GAMMA_UPLOAD_ALPHA 0x00000004
#define GAMMA_UPLOAD_BLEND 0x00000008
#define GAMMA_UPLOAD_DEPTH 0x00000010
#define GAMMA_UPLOAD_VIEWPORT 0x00000020
#define GAMMA_UPLOAD_SHADE 0x00000040
#define GAMMA_UPLOAD_CLIP 0x00000080
#define GAMMA_UPLOAD_MASKS 0x00000100
#define GAMMA_UPLOAD_WINDOW 0x00000200 /* defunct */
#define GAMMA_UPLOAD_GEOMETRY 0x00000400
#define GAMMA_UPLOAD_POLYGON 0x00000800
#define GAMMA_UPLOAD_DITHER 0x00001000
#define GAMMA_UPLOAD_LOGICOP 0x00002000
#define GAMMA_UPLOAD_FOG 0x00004000
#define GAMMA_UPLOAD_LIGHT 0x00008000
#define GAMMA_UPLOAD_CONTEXT 0x00010000
#define GAMMA_UPLOAD_TEX0 0x00020000
#define GAMMA_UPLOAD_STIPPLE 0x00040000
#define GAMMA_UPLOAD_TRANSFORM 0x00080000
#define GAMMA_UPLOAD_LINEMODE 0x00100000
#define GAMMA_UPLOAD_POINTMODE 0x00200000
#define GAMMA_UPLOAD_TRIMODE 0x00400000
#define GAMMA_NEW_CLIP 0x00000001
#define GAMMA_NEW_WINDOW 0x00000002
#define GAMMA_NEW_CONTEXT 0x00000004
#define GAMMA_NEW_TEXTURE 0x00000008 /* defunct */
#define GAMMA_NEW_ALPHA 0x00000010
#define GAMMA_NEW_DEPTH 0x00000020
#define GAMMA_NEW_MASKS 0x00000040
#define GAMMA_NEW_POLYGON 0x00000080
#define GAMMA_NEW_CULL 0x00000100
#define GAMMA_NEW_LOGICOP 0x00000200
#define GAMMA_NEW_FOG 0x00000400
#define GAMMA_NEW_LIGHT 0x00000800
#define GAMMA_NEW_STIPPLE 0x00001000
#define GAMMA_NEW_ALL 0xffffffff
#define GAMMA_FALLBACK_TRI 0x00000001
#define GAMMA_FALLBACK_TEXTURE 0x00000002
#define FLUSH_BATCH(gmesa) do { \
/*FLUSH_DMA_BUFFER(gmesa);*/ \
} while(0)
struct gamma_context;
typedef struct gamma_context gammaContextRec;
typedef struct gamma_context *gammaContextPtr;
typedef struct gamma_texture_object_t *gammaTextureObjectPtr;
#define VALID_GAMMA_TEXTURE_OBJECT(tobj) (tobj)
#define GAMMA_TEX_MAXLEVELS 12 /* 2K x 2K */
/* 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 gamma_texture_object_t {
struct gamma_texture_object_t *next, *prev;
GLuint age;
struct gl_texture_object *globj;
int Pitch;
int Height;
int texelBytes;
int totalSize;
int bound;
struct mem_block *MemBlock;
char * BufAddr;
GLuint min_level;
GLuint max_level;
GLuint dirty_images;
GLint firstLevel, lastLevel; /* upload tObj->Image[0][first .. lastLevel] */
struct {
const struct gl_texture_image *image;
int offset; /* into BufAddr */
int height;
int internalFormat;
} image[GAMMA_TEX_MAXLEVELS];
u_int32_t TextureBaseAddr[GAMMA_TEX_MAXLEVELS];
u_int32_t TextureAddressMode;
u_int32_t TextureColorMode;
u_int32_t TextureFilterMode;
u_int32_t TextureFormat;
u_int32_t TextureReadMode;
u_int32_t TextureBorderColor;
};
#define GAMMA_NO_PALETTE 0x0
#define GAMMA_USE_PALETTE 0x1
#define GAMMA_UPDATE_PALETTE 0x2
#define GAMMA_FALLBACK_PALETTE 0x4
void gammaUpdateTextureState( GLcontext *ctx );
void gammaDestroyTexObj( gammaContextPtr gmesa, gammaTextureObjectPtr t );
void gammaSwapOutTexObj( gammaContextPtr gmesa, gammaTextureObjectPtr t );
void gammaUploadTexImages( gammaContextPtr gmesa, gammaTextureObjectPtr t );
void gammaResetGlobalLRU( gammaContextPtr gmesa );
void gammaUpdateTexLRU( gammaContextPtr gmesa, gammaTextureObjectPtr t );
void gammaTexturesGone( gammaContextPtr gmesa,
GLuint start, GLuint end,
GLuint in_use );
void gammaEmitHwState( gammaContextPtr gmesa );
void gammaDDInitExtensions( GLcontext *ctx );
void gammaDDInitDriverFuncs( GLcontext *ctx );
void gammaDDInitSpanFuncs( GLcontext *ctx );
void gammaDDInitState( gammaContextPtr gmesa );
void gammaInitHW( gammaContextPtr gmesa );
void gammaDDInitStateFuncs( GLcontext *ctx );
void gammaDDInitTextureFuncs( struct dd_function_table *table );
void gammaInitTextureObjects( GLcontext *ctx );
void gammaDDInitTriFuncs( GLcontext *ctx );
void gammaUpdateWindow( GLcontext *ctx );
void gammaUpdateViewportOffset( GLcontext *ctx );
void gammaPrintLocalLRU( gammaContextPtr gmesa );
void gammaPrintGlobalLRU( gammaContextPtr gmesa );
extern void gammaFallback( gammaContextPtr gmesa, GLuint bit, GLboolean mode );
#define FALLBACK( imesa, bit, mode ) gammaFallback( imesa, bit, mode )
/* Use the templated vertex formats. Only one of these is used in gamma.
*/
#define TAG(x) gamma##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
typedef void (*gamma_quad_func)( gammaContextPtr,
const gammaVertex *,
const gammaVertex *,
const gammaVertex *,
const gammaVertex * );
typedef void (*gamma_tri_func)( gammaContextPtr,
const gammaVertex *,
const gammaVertex *,
const gammaVertex * );
typedef void (*gamma_line_func)( gammaContextPtr,
const gammaVertex *,
const gammaVertex * );
typedef void (*gamma_point_func)( gammaContextPtr,
const gammaVertex * );
struct gamma_context {
GLcontext *glCtx; /* Mesa context */
__DRIcontextPrivate *driContext;
__DRIscreenPrivate *driScreen;
__DRIdrawablePrivate *driDrawable;
GLuint new_gl_state;
GLuint new_state;
GLuint dirty;
GLINTSAREADRIPtr sarea;
/* Mirrors of some DRI state
*/
drm_context_t hHWContext;
drm_hw_lock_t *driHwLock;
int driFd;
GLuint numClipRects; /* Cliprects for the draw buffer */
drm_clip_rect_t *pClipRects;
dmaBuf buf; /* DMA buffer for regular cmds */
int bufIndex;
int bufSize;
int bufCount;
dmaBuf WCbuf; /* DMA buffer for window changed cmds */
int WCbufIndex;
int WCbufSize;
int WCbufCount;
gammaScreenPtr gammaScreen; /* Screen private DRI data */
int drawOffset;
int readOffset;
gamma_point_func draw_point;
gamma_line_func draw_line;
gamma_tri_func draw_tri;
gamma_quad_func draw_quad;
GLuint Fallback;
GLuint RenderIndex;
GLuint SetupNewInputs;
GLuint SetupIndex;
GLuint vertex_format;
GLuint vertex_size;
GLuint vertex_stride_shift;
GLubyte *verts;
GLfloat hw_viewport[16];
GLuint hw_primitive;
GLenum render_primitive;
GLfloat depth_scale;
gammaTextureObjectPtr CurrentTexObj[2];
struct gamma_texture_object_t TexObjList;
struct gamma_texture_object_t SwappedOut;
GLenum TexEnvImageFmt[2];
struct mem_block *texHeap;
unsigned int lastSwap;
int texAge;
int ctxAge;
int dirtyAge;
unsigned int lastStamp;
u_int32_t ClearColor;
u_int32_t Color;
u_int32_t DitherMode;
u_int32_t ClearDepth;
u_int32_t FogMode;
u_int32_t AreaStippleMode;
u_int32_t LBReadFormat;
u_int32_t LBWriteFormat;
u_int32_t LineMode;
u_int32_t PointMode;
u_int32_t TriangleMode;
u_int32_t 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;
};
static INLINE GLuint gammaPackColor( GLuint cpp,
GLubyte r, GLubyte g,
GLubyte b, GLubyte a )
{
switch ( cpp ) {
case 2:
return PACK_COLOR_565( r, g, b );
case 4:
return PACK_COLOR_8888( a, r, g, b );
default:
return 0;
}
}
#define GAMMA_CONTEXT(ctx) ((gammaContextPtr)(ctx->DriverCtx))
#endif /* _GAMMA_CONTEXT_H_ */