/* * 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_common.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 *); struct via_buffer { drm_handle_t handle; drmSize size; GLuint offset; GLuint index; GLuint pitch; GLuint bpp; char *map; GLuint orig; /* The drawing origin, * at (drawX,drawY) in screen space. */ char *origMap; }; #define VIA_MAX_TEXLEVELS 10 struct via_tex_buffer { struct via_tex_buffer *next, *prev; struct via_texture_image *image; GLuint index; GLuint 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; struct via_buffer front; struct via_buffer back; struct via_buffer depth; struct via_buffer 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_buffer *drawBuffer; struct via_buffer *readBuffer; int drawX; /* origin of drawable in draw buffer */ int drawY; int drawW; int drawH; int drawXoff; /* drawX is 32byte aligned - this is * the delta to the real origin, in * pixel units. */ 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; __DRInativeDisplay *display; __DRIdrawablePrivate *driDrawable; __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; GLuint vblank_flags; GLuint vbl_seq; int64_t swap_ust; int64_t swap_missed_ust; GLuint swap_count; GLuint swap_missed_count; PFNGLXGETUSTPROC get_ust; 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