static void TAG(gamma_point)( gammaContextPtr gmesa, 
			     const gammaVertex *v0 )
{
    uint32_t vColor;
    uint32_t vBegin;

    vBegin = gmesa->Begin | B_PrimType_Points;

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, Begin, vBegin);

#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v0->v.color.alpha << 24) |
	     (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v0->v.u0);
    WRITEF(gmesa->buf, Ts2, v0->v.v0);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, FlushSpan, 0);
#endif

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, End, 0);
}

static void TAG(gamma_line)( gammaContextPtr gmesa, 
			     const gammaVertex *v0,
			     const gammaVertex *v1 )
{
    uint32_t vColor;
    uint32_t vBegin;

    vBegin = gmesa->Begin | B_PrimType_Lines;

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, Begin, vBegin);

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v0->v.color.alpha << 24) |
	     (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#else
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v1->v.color.alpha << 24) |
	     (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v0->v.u0);
    WRITEF(gmesa->buf, Ts2, v0->v.v0);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v1->v.color.alpha << 24) |
	     (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v1->v.u0);
    WRITEF(gmesa->buf, Ts2, v1->v.v0);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, FlushSpan, 0);
#endif

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, End, 0);
}

static void TAG(gamma_triangle)( gammaContextPtr gmesa,
				 const gammaVertex *v0,
				 const gammaVertex *v1, 
				 const gammaVertex *v2 )
{
    uint32_t vColor;
    uint32_t vBegin;

    vBegin = gmesa->Begin | B_PrimType_Triangles;

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, Begin, vBegin);

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v0->v.color.alpha << 24) |
	     (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#else
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v2->v.color.alpha << 24) |
	     (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v0->v.u0);
    WRITEF(gmesa->buf, Ts2, v0->v.v0);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v1->v.color.alpha << 24) |
	     (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v1->v.u0);
    WRITEF(gmesa->buf, Ts2, v1->v.v0);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v2->v.color.alpha << 24) |
	     (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v2->v.u0);
    WRITEF(gmesa->buf, Ts2, v2->v.v0);
    WRITEF(gmesa->buf, Vw, v2->v.w);
    WRITEF(gmesa->buf, Vz, v2->v.z);
    WRITEF(gmesa->buf, Vy, v2->v.y);
    WRITEF(gmesa->buf, Vx4, v2->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v2->v.w);
    WRITEF(gmesa->buf, Vz, v2->v.z);
    WRITEF(gmesa->buf, Vy, v2->v.y);
    WRITEF(gmesa->buf, Vx4, v2->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, FlushSpan, 0);
#endif

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, End, 0);
}

static void TAG(gamma_quad)( gammaContextPtr gmesa,
			    const gammaVertex *v0,
			    const gammaVertex *v1,
			    const gammaVertex *v2,
			    const gammaVertex *v3 )
{
    uint32_t vColor;
    uint32_t vBegin;

    vBegin = gmesa->Begin | B_PrimType_Quads;

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, Begin, vBegin);

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v0->v.color.alpha << 24) |
	     (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v0->v.color.blue  << 16) |
	     (v0->v.color.green <<  8) |
	     (v0->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#else
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v3->v.color.alpha << 24) |
	     (v3->v.color.blue  << 16) |
	     (v3->v.color.green <<  8) |
	     (v3->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v3->v.color.blue  << 16) |
	     (v3->v.color.green <<  8) |
	     (v3->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v0->v.u0);
    WRITEF(gmesa->buf, Ts2, v0->v.v0);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v0->v.w);
    WRITEF(gmesa->buf, Vz, v0->v.z);
    WRITEF(gmesa->buf, Vy, v0->v.y);
    WRITEF(gmesa->buf, Vx4, v0->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v1->v.color.alpha << 24) |
	     (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v1->v.color.blue  << 16) |
	     (v1->v.color.green <<  8) |
	     (v1->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v1->v.u0);
    WRITEF(gmesa->buf, Ts2, v1->v.v0);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v1->v.w);
    WRITEF(gmesa->buf, Vz, v1->v.z);
    WRITEF(gmesa->buf, Vy, v1->v.y);
    WRITEF(gmesa->buf, Vx4, v1->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v2->v.color.alpha << 24) |
	     (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v2->v.color.blue  << 16) |
	     (v2->v.color.green <<  8) |
	     (v2->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v2->v.u0);
    WRITEF(gmesa->buf, Ts2, v2->v.v0);
    WRITEF(gmesa->buf, Vw, v2->v.w);
    WRITEF(gmesa->buf, Vz, v2->v.z);
    WRITEF(gmesa->buf, Vy, v2->v.y);
    WRITEF(gmesa->buf, Vx4, v2->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v2->v.w);
    WRITEF(gmesa->buf, Vz, v2->v.z);
    WRITEF(gmesa->buf, Vy, v2->v.y);
    WRITEF(gmesa->buf, Vx4, v2->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
#if (IND & GAMMA_RAST_ALPHA_BIT)
    vColor = (v3->v.color.alpha << 24) |
	     (v3->v.color.blue  << 16) |
	     (v3->v.color.green <<  8) |
	     (v3->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor4, vColor);
#else
    vColor = (v3->v.color.blue  << 16) |
	     (v3->v.color.green <<  8) |
	     (v3->v.color.red   <<  0);

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, PackedColor3, vColor);
#endif
#endif

#if (IND & GAMMA_RAST_TEX_BIT)
    CHECK_DMA_BUFFER(gmesa, 6);
    WRITEF(gmesa->buf, Tt2, v3->v.u0);
    WRITEF(gmesa->buf, Ts2, v3->v.v0);
    WRITEF(gmesa->buf, Vw, v3->v.w);
    WRITEF(gmesa->buf, Vz, v3->v.z);
    WRITEF(gmesa->buf, Vy, v3->v.y);
    WRITEF(gmesa->buf, Vx4, v3->v.x);
#else
    CHECK_DMA_BUFFER(gmesa, 4);
    WRITEF(gmesa->buf, Vw, v3->v.w);
    WRITEF(gmesa->buf, Vz, v3->v.z);
    WRITEF(gmesa->buf, Vy, v3->v.y);
    WRITEF(gmesa->buf, Vx4, v3->v.x);
#endif

#if !(IND & GAMMA_RAST_FLAT_BIT)
    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, FlushSpan, 0);
#endif

    CHECK_DMA_BUFFER(gmesa, 1);
    WRITE(gmesa->buf, End, 0);
}

static void TAG(gamma_init)(void)
{
	gamma_point_tab[IND]	= TAG(gamma_point);
	gamma_line_tab[IND]	= TAG(gamma_line);
	gamma_tri_tab[IND]	= TAG(gamma_triangle);
	gamma_quad_tab[IND]	= TAG(gamma_quad);
}

#undef IND
#undef TAG
