void s3vChooseVertexState( GLcontext *ctx ) { s3vContextPtr vmesa = S3V_CONTEXT( ctx ); TNLcontext *tnl = TNL_CONTEXT(ctx); GLuint ind = S3V_XYZW_BIT | S3V_RGBA_BIT; /* FIXME: will segv in tnl_dd/t_dd_vbtmp.h (line 196) on some demos */ /* if (ctx->Fog.Enabled) ind |= S3V_FOG_BIT; */ if (ctx->Texture.Unit[0]._ReallyEnabled) { _tnl_need_projected_coords( ctx, GL_FALSE ); ind |= S3V_TEX0_BIT; } else { _tnl_need_projected_coords( ctx, GL_TRUE ); } vmesa->SetupIndex = ind; if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) { tnl->Driver.Render.Interp = s3v_interp_extras; tnl->Driver.Render.CopyPV = s3v_copy_pv_extras; } else { tnl->Driver.Render.Interp = setup_tab[ind].interp; tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv; } }
/* Return the width and height of the current color buffer. */ static void s3vDDGetBufferSize( GLframebuffer *buffer, GLuint *width, GLuint *height ) { GET_CURRENT_CONTEXT(ctx); s3vContextPtr vmesa = S3V_CONTEXT(ctx); /* S3VHW_LOCK( vmesa ); */ *width = vmesa->driDrawable->w; *height = vmesa->driDrawable->h; /* S3VHW_UNLOCK( vmesa ); */ }
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 */ }
void s3vCheckTexSizes( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); s3vContextPtr vmesa = S3V_CONTEXT( ctx ); if (!setup_tab[vmesa->SetupIndex].check_tex_sizes(ctx)) { vmesa->SetupIndex |= (S3V_PTEX_BIT|S3V_RGBA_BIT); if (1 || !(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { tnl->Driver.Render.Interp = setup_tab[vmesa->SetupIndex].interp; tnl->Driver.Render.CopyPV = setup_tab[vmesa->SetupIndex].copy_pv; } } }
void s3vInitVB( GLcontext *ctx ) { s3vContextPtr vmesa = S3V_CONTEXT(ctx); GLuint size = TNL_CONTEXT(ctx)->vb.Size; vmesa->verts = (char *)ALIGN_MALLOC(size * 4 * 16, 32); { static int firsttime = 1; if (firsttime) { init_setup_tab(); firsttime = 0; vmesa->vertex_stride_shift = 6 /* 4 */; /* FIXME - only one vertex setup */ } } }
void s3vFreeVB( GLcontext *ctx ) { s3vContextPtr vmesa = S3V_CONTEXT(ctx); if (vmesa->verts) { ALIGN_FREE(vmesa->verts); vmesa->verts = 0; } if (vmesa->UbyteSecondaryColor.Ptr) { ALIGN_FREE((void *)vmesa->UbyteSecondaryColor.Ptr); vmesa->UbyteSecondaryColor.Ptr = 0; } if (vmesa->UbyteColor.Ptr) { ALIGN_FREE((void *)vmesa->UbyteColor.Ptr); vmesa->UbyteColor.Ptr = 0; } }
static 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; }
void s3vBuildVertices( GLcontext *ctx, GLuint start, GLuint count, GLuint newinputs ) { s3vContextPtr vmesa = S3V_CONTEXT( ctx ); GLubyte *v = ((GLubyte *)vmesa->verts + (start<<vmesa->vertex_stride_shift)); GLuint stride = 1<<vmesa->vertex_stride_shift; DEBUG(("*** s3vBuildVertices ***\n")); DEBUG(("vmesa->SetupNewInputs = 0x%x\n", vmesa->SetupNewInputs)); DEBUG(("vmesa->SetupIndex = 0x%x\n", vmesa->SetupIndex)); #if 1 setup_tab[vmesa->SetupIndex].emit( ctx, start, count, v, stride ); #else newinputs |= vmesa->SetupNewInputs; vmesa->SetupNewInputs = 0; DEBUG(("newinputs is 0x%x\n", newinputs)); if (!newinputs) { DEBUG(("!newinputs\n")); return; } if (newinputs & VERT_CLIP) { setup_tab[vmesa->SetupIndex].emit( ctx, start, count, v, stride ); DEBUG(("newinputs & VERT_CLIP\n")); return; } /* else { */ /* GLuint ind = 0; */ if (newinputs & VERT_RGBA) { DEBUG(("newinputs & VERT_RGBA\n")); ind |= S3V_RGBA_BIT; } if (newinputs & VERT_TEX0) { DEBUG(("newinputs & VERT_TEX0\n")); ind |= S3V_TEX0_BIT; } if (newinputs & VERT_FOG_COORD) ind |= S3V_FOG_BIT; if (vmesa->SetupIndex & S3V_PTEX_BIT) ind = ~0; ind &= vmesa->SetupIndex; DEBUG(("vmesa->SetupIndex = 0x%x\n", vmesa->SetupIndex)); DEBUG(("ind = 0x%x\n", ind)); DEBUG(("ind & vmesa->SetupIndex = 0x%x\n", (ind & vmesa->SetupIndex))); if (ind) { setup_tab[ind].emit( ctx, start, count, v, stride ); } #endif }