📄 s3v_render.c
字号:
/* * Author: Max Lingua <sunmax@libero.it> */#include "glheader.h"#include "context.h"#include "macros.h"#include "mtypes.h"#include "tnl/t_context.h"#include "s3v_context.h"#include "s3v_tris.h"#include "s3v_vb.h"#define HAVE_POINTS 0#define HAVE_LINES 0#define HAVE_LINE_STRIPS 0#define HAVE_TRIANGLES 0#define HAVE_TRI_STRIPS 0#define HAVE_TRI_STRIP_1 0#define HAVE_TRI_FANS 0#define HAVE_QUADS 0#define HAVE_QUAD_STRIPS 0#define HAVE_POLYGONS 0#define HAVE_ELTS 0#if 0static void VERT_FALLBACK( GLcontext *ctx, GLuint start, GLuint count, GLuint flags ){ TNLcontext *tnl = TNL_CONTEXT(ctx);/* s3vContextPtr vmesa = S3V_CONTEXT(ctx); */ int _flags; DEBUG(("VERT_FALLBACK: flags & PRIM_MODE_MASK = %i\n", flags & PRIM_MODE_MASK)); DEBUG(("VERT_FALLBACK: flags=%i PRIM_MODE_MASK=%i\n", flags, PRIM_MODE_MASK));#if 0 tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );#endif tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 ); _flags = flags & PRIM_MODE_MASK; tnl->Driver.Render.PrimTabVerts[_flags]( ctx, start, count, flags ); S3V_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;}#endifstatic const GLuint hw_prim[GL_POLYGON+1] = { PrimType_Points, PrimType_Lines, PrimType_LineLoop, PrimType_LineStrip, PrimType_Triangles, PrimType_TriangleStrip, PrimType_TriangleFan, PrimType_Quads, PrimType_QuadStrip, PrimType_Polygon};static INLINE void s3vStartPrimitive( s3vContextPtr vmesa, GLenum prim ){ __DRIdrawablePrivate *dPriv = vmesa->driDrawable; int _hw_prim = hw_prim[prim]; DEBUG(("s3vStartPrimitive (new #%i) ", prim)); if (_hw_prim != vmesa->restore_primitive) { if (prim == 4) { /* TRI */ DEBUG(("switching to tri\n")); vmesa->prim_cmd = vmesa->_tri[vmesa->_3d_mode]; vmesa->alpha_cmd = vmesa->_alpha[vmesa->_3d_mode]; DMAOUT_CHECK(3DTRI_Z_BASE, 12); } else if (prim == 1) { /* LINE */ DEBUG(("switching to line\n")); vmesa->prim_cmd = DO_3D_LINE; vmesa->alpha_cmd = vmesa->_alpha[0]; DMAOUT_CHECK(3DLINE_Z_BASE, 12); } else { DEBUG(("Never mind the bollocks!\n")); } DMAOUT(vmesa->s3vScreen->depthOffset & 0x003FFFF8); DMAOUT(vmesa->DestBase); /* DMAOUT(vmesa->ScissorLR); */ /* DMAOUT(vmesa->ScissorTB); */ DMAOUT( (0 << 16) | (dPriv->w-1) ); DMAOUT( (0 << 16) | (dPriv->h-1) ); DMAOUT( (vmesa->SrcStride << 16) | vmesa->TexStride ); DMAOUT(vmesa->SrcStride); DMAOUT(vmesa->TexOffset); DMAOUT(vmesa->TextureBorderColor); DMAOUT(0); /* FOG */ DMAOUT(0); DMAOUT(0); DMAOUT(vmesa->CMD | vmesa->prim_cmd | vmesa->alpha_cmd); DMAFINISH(); } vmesa->restore_primitive = _hw_prim;}static INLINE void s3vEndPrimitive( s3vContextPtr vmesa ){/* GLcontext *ctx = vmesa->glCtx; */ DEBUG(("s3vEndPrimitive\n"));}#define LOCAL_VARS s3vContextPtr vmesa = S3V_CONTEXT(ctx)#define INIT( prim ) s3vStartPrimitive( vmesa, prim )#define FINISH s3vEndPrimitive( vmesa )#define NEW_PRIMITIVE() (void) vmesa#define NEW_BUFFER() (void) vmesa#define FIRE_VERTICES() (void) vmesa#define GET_CURRENT_VB_MAX_VERTS() \ (vmesa->bufSize - vmesa->bufCount) / 2#define GET_SUBSEQUENT_VB_MAX_VERTS() \ S3V_DMA_BUF_SZ / 2/* XXX */#define ALLOC_VERTS(nr) NULL#define EMIT_VERTS(ctx, start, count, buf) NULL#define FLUSH() s3vEndPrimitive( vmesa )#define TAG(x) s3v_##x#include "tnl_dd/t_dd_dmatmp.h"/**********************************************************************//* Render pipeline stage *//**********************************************************************/static GLboolean s3v_run_render( GLcontext *ctx, struct tnl_pipeline_stage *stage ){ s3vContextPtr vmesa = S3V_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; GLuint i; tnl_render_func *tab; DEBUG(("s3v_run_render\n")); /* FIXME: hw clip */ if (VB->ClipOrMask || vmesa->RenderIndex != 0) { DEBUG(("*** CLIPPED in render ***\n"));#if 1 return GL_TRUE; /* don't handle clipping here */#endif } /* We don't do elts */ if (VB->Elts) return GL_TRUE; tab = TAG(render_tab_verts); tnl->Driver.Render.Start( ctx ); for (i = 0 ; i < VB->PrimitiveCount ; i++ ) { GLuint prim = _tnl_translate_prim(&VB->Primitive[i]); GLuint start = VB->Primitive[i].start; GLuint length = VB->Primitive[i].count; DEBUG(("s3v_run_render (loop=%i) (lenght=%i)\n", i, length)); if (length) { tnl->Driver.Render.BuildVertices( ctx, start, start+length, ~0 /*stage->inputs*/); /* XXX */ tnl->Driver.Render.PrimTabVerts[prim & PRIM_MODE_MASK] ( ctx, start, start + length, prim ); vmesa->SetupNewInputs = VERT_BIT_POS; } } tnl->Driver.Render.Finish( ctx ); return GL_FALSE; /* finished the pipe */}const struct tnl_pipeline_stage _s3v_render_stage ={ "s3v render", NULL, NULL, NULL, NULL, s3v_run_render /* run */};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -