📄 ffb_rendertmp.h
字号:
/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_rendertmp.h,v 1.2 2003/01/29 23:00:40 dawes Exp $ */#define IMPL_LOCAL_VARS \ ffbContextPtr fmesa = FFB_CONTEXT(ctx); \ ffb_fbcPtr ffb = fmesa->regs; \ const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ FFB_DELAYED_VIEWPORT_VARS; \ (void) fmesa; (void) ffb; (void) elt#if (IND & FFB_FLAT_BIT)#define FFB_DECLARE_CACHED_COLOR(NAME) \ unsigned int NAME;#define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) \ NAME = FFB_PACK_CONST_UBYTE_ARGB_COLOR((VTX)->color[0])#define FFB_CACHED_COLOR_SAME(NAME1, NAME2) \ ((NAME1) == (NAME2))#define FFB_CACHED_COLOR_SET(NAME) \ ffb->fg = (NAME)#define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) \ ffb->fg = (NAME1) = (NAME2)#define FFB_SET_PRIM_COLOR(COLOR_VERTEX) \ ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR((COLOR_VERTEX)->color[0])#define FFB_PRIM_COLOR_COST 1#define FFB_SET_VERTEX_COLOR(VTX) /**/#define FFB_VERTEX_COLOR_COST 0#else#define FFB_DECLARE_CACHED_COLOR(NAME) /**/#define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) /**/#define FFB_CACHED_COLOR_SAME(NAME1, NAME2) 0#define FFB_CACHED_COLOR_SET(NAME1) /**/#define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) /**/#define FFB_SET_PRIM_COLOR(COLOR_VERTEX) /**/#define FFB_PRIM_COLOR_COST 0#if (IND & FFB_ALPHA_BIT)#define FFB_SET_VERTEX_COLOR(VTX) \ ffb->alpha = FFB_GET_ALPHA(VTX); \ ffb->red = FFB_GET_RED(VTX); \ ffb->green = FFB_GET_GREEN(VTX); \ ffb->blue = FFB_GET_BLUE(VTX)#define FFB_VERTEX_COLOR_COST 4#else#define FFB_SET_VERTEX_COLOR(VTX) \ ffb->red = FFB_GET_RED(VTX); \ ffb->green = FFB_GET_GREEN(VTX); \ ffb->blue = FFB_GET_BLUE(VTX)#define FFB_VERTEX_COLOR_COST 3#endif#endif#define RESET_STIPPLE ffb->lpat = fmesa->lpat;#if !(IND & (FFB_TRI_CULL_BIT))static void TAG(ffb_vb_points)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", __FUNCTION__, start, count, flags);#endif ffbRenderPrimitive(ctx, GL_POINTS); if (ctx->_TriangleCaps & DD_POINT_SMOOTH) { for (i = start; i < count; i++) { ffb_vertex *v0 = &fmesa->verts[ELT(i)]; FFBFifo(fmesa, 4); ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]); ffb->z = FFB_GET_Z(v0); ffb->y = FFB_GET_Y(v0) + 0x8000 /* FIX ME */; ffb->x = FFB_GET_X(v0) + 0x8000 /* FIX ME */; } } else { for (i = start; i < count; i++) { ffb_vertex *v0 = &fmesa->verts[ELT(i)]; FFBFifo(fmesa, 4); ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]); ffb->constz = Z_FROM_MESA(FFB_Z_TO_FLOAT(FFB_GET_Z(v0))); ffb->bh = FFB_GET_Y(v0) >> 16; ffb->bw = FFB_GET_X(v0) >> 16; } } fmesa->ffbScreen->rp_active = 1;}static void TAG(ffb_vb_lines)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", __FUNCTION__, start, count, flags);#endif ffbRenderPrimitive(ctx, GL_LINES); for (i = start + 1; i < count; i += 2) { ffb_vertex *v0 = &fmesa->verts[i - 1]; ffb_vertex *v1 = &fmesa->verts[i - 0]; FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + (FFB_VERTEX_COLOR_COST * 2) + 6)); RESET_STIPPLE; FFB_SET_PRIM_COLOR(v1); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->ryf = FFB_GET_Y(v0); ffb->rxf = FFB_GET_X(v0); FFB_SET_VERTEX_COLOR(v1); ffb->z = FFB_GET_Z(v1); ffb->y = FFB_GET_Y(v1); ffb->x = FFB_GET_X(v1); }}static void TAG(ffb_vb_line_loop)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", __FUNCTION__, start, count, flags);#endif ffbRenderPrimitive(ctx, GL_LINE_LOOP); if ((flags & PRIM_BEGIN) != 0) { ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)]; ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)]; FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2)))); RESET_STIPPLE; FFB_SET_PRIM_COLOR(v1); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->ryf = FFB_GET_Y(v0); ffb->rxf = FFB_GET_X(v0); FFB_SET_VERTEX_COLOR(v1); ffb->z = FFB_GET_Z(v1); ffb->y = FFB_GET_Y(v1); ffb->x = FFB_GET_X(v1); } for (i = start + 2; i < count; i++) { ffb_vertex *v0 = &fmesa->verts[ELT(i)]; FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + (FFB_VERTEX_COLOR_COST + 3))); FFB_SET_PRIM_COLOR(v0); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->y = FFB_GET_Y(v0); ffb->x = FFB_GET_X(v0); } if ((flags & PRIM_END) != 0) { ffb_vertex *v0 = &fmesa->verts[ELT(start)]; FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + (FFB_VERTEX_COLOR_COST + 3))); FFB_SET_PRIM_COLOR(v0); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->y = FFB_GET_Y(v0); ffb->x = FFB_GET_X(v0); } fmesa->ffbScreen->rp_active = 1;}static void TAG(ffb_vb_line_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; FFB_DECLARE_CACHED_COLOR(cached_fg) IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", __FUNCTION__, start, count, flags);#endif ffbRenderPrimitive(ctx, GL_LINE_STRIP); FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST + ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2)))); RESET_STIPPLE; { ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)]; ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)]; FFB_COMPUTE_CACHED_COLOR(cached_fg, v0); FFB_CACHED_COLOR_SET(cached_fg); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->ryf = FFB_GET_Y(v0); ffb->rxf = FFB_GET_X(v0); FFB_SET_VERTEX_COLOR(v1); ffb->z = FFB_GET_Z(v1); ffb->y = FFB_GET_Y(v1); ffb->x = FFB_GET_X(v1); } for (i = start + 2; i < count; i++) { ffb_vertex *v1 = &fmesa->verts[ELT(i - 0)]; FFB_DECLARE_CACHED_COLOR(new_fg) FFB_COMPUTE_CACHED_COLOR(new_fg, v1); if (FFB_CACHED_COLOR_SAME(cached_fg, new_fg)) { FFBFifo(fmesa, ((FFB_VERTEX_COLOR_COST * 1) + (3 * 1))); } else { FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + (FFB_VERTEX_COLOR_COST * 1) + (3 * 1))); FFB_CACHED_COLOR_UPDATE(cached_fg, new_fg); } FFB_SET_VERTEX_COLOR(v1); ffb->z = FFB_GET_Z(v1); ffb->y = FFB_GET_Y(v1); ffb->x = FFB_GET_X(v1); } fmesa->ffbScreen->rp_active = 1;}#endif /* !(IND & (FFB_TRI_CULL_BIT)) *//* OK, now things start getting fun :-) */#if (IND & (FFB_TRI_CULL_BIT))#define FFB_AREA_DECLARE GLfloat cc, ex, ey, fx, fy;#define FFB_COMPUTE_AREA_TRI(V0, V1, V2) \{ ex = (V1)->x - (V0)->x; \ ey = (V1)->y - (V0)->y; \ fx = (V2)->x - (V0)->x; \ fy = (V2)->y - (V0)->y; \ cc = ex*fy-ey*fx; \}#define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) \{ ex = (V2)->x - (V0)->x; \ ey = (V2)->y - (V0)->y; \ fx = (V3)->x - (V1)->x; \ fy = (V3)->y - (V1)->y; \ cc = ex*fy-ey*fx; \}#else#define FFB_AREA_DECLARE /**/#define FFB_COMPUTE_AREA_TRI(V0, V1, V2) do { } while(0)#define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) do { } while(0)#endif#if (IND & FFB_TRI_CULL_BIT)#define FFB_CULL_TRI(CULL_ACTION) \ if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \ CULL_ACTION \ }#define FFB_CULL_QUAD(CULL_ACTION) \ if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \ CULL_ACTION \ }#else#define FFB_CULL_TRI(CULL_ACTION) do { } while (0)#define FFB_CULL_QUAD(CULL_ACTION) do { } while (0)#endifstatic void TAG(ffb_vb_triangles)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n", __FUNCTION__, start, count, flags);#endif ffbRenderPrimitive(ctx, GL_TRIANGLES); for (i = start + 2; i < count; i += 3) { ffb_vertex *v0 = &fmesa->verts[ELT(i - 2)]; ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)]; ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)]; FFB_AREA_DECLARE FFB_COMPUTE_AREA_TRI(v0, v1, v2); FFB_CULL_TRI(continue;); FFBFifo(fmesa, (FFB_PRIM_COLOR_COST + (FFB_VERTEX_COLOR_COST * 3) + 9)); FFB_SET_PRIM_COLOR(v2); FFB_SET_VERTEX_COLOR(v0); ffb->z = FFB_GET_Z(v0); ffb->ryf = FFB_GET_Y(v0); ffb->rxf = FFB_GET_X(v0); FFB_SET_VERTEX_COLOR(v1); ffb->z = FFB_GET_Z(v1); ffb->y = FFB_GET_Y(v1); ffb->x = FFB_GET_X(v1); FFB_SET_VERTEX_COLOR(v2); 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_vb_tri_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags){ GLint i; GLint parity = 0; IMPL_LOCAL_VARS;#ifdef FFB_RENDER_TRACE fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -