blob: acd6f2e2b1cfe3c0d5bace717e69f40a67e6b8c8 [file] [log] [blame]
/*
* Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
* Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sub license,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
* VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef _VIACONTEXT_H
#define _VIACONTEXT_H
#include "dri_util.h"
#include "mtypes.h"
#include "drm.h"
#include "mm.h"
#include "tnl/t_vertex.h"
#include "via_screen.h"
#include "via_tex.h"
#include "via_drm.h"
struct via_context;
/* Chip tags. These are used to group the adapters into
* related families.
*/
enum VIACHIPTAGS {
VIA_UNKNOWN = 0,
VIA_CLE266,
VIA_KM400,
VIA_K8M800,
VIA_PM800,
VIA_LAST
};
#define VIA_FALLBACK_TEXTURE 0x1
#define VIA_FALLBACK_DRAW_BUFFER 0x2
#define VIA_FALLBACK_READ_BUFFER 0x4
#define VIA_FALLBACK_COLORMASK 0x8
#define VIA_FALLBACK_SPECULAR 0x20
#define VIA_FALLBACK_LOGICOP 0x40
#define VIA_FALLBACK_RENDERMODE 0x80
#define VIA_FALLBACK_STENCIL 0x100
#define VIA_FALLBACK_BLEND_EQ 0x200
#define VIA_FALLBACK_BLEND_FUNC 0x400
#define VIA_FALLBACK_USER_DISABLE 0x800
#define VIA_FALLBACK_PROJ_TEXTURE 0x1000
#define VIA_FALLBACK_POLY_STIPPLE 0x2000
#define VIA_DMA_BUFSIZ 4096
#define VIA_DMA_HIGHWATER (VIA_DMA_BUFSIZ - 128)
#define VIA_NO_CLIPRECTS 0x1
/* Use the templated vertex formats:
*/
#define TAG(x) via##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
typedef void (*via_tri_func)(struct via_context *, viaVertex *, viaVertex *,
viaVertex *);
typedef void (*via_line_func)(struct via_context *, viaVertex *, viaVertex *);
typedef void (*via_point_func)(struct via_context *, viaVertex *);
/**
* Derived from gl_renderbuffer.
*/
struct via_renderbuffer {
struct gl_renderbuffer Base; /* must be first! */
drm_handle_t handle;
drmSize size;
unsigned long offset;
unsigned long index;
GLuint pitch;
GLuint bpp;
char *map;
GLuint orig; /* The drawing origin,
* at (drawX,drawY) in screen space.
*/
char *origMap;
int drawX; /* origin of drawable in draw buffer */
int drawY;
int drawW;
int drawH;
__DRIdrawablePrivate *dPriv;
};
#define VIA_MAX_TEXLEVELS 10
struct via_tex_buffer {
struct via_tex_buffer *next, *prev;
struct via_texture_image *image;
unsigned long index;
unsigned long offset;
GLuint size;
GLuint memType;
unsigned char *bufAddr;
GLuint texBase;
GLuint lastUsed;
};
struct via_texture_image {
struct gl_texture_image image;
struct via_tex_buffer *texMem;
GLint pitchLog2;
};
struct via_texture_object {
struct gl_texture_object obj; /* The "parent" object */
GLuint texelBytes;
GLuint memType;
GLuint regTexFM;
GLuint regTexWidthLog2[2];
GLuint regTexHeightLog2[2];
GLuint regTexBaseH[4];
struct {
GLuint baseL;
GLuint pitchLog2;
} regTexBaseAndPitch[12];
GLint firstLevel, lastLevel; /* upload tObj->Image[first .. lastLevel] */
};
struct via_context {
GLint refcount;
GLcontext *glCtx;
GLcontext *shareCtx;
/* XXX These don't belong here. They should be per-drawable state. */
struct via_renderbuffer front;
struct via_renderbuffer back;
struct via_renderbuffer depth;
struct via_renderbuffer stencil; /* mirrors depth */
struct via_renderbuffer breadcrumb;
GLboolean hasBack;
GLboolean hasDepth;
GLboolean hasStencil;
GLboolean hasAccum;
GLuint depthBits;
GLuint stencilBits;
GLboolean have_hw_stencil;
GLuint ClearDepth;
GLuint depth_clear_mask;
GLuint stencil_clear_mask;
GLfloat depth_max;
GLfloat polygon_offset_scale;
GLubyte *dma;
viaRegion tex;
/* Bit flag to keep 0track of fallbacks.
*/
GLuint Fallback;
/* State for via_tris.c.
*/
GLuint newState; /* _NEW_* flags */
GLuint newEmitState; /* _NEW_* flags */
GLuint newRenderState; /* _NEW_* flags */
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
GLuint vertex_attr_count;
GLuint setupIndex;
GLuint renderIndex;
GLmatrix ViewportMatrix;
GLenum renderPrimitive;
GLenum hwPrimitive;
GLenum hwShadeModel;
unsigned char *verts;
/* drmBufPtr dma_buffer;
*/
GLuint dmaLow;
GLuint dmaCliprectAddr;
GLuint dmaLastPrim;
GLboolean useAgp;
/* Fallback rasterization functions
*/
via_point_func drawPoint;
via_line_func drawLine;
via_tri_func drawTri;
/* Hardware register
*/
GLuint regCmdA_End;
GLuint regCmdB;
GLuint regEnable;
GLuint regHFBBMSKL;
GLuint regHROP;
GLuint regHZWTMD;
GLuint regHSTREF;
GLuint regHSTMD;
GLuint regHATMD;
GLuint regHABLCsat;
GLuint regHABLCop;
GLuint regHABLAsat;
GLuint regHABLAop;
GLuint regHABLRCa;
GLuint regHABLRFCa;
GLuint regHABLRCbias;
GLuint regHABLRCb;
GLuint regHABLRFCb;
GLuint regHABLRAa;
GLuint regHABLRAb;
GLuint regHFogLF;
GLuint regHFogCL;
GLuint regHFogCH;
GLuint regHLP;
GLuint regHLPRF;
GLuint regHTXnCLOD[2];
GLuint regHTXnTB[2];
GLuint regHTXnMPMD[2];
GLuint regHTXnTBLCsat[2];
GLuint regHTXnTBLCop[2];
GLuint regHTXnTBLMPfog[2];
GLuint regHTXnTBLAsat[2];
GLuint regHTXnTBLRCb[2];
GLuint regHTXnTBLRAa[2];
GLuint regHTXnTBLRFog[2];
GLuint regHTXnTBLRCa[2];
GLuint regHTXnTBLRCc[2];
GLuint regHTXnTBLRCbias[2];
GLuint regHTXnTBC[2];
GLuint regHTXnTRAH[2];
int vertexSize;
int hwVertexSize;
GLboolean ptexHack;
int coloroffset;
int specoffset;
GLint lastStamp;
GLuint ClearColor;
GLuint ClearMask;
/* DRI stuff
*/
GLboolean doPageFlip;
struct via_renderbuffer *drawBuffer;
GLuint numClipRects; /* cliprects for that buffer */
drm_clip_rect_t *pClipRects;
GLboolean scissor;
drm_clip_rect_t drawRect;
drm_clip_rect_t scissorRect;
drm_context_t hHWContext;
drm_hw_lock_t *driHwLock;
int driFd;
/**
* DRI drawable bound to this context for drawing.
*/
__DRIdrawablePrivate *driDrawable;
/**
* DRI drawable bound to this context for reading.
*/
__DRIdrawablePrivate *driReadable;
__DRIscreenPrivate *driScreen;
viaScreenPrivate *viaScreen;
drm_via_sarea_t *sarea;
volatile GLuint* regMMIOBase;
volatile GLuint* pnGEMode;
volatile GLuint* regEngineStatus;
volatile GLuint* regTranSet;
volatile GLuint* regTranSpace;
GLuint agpBase;
GLuint drawType;
GLuint nDoneFirstFlip;
GLuint agpFullCount;
GLboolean clearTexCache;
GLboolean thrashing;
/* Configuration cache
*/
driOptionCache optionCache;
int64_t swap_ust;
int64_t swap_missed_ust;
GLuint swap_count;
GLuint swap_missed_count;
GLuint pfCurrentOffset;
GLboolean allowPageFlip;
GLuint lastBreadcrumbRead;
GLuint lastBreadcrumbWrite;
GLuint lastSwap[2];
GLuint lastDma;
GLuint total_alloc[VIA_MEM_SYSTEM+1];
struct via_tex_buffer tex_image_list[VIA_MEM_SYSTEM+1];
struct via_tex_buffer freed_tex_buffers;
};
#define VIA_CONTEXT(ctx) ((struct via_context *)(ctx->DriverCtx))
/* Lock the hardware and validate our state.
*/
#define LOCK_HARDWARE(vmesa) \
do { \
char __ret = 0; \
DRM_CAS(vmesa->driHwLock, vmesa->hHWContext, \
(DRM_LOCK_HELD|vmesa->hHWContext), __ret); \
if (__ret) \
viaGetLock(vmesa, 0); \
} while (0)
/* Release the kernel lock.
*/
#define UNLOCK_HARDWARE(vmesa) \
DRM_UNLOCK(vmesa->driFd, vmesa->driHwLock, vmesa->hHWContext);
extern GLuint VIA_DEBUG;
#define DEBUG_TEXTURE 0x1
#define DEBUG_STATE 0x2
#define DEBUG_IOCTL 0x4
#define DEBUG_PRIMS 0x8
#define DEBUG_VERTS 0x10
#define DEBUG_FALLBACKS 0x20
#define DEBUG_VERBOSE 0x40
#define DEBUG_DRI 0x80
#define DEBUG_DMA 0x100
#define DEBUG_SANITY 0x200
#define DEBUG_SYNC 0x400
#define DEBUG_SLEEP 0x800
#define DEBUG_PIXEL 0x1000
#define DEBUG_2D 0x2000
extern void viaGetLock(struct via_context *vmesa, GLuint flags);
extern void viaLock(struct via_context *vmesa, GLuint flags);
extern void viaUnLock(struct via_context *vmesa, GLuint flags);
extern void viaEmitHwStateLocked(struct via_context *vmesa);
extern void viaEmitScissorValues(struct via_context *vmesa, int box_nr, int emit);
extern void viaXMesaSetBackClipRects(struct via_context *vmesa);
extern void viaXMesaSetFrontClipRects(struct via_context *vmesa);
extern void viaReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer, GLuint width, GLuint height);
extern void viaXMesaWindowMoved(struct via_context *vmesa);
extern GLboolean viaTexCombineState(struct via_context *vmesa,
const struct gl_tex_env_combine_state * combine,
unsigned unit );
/* Via hw already adjusted for GL pixel centers:
*/
#define SUBPIXEL_X 0
#define SUBPIXEL_Y 0
/* TODO XXX _SOLO temp defines to make code compilable */
#ifndef GLX_PBUFFER_BIT
#define GLX_PBUFFER_BIT 0x00000004
#endif
#ifndef GLX_WINDOW_BIT
#define GLX_WINDOW_BIT 0x00000001
#endif
#ifndef VERT_BIT_CLIP
#define VERT_BIT_CLIP 0x1000000
#endif
#endif