X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Funichrome%2Fvia_tris.c;h=862c827300f47e3a037cb61301cf5bf3e8d67e05;hb=5be14fd59a24612afd09da13688d611a1711d6da;hp=b936760dc3284ca68ffa69c1972b25cb4ffe50d9;hpb=e972497310f752994a8b42636a51239d2b9d0c44;p=mesa.git diff --git a/src/mesa/drivers/dri/unichrome/via_tris.c b/src/mesa/drivers/dri/unichrome/via_tris.c index b936760dc32..862c827300f 100644 --- a/src/mesa/drivers/dri/unichrome/via_tris.c +++ b/src/mesa/drivers/dri/unichrome/via_tris.c @@ -40,6 +40,7 @@ #include "via_context.h" #include "via_tris.h" #include "via_state.h" +#include "via_span.h" #include "via_vb.h" #include "via_ioctl.h" @@ -74,7 +75,7 @@ static void __inline__ via_draw_triangle(viaContextPtr vmesa, viaVertexPtr v2) { GLuint vertsize = vmesa->vertexSize; - GLuint *vb = viaAllocDma(vmesa, 3 * 4 * vertsize); + GLuint *vb = viaExtendPrimitive(vmesa, 3 * 4 * vertsize); /* fprintf(stderr, "%s: %p %p %p\n", __FUNCTION__, v0, v1, v2); */ COPY_DWORDS(vb, vertsize, v0); COPY_DWORDS(vb, vertsize, v1); @@ -89,7 +90,7 @@ static void __inline__ via_draw_quad(viaContextPtr vmesa, viaVertexPtr v3) { GLuint vertsize = vmesa->vertexSize; - GLuint *vb = viaAllocDma(vmesa, 6 * 4 * vertsize); + GLuint *vb = viaExtendPrimitive(vmesa, 6 * 4 * vertsize); /* fprintf(stderr, "%s: %p %p %p %p\n", __FUNCTION__, v0, v1, v2, v3); */ COPY_DWORDS(vb, vertsize, v0); @@ -105,7 +106,7 @@ static __inline__ void via_draw_line(viaContextPtr vmesa, viaVertexPtr v1) { GLuint vertsize = vmesa->vertexSize; - GLuint *vb = viaAllocDma(vmesa, 2 * 4 * vertsize); + GLuint *vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize); COPY_DWORDS(vb, vertsize, v0); COPY_DWORDS(vb, vertsize, v1); } @@ -115,7 +116,7 @@ static __inline__ void via_draw_point(viaContextPtr vmesa, viaVertexPtr v0) { GLuint vertsize = vmesa->vertexSize; - GLuint *vb = viaAllocDma(vmesa, 4 * vertsize); + GLuint *vb = viaExtendPrimitive(vmesa, 4 * vertsize); COPY_DWORDS(vb, vertsize, v0); } @@ -521,7 +522,7 @@ static void viaFastRenderClippedPoly(GLcontext *ctx, const GLuint *elts, { viaContextPtr vmesa = VIA_CONTEXT(ctx); GLuint vertsize = vmesa->vertexSize; - GLuint *vb = viaAllocDma(vmesa, (n - 2) * 3 * 4 * vertsize); + GLuint *vb = viaExtendPrimitive(vmesa, (n - 2) * 3 * 4 * vertsize); GLubyte *vertptr = (GLubyte *)vmesa->verts; const GLuint *start = (const GLuint *)V(elts[0]); int i; @@ -555,7 +556,7 @@ static void viaFastRenderClippedPoly(GLcontext *ctx, const GLuint *elts, #define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK) #define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED) -static void viaChooseRenderState(GLcontext *ctx) +void viaChooseRenderState(GLcontext *ctx) { TNLcontext *tnl = TNL_CONTEXT(ctx); viaContextPtr vmesa = VIA_CONTEXT(ctx); @@ -632,12 +633,9 @@ static void viaRunPipeline(GLcontext *ctx) viaContextPtr vmesa = VIA_CONTEXT(ctx); if (vmesa->newState) { + viaChooseVertexState(ctx); + viaChooseRenderState(ctx); viaValidateState( ctx ); - - if (!vmesa->Fallback) { - viaChooseVertexState(ctx); - viaChooseRenderState(ctx); - } } _tnl_run_pipeline(ctx); @@ -677,9 +675,14 @@ void viaRasterPrimitive(GLcontext *ctx, _mesa_lookup_enum_by_nr(hwprim)); VIA_FINISH_PRIM(vmesa); - - vmesa->renderPrimitive = glprim; + viaCheckDma( vmesa, 1024 ); /* Ensure no wrapping inside this function */ + + if (vmesa->newEmitState) { + viaEmitState(vmesa); + } + + regCmdB = vmesa->regCmdB; switch (hwprim) { @@ -738,7 +741,24 @@ void viaRasterPrimitive(GLcontext *ctx, return; } - assert((vmesa->dmaLow & 0x4) == 0); +/* assert((vmesa->dmaLow & 0x4) == 0); */ + + if (vmesa->dmaCliprectAddr == 0) { + if (VIA_DEBUG) fprintf(stderr, "reserve cliprect space at %x\n", vmesa->dmaLow); + assert(vmesa->dmaLow); + vmesa->dmaCliprectAddr = vmesa->dmaLow; + BEGIN_RING(8); + OUT_RING( HC_HEADER2 ); + OUT_RING( (HC_ParaType_NotTex << 16) ); + OUT_RING( 0xCCCCCCCC ); + OUT_RING( 0xCCCCCCCC ); + OUT_RING( 0xCCCCCCCC ); + OUT_RING( 0xCCCCCCCC ); + OUT_RING( 0xCCCCCCCC ); + OUT_RING( 0xCCCCCCCC ); + ADVANCE_RING(); + } + BEGIN_RING(8); OUT_RING( HC_HEADER2 ); @@ -752,8 +772,10 @@ void viaRasterPrimitive(GLcontext *ctx, OUT_RING( vmesa->regCmdA_End ); ADVANCE_RING(); + + vmesa->renderPrimitive = glprim; + vmesa->hwPrimitive = hwprim; vmesa->dmaLastPrim = vmesa->dmaLow; - vmesa->hwPrimitive = hwprim; } /* Callback for mesa: @@ -766,36 +788,50 @@ static void viaRenderPrimitive( GLcontext *ctx, GLuint prim ) void viaFinishPrimitive(viaContextPtr vmesa) { - if (!vmesa->dmaLastPrim) { - return; - } - else if (vmesa->dmaLow != vmesa->dmaLastPrim) { - GLuint cmdA = vmesa->regCmdA_End | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK; - RING_VARS; - - /* KW: modified 0x1 to 0x4 below: - */ - if ((vmesa->dmaLow & 0x1) || !vmesa->useAgp) { - BEGIN_RING_NOCHECK( 1 ); - OUT_RING( cmdA ); - ADVANCE_RING(); - } - else { - BEGIN_RING_NOCHECK( 2 ); - OUT_RING( cmdA ); - OUT_RING( cmdA ); - ADVANCE_RING(); - } - vmesa->dmaLastPrim = 0; - - if (1 || vmesa->dmaLow > VIA_DMA_HIGHWATER) - viaFlushPrims( vmesa ); - } - else { - assert(vmesa->dmaLow >= (32 + DMA_OFFSET)); - vmesa->dmaLow -= 32; - vmesa->dmaLastPrim = 0; - } + if (VIA_DEBUG) fprintf(stderr, "%s\n", __FUNCTION__); + + if (!vmesa->dmaLastPrim) { + } + else if (vmesa->dmaLow != vmesa->dmaLastPrim) { + GLuint cmdA = vmesa->regCmdA_End | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK; + RING_VARS; + + vmesa->dmaLastPrim = 0; + + /* KW: modified 0x1 to 0x4 below: + */ + if ((vmesa->dmaLow & 0x1) || !vmesa->useAgp) { + BEGIN_RING_NOCHECK( 1 ); + OUT_RING( cmdA ); + ADVANCE_RING(); + } + else { + BEGIN_RING_NOCHECK( 2 ); + OUT_RING( cmdA ); + OUT_RING( cmdA ); + ADVANCE_RING(); + } + + if (vmesa->dmaLow > VIA_DMA_HIGHWATER) + viaFlushDma( vmesa ); + } + else { + /* Remove the primitive header: + */ + vmesa->dmaLastPrim = 0; + vmesa->dmaLow -= 8 * sizeof(GLuint); + + /* Maybe remove the cliprect as well: + */ + if (vmesa->dmaCliprectAddr == vmesa->dmaLow - 8 * sizeof(GLuint)) { + vmesa->dmaLow -= 8 * sizeof(GLuint); + vmesa->dmaCliprectAddr = 0; + } + } + + vmesa->renderPrimitive = GL_POLYGON + 1; + vmesa->hwPrimitive = GL_POLYGON + 1; + vmesa->dmaLastPrim = 0; }