blob: 82b53df884b73777db667e2b6f1f79961fb18d99 [file] [log] [blame]
/*
* Copyright 2002 by Alan Hourihane, Sychdyn, North Wales, UK.
*
* 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@fairlite.demon.co.uk>
*
* Trident CyberBladeXP driver.
*
*/
#ifndef _TRIDENT_CONTEXT_H_
#define _TRIDENT_CONTEXT_H_
#include "dri_util.h"
#include "macros.h"
#include "mtypes.h"
#include "drm.h"
#include "mm.h"
#define SUBPIXEL_X (0.0F)
#define SUBPIXEL_Y (0.125F)
#define _TRIDENT_NEW_VERTEX (_NEW_TEXTURE | \
_DD_NEW_TRI_UNFILLED | \
_DD_NEW_TRI_LIGHT_TWOSIDE)
#define TRIDENT_FALLBACK_TEXTURE 0x01
#define TRIDENT_FALLBACK_DRAW_BUFFER 0x02
#define TRIDENT_NEW_CLIP 0x01
#define TRIDENT_UPLOAD_COMMAND_D 0x00000001
#define TRIDENT_UPLOAD_CONTEXT 0x04000000
#define TRIDENT_UPLOAD_CLIPRECTS 0x80000000
#define TAG(x) trident##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
/* these require that base be dword-aligned */
static INLINE void MMIO_OUT32(unsigned char *base, unsigned int offset,
unsigned int val)
{
unsigned int *addr = (unsigned int *)(base + offset);
*addr = val;
}
static INLINE unsigned int MMIO_IN32(unsigned char *base, unsigned int offset)
{
unsigned int *addr = (unsigned int *)(base + offset);
return *addr;
}
#define MMIO_OUT8(base, offset, val) *((base) + (offset)) = (val)
#define MMIO_IN8(base, offset) *((base) + (offset))
struct trident_context;
typedef struct trident_context tridentContextRec;
typedef struct trident_context *tridentContextPtr;
typedef void (*trident_quad_func)( tridentContextPtr,
const tridentVertex *,
const tridentVertex *,
const tridentVertex *,
const tridentVertex * );
typedef void (*trident_tri_func)( tridentContextPtr,
const tridentVertex *,
const tridentVertex *,
const tridentVertex * );
typedef void (*trident_line_func)( tridentContextPtr,
const tridentVertex *,
const tridentVertex * );
typedef void (*trident_point_func)( tridentContextPtr,
const tridentVertex * );
typedef struct {
drm_handle_t handle; /* Handle to the DRM region */
drmSize size; /* Size of the DRM region */
unsigned char *map; /* Mapping of the DRM region */
} tridentRegionRec, *tridentRegionPtr;
typedef struct {
__DRIscreenPrivate *driScreen; /* Back pointer to DRI screen */
drmBufMapPtr buffers;
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int backOffset;
unsigned int backPitch;
unsigned int depthOffset;
unsigned int depthPitch;
unsigned int width;
unsigned int height;
unsigned int cpp;
#if 0
unsigned int sarea_priv_offset;
#endif
tridentRegionRec mmio;
} tridentScreenRec, *tridentScreenPtr;
/**
* tridentRenderbuffer, derived from Mesa's gl_renderbuffer
*/
typedef struct {
struct gl_renderbuffer Base;
/* XXX per-window info should go here */
int foo, bar;
} tridentRenderbuffer;
struct trident_context {
GLcontext *glCtx; /* Mesa context */
__DRIcontextPrivate *driContext;
__DRIscreenPrivate *driScreen;
__DRIdrawablePrivate *driDrawable;
GLuint new_gl_state;
GLuint new_state;
GLuint dirty;
#if 0
drm_trident_sarea_t *sarea;
#endif
/* Temporaries for translating away float colors:
*/
struct gl_client_array UbyteColor;
struct gl_client_array UbyteSecondaryColor;
/* Mirrors of some DRI state
*/
int lastStamp; /* mirror driDrawable->lastStamp */
drm_context_t hHWContext;
drmLock *driHwLock;
int driFd;
tridentScreenPtr tridentScreen; /* Screen private DRI data */
/* Visual, drawable, cliprect and scissor information
*/
GLenum DrawBuffer;
GLint drawOffset, drawPitch;
GLint drawX, drawY; /* origin of drawable in draw buffer */
GLint readOffset, readPitch;
GLuint numClipRects; /* Cliprects for the draw buffer */
drm_clip_rect_t *pClipRects;
GLint scissor;
drm_clip_rect_t ScissorRect; /* Current software scissor */
GLuint Fallback;
GLuint RenderIndex;
GLuint SetupNewInputs;
GLuint SetupIndex;
GLfloat hw_viewport[16];
GLfloat depth_scale;
GLuint vertex_format;
GLuint vertex_size;
GLuint vertex_stride_shift;
GLubyte *verts;
GLint tmu_source[2];
GLuint hw_primitive;
GLenum render_primitive;
trident_point_func draw_point;
trident_line_func draw_line;
trident_tri_func draw_tri;
trident_quad_func draw_quad;
#if 0
gammaTextureObjectPtr CurrentTexObj[2];
struct gamma_texture_object_t TexObjList;
struct gamma_texture_object_t SwappedOut;
GLenum TexEnvImageFmt[2];
struct mem_block *texHeap;
int lastSwap;
int texAge;
int ctxAge;
int dirtyAge;
int lastStamp;
#endif
/* Chip state */
int commandD;
/* Context State */
int ClearColor;
};
void tridentDDInitExtensions( GLcontext *ctx );
void tridentDDInitDriverFuncs( GLcontext *ctx );
void tridentDDInitSpanFuncs( GLcontext *ctx );
void tridentDDInitState( tridentContextPtr tmesa );
void tridentInitHW( tridentContextPtr tmesa );
void tridentDDInitStateFuncs( GLcontext *ctx );
void tridentDDInitTextureFuncs( GLcontext *ctx );
void tridentDDInitTriFuncs( GLcontext *ctx );
extern void tridentBuildVertices( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint newinputs );
extern void tridentInitVB( GLcontext *ctx );
extern void tridentCopyBuffer( const __DRIdrawablePrivate *dPriv );
extern void tridentFallback( tridentContextPtr tmesa, GLuint bit,
GLboolean mode );
extern void tridentCheckTexSizes( GLcontext *ctx );
extern void tridentChooseVertexState( GLcontext *ctx );
extern void tridentDDUpdateHWState( GLcontext *ctx );
extern void tridentUploadHwStateLocked( tridentContextPtr tmesa );
#define TRIDENT_CONTEXT(ctx) ((tridentContextPtr)(ctx->DriverCtx))
#endif /* _TRIDENT_CONTEXT_H_ */