📄 mach64_context.h
字号:
/* $XFree86$ */ /* -*- mode: c; c-basic-offset: 3 -*- *//* * Copyright 2000 Gareth Hughes * 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, sublicense, * 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 NONINFRINGEMENT. IN NO EVENT SHALL * GARETH HUGHES 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: * Gareth Hughes <gareth@valinux.com> * Leif Delgass <ldelgass@retinalburn.net> * Jos�Fonseca <j_r_fonseca@yahoo.co.uk> */#ifndef __MACH64_CONTEXT_H__#define __MACH64_CONTEXT_H__#include "dri_util.h"#include "drm.h"#include "mach64_drm.h"#include "mtypes.h"#include "mach64_reg.h"#include "texmem.h"struct mach64_context;typedef struct mach64_context mach64ContextRec;typedef struct mach64_context *mach64ContextPtr;#include "mach64_lock.h"#include "mach64_screen.h"/* Experimental driver options */#define MACH64_CLIENT_STATE_EMITS 0/* Performace monitoring */#define ENABLE_PERF_BOXES 1/* Native vertex format */#define MACH64_NATIVE_VTXFMT 1/* Flags for what context state needs to be updated: */#define MACH64_NEW_ALPHA 0x0001#define MACH64_NEW_DEPTH 0x0002#define MACH64_NEW_FOG 0x0004#define MACH64_NEW_CLIP 0x0008#define MACH64_NEW_CULL 0x0010#define MACH64_NEW_MASKS 0x0020#define MACH64_NEW_RENDER_UNUSED 0x0040#define MACH64_NEW_WINDOW 0x0080#define MACH64_NEW_TEXTURE 0x0100#define MACH64_NEW_CONTEXT 0x0200#define MACH64_NEW_ALL 0x03ff/* Flags for software fallback cases: */#define MACH64_FALLBACK_TEXTURE 0x0001#define MACH64_FALLBACK_DRAW_BUFFER 0x0002#define MACH64_FALLBACK_READ_BUFFER 0x0004#define MACH64_FALLBACK_STENCIL 0x0008#define MACH64_FALLBACK_RENDER_MODE 0x0010#define MACH64_FALLBACK_LOGICOP 0x0020#define MACH64_FALLBACK_SEP_SPECULAR 0x0040#define MACH64_FALLBACK_BLEND_EQ 0x0080#define MACH64_FALLBACK_BLEND_FUNC 0x0100#define MACH64_FALLBACK_DISABLE 0x0200#define CARD32 GLuint /* KW: For building in mesa tree */#if MACH64_NATIVE_VTXFMT/* The vertex structures. *//* The size of this union is not of relevence: */union mach64_vertex_t { GLfloat f[16]; GLuint ui[16]; GLushort us2[16][2]; GLubyte ub4[16][4];};typedef union mach64_vertex_t mach64Vertex, *mach64VertexPtr;#else/* Use the templated vertex format: */#define TAG(x) mach64##x#include "tnl_dd/t_dd_vertex.h"#undef TAG#endif /* MACH64_NATIVE_VTXFMT *//* Subpixel offsets for window coordinates: * These are enough to fix most glean tests except polygonOffset. * There are also still some gaps that show in e.g. the tunnel Mesa demo * or the lament xscreensaver hack. */#define SUBPIXEL_X (0.0125F)#define SUBPIXEL_Y (0.15F)typedef void (*mach64_tri_func)( mach64ContextPtr, mach64Vertex *, mach64Vertex *, mach64Vertex * );typedef void (*mach64_line_func)( mach64ContextPtr, mach64Vertex *, mach64Vertex * );typedef void (*mach64_point_func)( mach64ContextPtr, mach64Vertex * );struct mach64_texture_object { driTextureObject base; GLuint bufAddr; GLint heap; /* same as base.heap->heapId */ /* For communicating values from mach64AllocTexObj(), mach64SetTexImages() * to mach64UpdateTextureUnit(). Alternately, we can use the tObj values or * set the context registers directly. */ GLint widthLog2; GLint heightLog2; GLint maxLog2; GLint hasAlpha; GLint textureFormat; GLboolean BilinearMin; GLboolean BilinearMag; GLboolean ClampS; GLboolean ClampT;};typedef struct mach64_texture_object mach64TexObj, *mach64TexObjPtr;struct mach64_context { GLcontext *glCtx; /* Driver and hardware state management */ GLuint new_state; GLuint dirty; /* Hardware state to be updated */ drm_mach64_context_regs_t setup; GLuint NewGLState; GLuint Fallback; GLuint SetupIndex; GLuint SetupNewInputs; GLuint RenderIndex; GLfloat hw_viewport[16]; GLfloat depth_scale; GLuint vertex_size; GLuint vertex_stride_shift; GLuint vertex_format; GLuint num_verts; GLubyte *verts; CARD32 Color; /* Current draw color */ CARD32 ClearColor; /* Color used to clear color buffer */ CARD32 ClearDepth; /* Value used to clear depth buffer */ /* Map GL texture units onto hardware */ GLint multitex; GLint tmu_source[2]; GLint tex_dest[2]; /* Texture object bookkeeping */ mach64TexObjPtr CurrentTexObj[2]; GLint firstTexHeap, lastTexHeap; driTexHeap *texture_heaps[MACH64_NR_TEX_HEAPS]; driTextureObject swapped; /* Fallback rasterization functions */ mach64_point_func draw_point; mach64_line_func draw_line; mach64_tri_func draw_tri; /* Culling */ GLfloat backface_sign; /* DMA buffers */ void *vert_buf; size_t vert_total; unsigned vert_used; GLuint hw_primitive; GLenum render_primitive; /* Visual, drawable, cliprect and scissor information */ 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 */ /* Mirrors of some DRI state */ __DRIcontextPrivate *driContext; /* DRI context */ __DRIscreenPrivate *driScreen; /* DRI screen */ __DRIdrawablePrivate *driDrawable; /* DRI drawable bound to this ctx */ unsigned int lastStamp; /* mirror driDrawable->lastStamp */ drm_context_t hHWContext; drm_hw_lock_t *driHwLock; int driFd; mach64ScreenPtr mach64Screen; /* Screen private DRI data */ drm_mach64_sarea_t *sarea; /* Private SAREA data */ GLuint hardwareWentIdle;#if ENABLE_PERF_BOXES /* Performance counters */ GLuint boxes; /* Draw performance boxes */ GLuint c_clears; GLuint c_drawWaits; GLuint c_textureSwaps; GLuint c_textureBytes; GLuint c_agpTextureBytes; GLuint c_texsrc_agp; GLuint c_texsrc_card; GLuint c_vertexBuffers;#endif /* VBI */ GLuint do_irqs; /* Configuration cache */ driOptionCache optionCache;};#define MACH64_CONTEXT(ctx) ((mach64ContextPtr)(ctx->DriverCtx))extern GLboolean mach64CreateContext( const __GLcontextModes *glVisual, __DRIcontextPrivate *driContextPriv, void *sharedContextPrivate );extern void mach64DestroyContext( __DRIcontextPrivate * );extern GLboolean mach64MakeCurrent( __DRIcontextPrivate *driContextPriv, __DRIdrawablePrivate *driDrawPriv, __DRIdrawablePrivate *driReadPriv );extern GLboolean mach64UnbindContext( __DRIcontextPrivate *driContextPriv );/* ================================================================ * Byte ordering */#if MESA_LITTLE_ENDIAN == 1#define LE32_IN( x ) ( *(GLuint *)(x) )#define LE32_IN_FLOAT( x ) ( *(GLfloat *)(x) )#define LE32_OUT( x, y ) do { *(GLuint *)(x) = (y); } while (0)#define LE32_OUT_FLOAT( x, y ) do { *(GLfloat *)(x) = (y); } while (0)#else#include <byteswap.h>#define LE32_IN( x ) bswap_32( *(GLuint *)(x) )#define LE32_IN_FLOAT( x ) \({ \ GLuint __tmp = bswap_32( *(GLuint *)(x) ); \ *(GLfloat *)&__tmp; \})#define LE32_OUT( x, y ) do { *(GLuint *)(x) = bswap_32( y ); } while (0)#define LE32_OUT_FLOAT( x, y ) \do { \ GLuint __tmp; \ *(GLfloat *)&__tmp = (y); \ *(GLuint *)(x) = bswap_32( __tmp ); \} while (0)#endif/* ================================================================ * DMA buffers */#define DMALOCALS CARD32 *buf=NULL; int requested=0; int outcount=0/* called while locked for interleaved client-side state emits */#define DMAGETPTR( dwords ) \do { \ requested = (dwords); \ buf = (CARD32 *)mach64AllocDmaLocked( mmesa, ((dwords)*4) ); \ outcount = 0; \} while(0)#define DMAOUTREG( reg, val ) \do { \ LE32_OUT( &buf[outcount++], ADRINDEX( reg ) ); \ LE32_OUT( &buf[outcount++], ( val ) ); \} while(0)#define DMAADVANCE() \do { \ if (outcount < requested) { \ mmesa->vert_used -= (requested - outcount) * 4; \ } \} while(0)/* ================================================================ * Debugging: */#define DO_DEBUG 1#if DO_DEBUGextern int MACH64_DEBUG;#else#define MACH64_DEBUG 0#endif#define DEBUG_ALWAYS_SYNC 0x001#define DEBUG_VERBOSE_API 0x002#define DEBUG_VERBOSE_MSG 0x004#define DEBUG_VERBOSE_LRU 0x008#define DEBUG_VERBOSE_DRI 0x010#define DEBUG_VERBOSE_IOCTL 0x020#define DEBUG_VERBOSE_PRIMS 0x040#define DEBUG_VERBOSE_COUNT 0x080#define DEBUG_NOWAIT 0x100#define DEBUG_VERBOSE_FALLBACK 0x200#endif /* __MACH64_CONTEXT_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -