| /* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_tritmp.h,v 1.2 2002/02/22 21:32:59 dawes Exp $ */ |
| |
| static void TAG(ffb_triangle)( GLcontext *ctx, |
| ffb_vertex *v0, |
| ffb_vertex *v1, |
| ffb_vertex *v2 ) |
| { |
| ffbContextPtr fmesa = FFB_CONTEXT(ctx); |
| ffb_fbcPtr ffb = fmesa->regs; |
| #if (IND & FFB_TRI_FLAT_BIT) |
| GLuint const_fg; |
| #endif |
| FFB_DELAYED_VIEWPORT_VARS; |
| |
| #ifdef TRI_DEBUG |
| fprintf(stderr, "FFB: ffb_triangle [" |
| #if (IND & FFB_TRI_CULL_BIT) |
| " CULL" |
| #endif |
| #if (IND & FFB_TRI_FLAT_BIT) |
| " FLAT" |
| #endif |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| " ALPHA" |
| #endif |
| " ]\n"); |
| #endif |
| |
| #if (IND & FFB_TRI_CULL_BIT) |
| { /* NOTE: These are not viewport transformed yet. */ |
| GLfloat ex = v1->x - v0->x; |
| GLfloat ey = v1->y - v0->y; |
| GLfloat fx = v2->x - v0->x; |
| GLfloat fy = v2->y - v0->y; |
| GLfloat c = ex*fy-ey*fx; |
| |
| /* Culled... */ |
| if (c * fmesa->backface_sign > fmesa->ffb_zero) |
| return; |
| } |
| #endif |
| |
| #if (IND & FFB_TRI_FLAT_BIT) |
| const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( v2->color[0] ); |
| #ifdef TRI_DEBUG |
| fprintf(stderr, "FFB_tri: const_fg %08x (B[%f] G[%f] R[%f])\n", |
| const_fg, |
| FFB_2_30_FIXED_TO_FLOAT(v2->color[0].blue), |
| FFB_2_30_FIXED_TO_FLOAT(v2->color[0].green), |
| FFB_2_30_FIXED_TO_FLOAT(v2->color[0].red)); |
| #endif |
| #endif |
| |
| |
| #if (IND & FFB_TRI_FLAT_BIT) |
| FFBFifo(fmesa, 1); |
| ffb->fg = const_fg; |
| #endif |
| |
| #if (IND & FFB_TRI_FLAT_BIT) |
| FFBFifo(fmesa, 9); |
| #else |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| FFBFifo(fmesa, 21); |
| #else |
| FFBFifo(fmesa, 18); |
| #endif |
| #endif |
| |
| FFB_DUMP_VERTEX(v0); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v0); |
| #endif |
| ffb->red = FFB_GET_RED(v0); |
| ffb->green = FFB_GET_GREEN(v0); |
| ffb->blue = FFB_GET_BLUE(v0); |
| #endif |
| ffb->z = FFB_GET_Z(v0); |
| ffb->ryf = FFB_GET_Y(v0); |
| ffb->rxf = FFB_GET_X(v0); |
| |
| FFB_DUMP_VERTEX(v1); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v1); |
| #endif |
| ffb->red = FFB_GET_RED(v1); |
| ffb->green = FFB_GET_GREEN(v1); |
| ffb->blue = FFB_GET_BLUE(v1); |
| #endif |
| ffb->z = FFB_GET_Z(v1); |
| ffb->y = FFB_GET_Y(v1); |
| ffb->x = FFB_GET_X(v1); |
| |
| FFB_DUMP_VERTEX(v2); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v2); |
| #endif |
| ffb->red = FFB_GET_RED(v2); |
| ffb->green = FFB_GET_GREEN(v2); |
| ffb->blue = FFB_GET_BLUE(v2); |
| #endif |
| ffb->z = FFB_GET_Z(v2); |
| ffb->y = FFB_GET_Y(v2); |
| ffb->x = FFB_GET_X(v2); |
| |
| fmesa->ffbScreen->rp_active = 1; |
| } |
| |
| |
| static void TAG(ffb_quad)(GLcontext *ctx, |
| ffb_vertex *v0, |
| ffb_vertex *v1, |
| ffb_vertex *v2, |
| ffb_vertex *v3 ) |
| { |
| ffbContextPtr fmesa = FFB_CONTEXT(ctx); |
| ffb_fbcPtr ffb = fmesa->regs; |
| #if (IND & FFB_TRI_FLAT_BIT) |
| GLuint const_fg; |
| #endif |
| FFB_DELAYED_VIEWPORT_VARS; |
| |
| #ifdef TRI_DEBUG |
| fprintf(stderr, "FFB: ffb_quad [" |
| #if (IND & FFB_TRI_CULL_BIT) |
| " CULL" |
| #endif |
| #if (IND & FFB_TRI_FLAT_BIT) |
| " FLAT" |
| #endif |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| " ALPHA" |
| #endif |
| " ]\n"); |
| #endif /* TRI_DEBUG */ |
| |
| #if (IND & FFB_TRI_CULL_BIT) |
| { /* NOTE: These are not viewport transformed yet. */ |
| GLfloat ex = v2->x - v0->x; |
| GLfloat ey = v2->y - v0->y; |
| GLfloat fx = v3->x - v1->x; |
| GLfloat fy = v3->y - v1->y; |
| GLfloat c = ex*fy-ey*fx; |
| |
| /* Culled... */ |
| if (c * fmesa->backface_sign > fmesa->ffb_zero) |
| return; |
| } |
| #endif |
| |
| #if (IND & FFB_TRI_FLAT_BIT) |
| const_fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR( v3->color[0] ); |
| #ifdef TRI_DEBUG |
| fprintf(stderr, "FFB_quad: const_fg %08x (B[%f] G[%f] R[%f])\n", |
| const_fg, |
| FFB_2_30_FIXED_TO_FLOAT(v3->color[0].blue), |
| FFB_2_30_FIXED_TO_FLOAT(v3->color[0].green), |
| FFB_2_30_FIXED_TO_FLOAT(v3->color[0].red)); |
| #endif |
| #endif |
| |
| |
| #if (IND & FFB_TRI_FLAT_BIT) |
| FFBFifo(fmesa, 13); |
| ffb->fg = const_fg; |
| #else |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| FFBFifo(fmesa, 28); |
| #else |
| FFBFifo(fmesa, 24); |
| #endif |
| #endif |
| |
| FFB_DUMP_VERTEX(v0); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v0); |
| #endif |
| ffb->red = FFB_GET_RED(v0); |
| ffb->green = FFB_GET_GREEN(v0); |
| ffb->blue = FFB_GET_BLUE(v0); |
| #endif |
| ffb->z = FFB_GET_Z(v0); |
| ffb->ryf = FFB_GET_Y(v0); |
| ffb->rxf = FFB_GET_X(v0); |
| |
| FFB_DUMP_VERTEX(v1); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v1); |
| #endif |
| ffb->red = FFB_GET_RED(v1); |
| ffb->green = FFB_GET_GREEN(v1); |
| ffb->blue = FFB_GET_BLUE(v1); |
| #endif |
| ffb->z = FFB_GET_Z(v1); |
| ffb->y = FFB_GET_Y(v1); |
| ffb->x = FFB_GET_X(v1); |
| |
| FFB_DUMP_VERTEX(v2); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v2); |
| #endif |
| ffb->red = FFB_GET_RED(v2); |
| ffb->green = FFB_GET_GREEN(v2); |
| ffb->blue = FFB_GET_BLUE(v2); |
| #endif |
| ffb->z = FFB_GET_Z(v2); |
| ffb->y = FFB_GET_Y(v2); |
| ffb->x = FFB_GET_X(v2); |
| |
| FFB_DUMP_VERTEX(v3); |
| #if !(IND & FFB_TRI_FLAT_BIT) |
| #if (IND & FFB_TRI_ALPHA_BIT) |
| ffb->alpha = FFB_GET_ALPHA(v3); |
| #endif |
| ffb->red = FFB_GET_RED(v3); |
| ffb->green = FFB_GET_GREEN(v3); |
| ffb->blue = FFB_GET_BLUE(v3); |
| #endif |
| ffb->z = FFB_GET_Z(v3); |
| ffb->dmyf = FFB_GET_Y(v3); |
| ffb->dmxf = FFB_GET_X(v3); |
| |
| fmesa->ffbScreen->rp_active = 1; |
| } |
| |
| static void TAG(ffb_init)(void) |
| { |
| ffb_tri_tab[IND] = TAG(ffb_triangle); |
| ffb_quad_tab[IND] = TAG(ffb_quad); |
| } |
| |
| #undef IND |
| #undef TAG |