⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgacontext.h

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 H
字号:
/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgacontext.h,v 1.7 2002/12/16 16:18:52 dawes Exp $*//* * Copyright 2000-2001 VA Linux Systems, 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 * on 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 * VA LINUX SYSTEMS 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. * * Authors: *    Keith Whitwell <keith@tungstengraphics.com> */#ifndef MGALIB_INC#define MGALIB_INC#include <stdint.h>#include "drm.h"#include "mga_drm.h"#include "dri_util.h"#include "mtypes.h"#include "xf86drm.h"#include "mm.h"#include "colormac.h"#include "texmem.h"#include "macros.h"#include "xmlconfig.h"#define MGA_SET_FIELD(reg,mask,val)  reg = ((reg) & (mask)) | ((val) & ~(mask))#define MGA_FIELD(field,val) (((val) << (field ## _SHIFT)) & ~(field ## _MASK))#define MGA_GET_FIELD(field, val) ((val & ~(field ## _MASK)) >> (field ## _SHIFT))#define MGA_IS_G200(mmesa) (mmesa->mgaScreen->chipset == MGA_CARD_TYPE_G200)#define MGA_IS_G400(mmesa) (mmesa->mgaScreen->chipset == MGA_CARD_TYPE_G400)/* SoftwareFallback *    - texture env GL_BLEND -- can be fixed *    - 1D and 3D textures *    - incomplete textures *    - GL_DEPTH_FUNC == GL_NEVER not in h/w */#define MGA_FALLBACK_TEXTURE        0x1#define MGA_FALLBACK_DRAW_BUFFER    0x2#define MGA_FALLBACK_READ_BUFFER    0x4#define MGA_FALLBACK_BLEND          0x8#define MGA_FALLBACK_RENDERMODE     0x10#define MGA_FALLBACK_STENCIL        0x20#define MGA_FALLBACK_DEPTH          0x40#define MGA_FALLBACK_BORDER_MODE    0x80#define MGA_FALLBACK_DISABLE        0x100/* Use the templated vertex formats: */#define TAG(x) mga##x#include "tnl_dd/t_dd_vertex.h"#undef TAGtypedef struct mga_context_t mgaContext;typedef struct mga_context_t *mgaContextPtr;typedef void (*mga_tri_func)( mgaContextPtr, mgaVertex *, mgaVertex *,			       mgaVertex * );typedef void (*mga_line_func)( mgaContextPtr, mgaVertex *, mgaVertex * );typedef void (*mga_point_func)( mgaContextPtr, mgaVertex * );/* Texture environment color */#define RGB_ZERO(c)   (((c) & 0xffffff) == 0x000000)#define RGB_ONE(c)    (((c) & 0xffffff) == 0xffffff)#define ALPHA_ZERO(c) (((c) >> 24) == 0x00)#define ALPHA_ONE(c)  (((c) >> 24) == 0xff)#define RGBA_EQUAL(c) ((c) == PACK_COLOR_8888( (c) & 0xff, (c) & 0xff, \                                               (c) & 0xff, (c) & 0xff ))struct mga_texture_object_s;struct mga_screen_private_s;#define G200_TEX_MAXLEVELS 5#define G400_TEX_MAXLEVELS 11typedef struct mga_texture_object_s{   driTextureObject   base;   /* The G200 only has the ability to use 5 mipmap levels (including the    * base level).  The G400 does not have this restriction, but it still    * only has 5 offset pointers in the hardware.  The trick on the G400 is    * upto the first 4 offset pointers point to mipmap levels.  The last    * offset pointer tells how large the preceeding mipmap is.  This value is    * then used to determine where the remaining mipmaps are.    *     * For example, if the first offsets[0] through offsets[2] are used as    * pointers, then offset[3] will be the size of the mipmap pointed to by    * offsets[2].  So mipmap level 3 will be at (offsets[2]+offsets[3]).  For    * each successive mipmap level, offsets[3] is divided by 4 and added to    * the previous address.  So mipmap level 4 will be at     * (offsets[2]+offsets[3]+(offsets[3] / 4)).    *     * The last pointer is selected by setting TO_texorgoffsetsel in its    * pointer.  In the previous example, offset[2] would have    * TO_texorgoffsetsel or'ed in before writing it to the hardware.    *     * In the current driver all of the mipmaps are packed together linearly    * with mipmap level 0.  Therefore offsets[0] points to the base of the    * texture (and has TO_texorgoffsetsel or'ed in), and offsets[1] is the    * size of the base texture.    *    * There is a possible optimization available here.  At times the driver    * may not be able to allocate a single block of memory for the complete    * texture without ejecting some other textures from memory.  It may be    * possible to put some of the lower mipmap levels (i.e., the larger    * mipmaps) in memory separate from the higher levels.    *    * The implementation should be fairly obvious, but getting "right" would    * likely be non-trivial.  A first allocation for the entire texture would    * be attempted with a flag that says "don't eject other textures."  If    * that failed, an additional allocation would be attmpted for just the    * base map.  The process would repeat with the block of lower maps.  The    * tricky parts would be in detecting when some of the levels had been    * ejected from texture memory by other textures and preventing the    * 4th allocation (for all the smallest mipmap levels) from kicking out    * any of the first three.    *     * This array holds G400_TEX_MAXLEVELS pointers to remove an if-statement    * in a loop in mgaSetTexImages.  Values past G200_TEX_MAXLEVELS are not    * used.    */   GLuint             offsets[G400_TEX_MAXLEVELS];   int                texelBytes;   GLuint             age;   drm_mga_texture_regs_t setup;   /* If one texture dimension wraps with GL_CLAMP and the other with    * GL_CLAMP_TO_EDGE, we have to fallback to software.  We would also have    * to fallback for GL_CLAMP_TO_BORDER.    */   GLboolean          border_fallback;   /* Depending on multitxturing and environment color    * GL_BLEND may have to be a software fallback.    */   GLboolean texenv_fallback;} mgaTextureObject_t;struct mga_hw_state {   GLuint   specen;   GLuint   cull;   GLuint   cull_dualtex;   GLuint   stencil;   GLuint   stencilctl;   GLuint   stencil_enable;   GLuint   zmode;   GLuint   rop;   GLuint   alpha_func;   GLuint   alpha_func_enable;   GLuint   blend_func;   GLuint   blend_func_enable;   GLuint   alpha_sel;};struct mga_context_t {   GLcontext *glCtx;   unsigned int lastStamp;		/* fullscreen breaks dpriv->laststamp,					 * need to shadow it here. */   /* Hardware state management    */   struct mga_hw_state hw;   /* Bookkeeping for texturing    */   unsigned           nr_heaps;   driTexHeap       * texture_heaps[ MGA_NR_TEX_HEAPS ];   driTextureObject   swapped;   struct mga_texture_object_s *CurrentTexObj[2];   /* Map GL texture units onto hardware.    */   GLuint tmu_source[2];      int texture_depth;   /* Manage fallbacks    */   GLuint Fallback;     /* Texture environment color.    */   unsigned int envcolor[2];   GLboolean fcol_used;   GLboolean force_dualtex;   /* Rasterization state     */   GLuint SetupNewInputs;   GLuint SetupIndex;   GLuint RenderIndex;      GLuint hw_primitive;   GLenum raster_primitive;   GLenum render_primitive;   GLubyte *verts;   GLint vertex_stride_shift;   GLuint vertex_format;		   GLuint vertex_size;   /* Fallback rasterization functions     */   mga_point_func draw_point;   mga_line_func draw_line;   mga_tri_func draw_tri;   /* Manage driver and hardware state    */   GLuint        NewGLState;    GLuint        dirty;   drm_mga_context_regs_t setup;   GLuint        ClearColor;   GLuint        ClearDepth;   GLuint        poly_stipple;   GLfloat       depth_scale;   GLuint        depth_clear_mask;   GLuint        stencil_clear_mask;   GLuint        hw_stencil;   GLuint        haveHwStipple;   GLfloat       hw_viewport[16];   /* Dma buffers    */   drmBufPtr  vertex_dma_buffer;   drmBufPtr  iload_buffer;   int64_t swap_ust;   int64_t swap_missed_ust;   GLuint swap_count;   GLuint swap_missed_count;   uint32_t last_frame_fence;   /* Drawable, cliprect and scissor information    */   int dirty_cliprects;		/* which sets of cliprects are uptodate? */   int draw_buffer;		/* which buffer are we rendering to */   unsigned int drawOffset;		/* draw buffer address in  space */   int readOffset;   int drawX, drawY;		/* origin of drawable in draw buffer */   int lastX, lastY;		/* detect DSTORG bug */   GLuint numClipRects;		/* cliprects for the draw buffer */   drm_clip_rect_t *pClipRects;   drm_clip_rect_t draw_rect;   drm_clip_rect_t scissor_rect;   int scissor;   drm_clip_rect_t tmp_boxes[2][MGA_NR_SAREA_CLIPRECTS];   /* Texture aging and DMA based aging.    */   unsigned int texAge[MGA_NR_TEX_HEAPS];/* texture LRU age  */   unsigned int dirtyAge;		/* buffer age for synchronization */   GLuint primary_offset;   /* Mirrors of some DRI state.    */   drm_context_t hHWContext;   drm_hw_lock_t *driHwLock;   int driFd;   __DRIdrawablePrivate *driDrawable;   __DRIdrawablePrivate *driReadable;   __DRIscreenPrivate *driScreen;   struct mga_screen_private_s *mgaScreen;   drm_mga_sarea_t *sarea;   /* Configuration cache    */   driOptionCache optionCache;};#define MGA_CONTEXT(ctx) ((mgaContextPtr)(ctx->DriverCtx))/* ================================================================ * Debugging: */#define DO_DEBUG		1#if DO_DEBUGextern int MGA_DEBUG;#else#define MGA_DEBUG		0#endif#define DEBUG_VERBOSE_MSG	0x01#define DEBUG_VERBOSE_DRI	0x02#define DEBUG_VERBOSE_IOCTL	0x04#define DEBUG_VERBOSE_TEXTURE   0x08#define DEBUG_VERBOSE_FALLBACK	0x10static INLINE GLuint mgaPackColor(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;   }}/* * Subpixel offsets for window coordinates: */#define SUBPIXEL_X (-0.5F)#define SUBPIXEL_Y (-0.5F + 0.125)#define MGA_WA_TRIANGLES     0x18000000#define MGA_WA_TRISTRIP_T0   0x02010200#define MGA_WA_TRIFAN_T0     0x01000408#define MGA_WA_TRISTRIP_T0T1 0x02010400#define MGA_WA_TRIFAN_T0T1   0x01000810#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -