From 13ae06cf36f9d04c0a04cdc19196f400d7a8c642 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Wed, 29 Dec 2004 12:39:50 +0000 Subject: Large update - Remove via duplicates of shared template files - Update driver to work with current versions of the above - Rework dma accounting - Rework emitting to dma to use a consistent set of macros The handling of cliprects in the driver is still pretty questionable. --- src/mesa/drivers/dri/unichrome/via_render.c | 367 ++-------------------------- 1 file changed, 14 insertions(+), 353 deletions(-) (limited to 'src/mesa/drivers/dri/unichrome/via_render.c') diff --git a/src/mesa/drivers/dri/unichrome/via_render.c b/src/mesa/drivers/dri/unichrome/via_render.c index a59126d3ad..0b4f512b26 100644 --- a/src/mesa/drivers/dri/unichrome/via_render.c +++ b/src/mesa/drivers/dri/unichrome/via_render.c @@ -60,70 +60,25 @@ #define HAVE_ELTS 0 -static const GLenum reducedPrim[GL_POLYGON + 1] = { - GL_POINTS, - GL_LINES, - GL_LINES, - GL_LINES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES -}; - -/* Fallback to normal rendering. - */ -static void VERT_FALLBACK(GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - fprintf(stderr, "VERT_FALLBACK\n"); - tnl->Driver.Render.PrimitiveNotify(ctx, flags & PRIM_MODE_MASK); - tnl->Driver.Render.BuildVertices(ctx, start, count, ~0); - tnl->Driver.Render.PrimTabVerts[flags & PRIM_MODE_MASK](ctx, start, - count, flags); - VIA_CONTEXT(ctx)->setupNewInputs = VERT_BIT_CLIP; - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); -} - - #define LOCAL_VARS viaContextPtr vmesa = VIA_CONTEXT(ctx) -/* -#define INIT(prim) \ - do { \ - VIA_FIREVERTICES(vmesa); \ - viaRasterPrimitive(ctx, reducedPrim[prim], prim); \ - } while (0) -*/ -#define INIT(prim) \ - do { \ - viaRasterPrimitive(ctx, reducedPrim[prim], prim); \ - } while (0) -#define NEW_PRIMITIVE() VIA_FIREVERTICES(vmesa) -#define NEW_BUFFER() VIA_FIREVERTICES(vmesa) +#define INIT(prim) do { \ + viaRasterPrimitive(ctx, prim, prim); \ +} while (0) #define GET_CURRENT_VB_MAX_VERTS() \ - (((int)vmesa->dmaHigh - (int)vmesa->dmaLow) / (vmesa->vertexSize * 4)) + ((VIA_DMA_BUF_SZ - (512 + (int)vmesa->dmaLow)) / (vmesa->vertexSize * 4)) #define GET_SUBSEQUENT_VB_MAX_VERTS() \ - (VIA_DMA_BUF_SZ - 4) / (vmesa->vertexSize * 4) + (VIA_DMA_BUF_SZ - 512) / (vmesa->vertexSize * 4) +#define ALLOC_VERTS( nr ) \ + viaAllocDma( vmesa, (nr) * vmesa->vertexSize * 4) -#define EMIT_VERTS(ctx, j, nr) \ - via_emit_contiguous_verts(ctx, j, (j) + (nr)) +#define EMIT_VERTS(ctx, j, nr, buf) \ + via_emit_contiguous_verts(ctx, j, (j) + (nr), buf) -#define FINISH \ - do { \ - vmesa->primitiveRendered = GL_TRUE; \ - viaRasterPrimitiveFinish(ctx); \ - } while (0) - +#define FLUSH() VIA_FINISH_PRIM( vmesa ) #define TAG(x) via_fast##x -#include "via_dmatmp.h" +#include "tnl_dd/t_dd_dmatmp.h" #undef TAG #undef LOCAL_VARS #undef INIT @@ -141,7 +96,9 @@ static GLboolean via_run_fastrender(GLcontext *ctx, /* Don't handle clipping or indexed vertices. */ - if (VB->ClipOrMask || vmesa->renderIndex != 0 || VB->Elts) { + if (VB->ClipOrMask || + vmesa->renderIndex != 0 || + !via_fastvalidate_render( ctx, VB )) { if (VIA_DEBUG) { fprintf(stderr, "slow path\n"); fprintf(stderr, "ClipOrMask = %08x\n", VB->ClipOrMask); @@ -152,7 +109,6 @@ static GLboolean via_run_fastrender(GLcontext *ctx, } if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); vmesa->setupNewInputs = VERT_BIT_CLIP; - vmesa->primitiveRendered = GL_TRUE; tnl->Driver.Render.Start(ctx); @@ -166,9 +122,6 @@ static GLboolean via_run_fastrender(GLcontext *ctx, tnl->Driver.Render.Finish(ctx); - /*=* DBG - viewperf7.0 : fix command buffer overflow *=*/ - if (vmesa->dmaLow > (VIA_DMA_BUFSIZ / 2)) - viaFlushPrims(vmesa); if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); return GL_FALSE; /* finished the pipe */ } @@ -219,295 +172,3 @@ const struct tnl_pipeline_stage _via_fastrender_stage = }; -/* - * Render whole vertex buffers, including projection of vertices from - * clip space and clipping of primitives. - * - * This file makes calls to project vertices and to the point, line - * and triangle rasterizers via the function pointers: - * - * context->Driver.Render.* - * - */ - - -/**********************************************************************/ -/* Clip single primitives */ -/**********************************************************************/ -#undef DIFFERENT_SIGNS -#if defined(USE_IEEE) -#define NEGATIVE(x) (GET_FLOAT_BITS(x) & (1 << 31)) -#define DIFFERENT_SIGNS(x, y) ((GET_FLOAT_BITS(x) ^ GET_FLOAT_BITS(y)) & (1 << 31)) -#else -#define NEGATIVE(x) (x < 0) -#define DIFFERENT_SIGNS(x,y) (x * y <= 0 && x - y != 0) -/* Could just use (x*y<0) except for the flatshading requirements. - * Maybe there's a better way? - */ -#endif - -#define W(i) coord[i][3] -#define Z(i) coord[i][2] -#define Y(i) coord[i][1] -#define X(i) coord[i][0] -#define SIZE 4 -#define TAG(x) x##_4 -#include "via_vb_cliptmp.h" - - -/**********************************************************************/ -/* Clip and render whole begin/end objects */ -/**********************************************************************/ -#define NEED_EDGEFLAG_SETUP (ctx->_TriangleCaps & DD_TRI_UNFILLED) -#define EDGEFLAG_GET(idx) VB->EdgeFlag[idx] -#define EDGEFLAG_SET(idx, val) VB->EdgeFlag[idx] = val - - -/* Vertices, with the possibility of clipping. - */ -#define RENDER_POINTS(start, count) \ - tnl->Driver.Render.Points(ctx, start, count) - -#define RENDER_LINE(v1, v2) \ - do { \ - GLubyte c1 = mask[v1], c2 = mask[v2]; \ - GLubyte ormask = c1 | c2; \ - if (!ormask) \ - LineFunc(ctx, v1, v2); \ - else if (!(c1 & c2 & 0x3f)) \ - clip_line_4(ctx, v1, v2, ormask); \ - } while (0) - -#define RENDER_TRI(v1, v2, v3) \ - if (VIA_DEBUG) fprintf(stderr, "RENDER_TRI - clip\n"); \ - do { \ - GLubyte c1 = mask[v1], c2 = mask[v2], c3 = mask[v3]; \ - GLubyte ormask = c1 | c2 | c3; \ - if (!ormask) \ - TriangleFunc(ctx, v1, v2, v3); \ - else if (!(c1 & c2 & c3 & 0x3f)) \ - clip_tri_4(ctx, v1, v2, v3, ormask); \ - } while (0) - -#define RENDER_QUAD(v1, v2, v3, v4) \ - do { \ - GLubyte c1 = mask[v1], c2 = mask[v2]; \ - GLubyte c3 = mask[v3], c4 = mask[v4]; \ - GLubyte ormask = c1 | c2 | c3 | c4; \ - if (!ormask) \ - QuadFunc(ctx, v1, v2, v3, v4); \ - else if (!(c1 & c2 & c3 & c4 & 0x3f)) \ - clip_quad_4(ctx, v1, v2, v3, v4, ormask); \ - } while (0) - - -#define LOCAL_VARS \ - TNLcontext *tnl = TNL_CONTEXT(ctx); \ - struct vertex_buffer *VB = &tnl->vb; \ - const GLuint * const elt = VB->Elts; \ - const GLubyte *mask = VB->ClipMask; \ - const GLuint sz = VB->ClipPtr->size; \ - const tnl_line_func LineFunc = tnl->Driver.Render.Line; \ - const tnl_triangle_func TriangleFunc = tnl->Driver.Render.Triangle; \ - const tnl_quad_func QuadFunc = tnl->Driver.Render.Quad; \ - const GLboolean stipple = ctx->Line.StippleFlag; \ - (void) (LineFunc && TriangleFunc && QuadFunc); \ - (void) elt; (void) mask; (void) sz; (void) stipple; - -#define POSTFIX \ - viaRasterPrimitiveFinish(ctx) - -#define TAG(x) clip_##x##_verts -#define INIT(x) tnl->Driver.Render.PrimitiveNotify(ctx, x) -#define RESET_STIPPLE if (stipple) tnl->Driver.Render.ResetLineStipple(ctx) -#define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE -#define PRESERVE_VB_DEFS -#include "via_vb_rendertmp.h" - - -/* Elts, with the possibility of clipping. - */ -#undef ELT -#undef TAG -#define ELT(x) elt[x] -#define TAG(x) clip_##x##_elts -#include "via_vb_rendertmp.h" - -/* TODO: do this for all primitives, verts and elts: - */ -static void clip_elt_triangles(GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - tnl_render_func render_tris = tnl->Driver.Render.PrimTabElts[GL_TRIANGLES]; - struct vertex_buffer *VB = &tnl->vb; - const GLuint * const elt = VB->Elts; - GLubyte *mask = VB->ClipMask; - GLuint last = count-2; - GLuint j; - (void)flags; - tnl->Driver.Render.PrimitiveNotify(ctx, GL_TRIANGLES); - - for (j = start; j < last; j += 3) { - GLubyte c1 = mask[elt[j]]; - GLubyte c2 = mask[elt[j + 1]]; - GLubyte c3 = mask[elt[j + 2]]; - GLubyte ormask = c1 | c2 | c3; - if (ormask) { - if (start < j) - render_tris(ctx, start, j, 0); - if (!(c1 & c2 & c3 & 0x3f)) - clip_tri_4(ctx, elt[j], elt[j + 1], elt[j + 2], ormask); - start = j+3; - } - } - - if (start < j) - render_tris(ctx, start, j, 0); - - viaRasterPrimitiveFinish(ctx); -} - - -/**********************************************************************/ -/* Helper functions for drivers */ -/**********************************************************************/ -/* -void _tnl_RenderClippedPolygon(GLcontext *ctx, const GLuint *elts, GLuint n) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *VB = &tnl->vb; - GLuint *tmp = VB->Elts; - - VB->Elts = (GLuint *)elts; - tnl->Driver.Render.PrimTabElts[GL_POLYGON](ctx, 0, n, PRIM_BEGIN|PRIM_END); - VB->Elts = tmp; -} - -void _tnl_RenderClippedLine(GLcontext *ctx, GLuint ii, GLuint jj) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - tnl->Driver.Render.Line(ctx, ii, jj); -} -*/ - -/**********************************************************************/ -/* Render pipeline stage */ -/**********************************************************************/ -static GLboolean via_run_render(GLcontext *ctx, - struct tnl_pipeline_stage *stage) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - viaContextPtr vmesa = VIA_CONTEXT(ctx); - struct vertex_buffer *VB = &tnl->vb; - /* DBG */ - GLuint newInputs = stage->changed_inputs; - /*GLuint newInputs = stage->inputs;*/ - - tnl_render_func *tab; - GLuint pass = 0; - - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - tnl->Driver.Render.Start(ctx); - tnl->Driver.Render.BuildVertices(ctx, 0, VB->Count, newInputs); - if (VB->ClipOrMask) { - tab = VB->Elts ? clip_render_tab_elts : clip_render_tab_verts; - clip_render_tab_elts[GL_TRIANGLES] = clip_elt_triangles; - } - else { - tab = VB->Elts ? tnl->Driver.Render.PrimTabElts : tnl->Driver.Render.PrimTabVerts; - } - - do { - GLuint i; - - for (i = 0; i < VB->PrimitiveCount; i++) { - GLuint flags = VB->Primitive[i].mode; - GLuint start = VB->Primitive[i].start; - GLuint length= VB->Primitive[i].count; - ASSERT(length || (flags & PRIM_END)); - ASSERT((flags & PRIM_MODE_MASK) <= GL_POLYGON + 1); - if (length) - tab[flags & PRIM_MODE_MASK](ctx, start, start + length,flags); - } - } - while (tnl->Driver.Render.Multipass && tnl->Driver.Render.Multipass(ctx, ++pass)); - tnl->Driver.Render.Finish(ctx); - - /*=* DBG viewperf7.0 : fix command buffer overflow *=*/ - if (vmesa->dmaLow > (VIA_DMA_BUFSIZ / 2)) - viaFlushPrims(vmesa); - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); - return GL_FALSE; /* finished the pipe */ -} - -/* Quite a bit of work involved in finding out the inputs for the - * render stage. - */ - -static void via_check_render(GLcontext *ctx, struct tnl_pipeline_stage *stage) -{ - GLuint inputs = VERT_BIT_CLIP; - - if (ctx->Visual.rgbMode) { - inputs |= VERT_BIT_COLOR0; - - if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) - inputs |= VERT_BIT_COLOR1; - - if (ctx->Texture.Unit[0]._ReallyEnabled) { - inputs |= VERT_BIT_TEX0; - } - - if (ctx->Texture.Unit[1]._ReallyEnabled) { - inputs |= VERT_BIT_TEX1; - } - } - else { - /*inputs |= VERT_BIT_INDEX;*/ - } - - /*if (ctx->Point._Attenuated) - inputs |= VERT_POINT_SIZE;*/ - - if (ctx->Fog.Enabled) - inputs |= VERT_BIT_FOG; - - /*if (ctx->_TriangleCaps & DD_TRI_UNFILLED) - inputs |= VERT_EDGE; - - if (ctx->RenderMode == GL_FEEDBACK) - inputs |= VERT_TEX_ANY;*/ - - stage->inputs = inputs; -} - - -static void dtr(struct tnl_pipeline_stage *stage) -{ - (void)stage; -} - - -const struct tnl_pipeline_stage _via_render_stage = -{ - "via render", - (_NEW_BUFFERS | - _DD_NEW_SEPARATE_SPECULAR | - _DD_NEW_FLATSHADE | - _NEW_TEXTURE | - _NEW_LIGHT | - _NEW_POINT | - _NEW_FOG | - _DD_NEW_TRI_UNFILLED | - _NEW_RENDERMODE), /* re-check (new inputs) */ - 0, /* re-run (always runs) */ - GL_TRUE, /* active */ - 0, 0, /* inputs (set in check_render), outputs */ - 0, 0, /* changed_inputs, private */ - dtr, /* destructor */ - via_check_render, /* check - initially set to alloc data */ - via_run_render /* run */ -}; -- cgit v1.2.3