📄 intel_tris.c
字号:
else \ intel_draw_line( intel, v0, v1 ); \} while (0)#define POINT( v0 ) \do { \ if (DO_FALLBACK) \ intel->draw_point( intel, v0 ); \ else \ intel_draw_point( intel, v0 ); \} while (0)/*********************************************************************** * Build render functions from dd templates * ***********************************************************************/#define INTEL_OFFSET_BIT 0x01#define INTEL_TWOSIDE_BIT 0x02#define INTEL_UNFILLED_BIT 0x04#define INTEL_FALLBACK_BIT 0x08#define INTEL_MAX_TRIFUNC 0x10static struct{ tnl_points_func points; tnl_line_func line; tnl_triangle_func triangle; tnl_quad_func quad;} rast_tab[INTEL_MAX_TRIFUNC];#define DO_FALLBACK (IND & INTEL_FALLBACK_BIT)#define DO_OFFSET (IND & INTEL_OFFSET_BIT)#define DO_UNFILLED (IND & INTEL_UNFILLED_BIT)#define DO_TWOSIDE (IND & INTEL_TWOSIDE_BIT)#define DO_FLAT 0#define DO_TRI 1#define DO_QUAD 1#define DO_LINE 1#define DO_POINTS 1#define DO_FULL_QUAD 1#define HAVE_RGBA 1#define HAVE_SPEC 1#define HAVE_BACK_COLORS 0#define HAVE_HW_FLATSHADE 1#define VERTEX intelVertex#define TAB rast_tab/* Only used to pull back colors into vertices (ie, we know color is * floating point). */#define INTEL_COLOR( dst, src ) \do { \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[0], (src)[2]); \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[1], (src)[1]); \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[2], (src)[0]); \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[3], (src)[3]); \} while (0)#define INTEL_SPEC( dst, src ) \do { \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[0], (src)[2]); \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[1], (src)[1]); \ UNCLAMPED_FLOAT_TO_UBYTE((dst)[2], (src)[0]); \} while (0)#define DEPTH_SCALE intel->polygon_offset_scale#define UNFILLED_TRI unfilled_tri#define UNFILLED_QUAD unfilled_quad#define VERT_X(_v) _v->v.x#define VERT_Y(_v) _v->v.y#define VERT_Z(_v) _v->v.z#define AREA_IS_CCW( a ) (a > 0)#define GET_VERTEX(e) (intel->verts + (e * intel->vertex_size * sizeof(GLuint)))#define VERT_SET_RGBA( v, c ) if (coloroffset) INTEL_COLOR( v->ub4[coloroffset], c )#define VERT_COPY_RGBA( v0, v1 ) if (coloroffset) v0->ui[coloroffset] = v1->ui[coloroffset]#define VERT_SAVE_RGBA( idx ) if (coloroffset) color[idx] = v[idx]->ui[coloroffset]#define VERT_RESTORE_RGBA( idx ) if (coloroffset) v[idx]->ui[coloroffset] = color[idx]#define VERT_SET_SPEC( v, c ) if (specoffset) INTEL_SPEC( v->ub4[specoffset], c )#define VERT_COPY_SPEC( v0, v1 ) if (specoffset) COPY_3V(v0->ub4[specoffset], v1->ub4[specoffset])#define VERT_SAVE_SPEC( idx ) if (specoffset) spec[idx] = v[idx]->ui[specoffset]#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]#define LOCAL_VARS(n) \ struct intel_context *intel = intel_context(ctx); \ GLuint color[n] = { 0, }, spec[n] = { 0, }; \ GLuint coloroffset = intel->coloroffset; \ GLboolean specoffset = intel->specoffset; \ (void) color; (void) spec; (void) coloroffset; (void) specoffset;/*********************************************************************** * Helpers for rendering unfilled primitives * ***********************************************************************/static const GLuint hw_prim[GL_POLYGON + 1] = { PRIM3D_POINTLIST, PRIM3D_LINELIST, PRIM3D_LINELIST, PRIM3D_LINELIST, PRIM3D_TRILIST, PRIM3D_TRILIST, PRIM3D_TRILIST, PRIM3D_TRILIST, PRIM3D_TRILIST, PRIM3D_TRILIST};#define RASTERIZE(x) intelRasterPrimitive( ctx, x, hw_prim[x] )#define RENDER_PRIMITIVE intel->render_primitive#define TAG(x) x#define IND INTEL_FALLBACK_BIT#include "tnl_dd/t_dd_unfilled.h"#undef IND/*********************************************************************** * Generate GL render functions * ***********************************************************************/#define IND (0)#define TAG(x) x#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_OFFSET_BIT)#define TAG(x) x##_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT)#define TAG(x) x##_twoside#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_OFFSET_BIT)#define TAG(x) x##_twoside_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_UNFILLED_BIT)#define TAG(x) x##_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_OFFSET_BIT|INTEL_UNFILLED_BIT)#define TAG(x) x##_offset_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_UNFILLED_BIT)#define TAG(x) x##_twoside_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_OFFSET_BIT|INTEL_UNFILLED_BIT)#define TAG(x) x##_twoside_offset_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_FALLBACK_BIT)#define TAG(x) x##_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_OFFSET_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_offset_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_twoside_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_OFFSET_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_UNFILLED_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_OFFSET_BIT|INTEL_UNFILLED_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_UNFILLED_BIT|INTEL_FALLBACK_BIT)#define TAG(x) x##_twoside_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (INTEL_TWOSIDE_BIT|INTEL_OFFSET_BIT|INTEL_UNFILLED_BIT| \ INTEL_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"static voidinit_rast_tab(void){ init(); init_offset(); init_twoside(); init_twoside_offset(); init_unfilled(); init_offset_unfilled(); init_twoside_unfilled(); init_twoside_offset_unfilled(); init_fallback(); init_offset_fallback(); init_twoside_fallback(); init_twoside_offset_fallback(); init_unfilled_fallback(); init_offset_unfilled_fallback(); init_twoside_unfilled_fallback(); init_twoside_offset_unfilled_fallback();}/*********************************************************************** * Rasterization fallback helpers * ***********************************************************************//* This code is hit only when a mix of accelerated and unaccelerated * primitives are being drawn, and only for the unaccelerated * primitives. */static voidintel_fallback_tri(struct intel_context *intel, intelVertex * v0, intelVertex * v1, intelVertex * v2){ GLcontext *ctx = &intel->ctx; SWvertex v[3]; if (0) fprintf(stderr, "\n%s\n", __FUNCTION__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); _swsetup_Translate(ctx, v1, &v[1]); _swsetup_Translate(ctx, v2, &v[2]); intelSpanRenderStart(ctx); _swrast_Triangle(ctx, &v[0], &v[1], &v[2]); intelSpanRenderFinish(ctx);}static voidintel_fallback_line(struct intel_context *intel, intelVertex * v0, intelVertex * v1){ GLcontext *ctx = &intel->ctx; SWvertex v[2]; if (0) fprintf(stderr, "\n%s\n", __FUNCTION__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); _swsetup_Translate(ctx, v1, &v[1]); intelSpanRenderStart(ctx); _swrast_Line(ctx, &v[0], &v[1]); intelSpanRenderFinish(ctx);}static voidintel_fallback_point(struct intel_context *intel, intelVertex * v0){ GLcontext *ctx = &intel->ctx; SWvertex v[1]; if (0) fprintf(stderr, "\n%s\n", __FUNCTION__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); intelSpanRenderStart(ctx); _swrast_Point(ctx, &v[0]); intelSpanRenderFinish(ctx);}/**********************************************************************//* Render unclipped begin/end objects *//**********************************************************************/#define IND 0#define V(x) (intelVertex *)(vertptr + ((x)*vertsize*sizeof(GLuint)))#define RENDER_POINTS( start, count ) \ for ( ; start < count ; start++) POINT( V(ELT(start)) );#define RENDER_LINE( v0, v1 ) LINE( V(v0), V(v1) )#define RENDER_TRI( v0, v1, v2 ) TRI( V(v0), V(v1), V(v2) )#define RENDER_QUAD( v0, v1, v2, v3 ) QUAD( V(v0), V(v1), V(v2), V(v3) )#define INIT(x) intelRenderPrimitive( ctx, x )#undef LOCAL_VARS#define LOCAL_VARS \ struct intel_context *intel = intel_context(ctx); \ GLubyte *vertptr = (GLubyte *)intel->verts; \ const GLuint vertsize = intel->vertex_size; \ const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ (void) elt;#define RESET_STIPPLE#define RESET_OCCLUSION#define PRESERVE_VB_DEFS#define ELT(x) x#define TAG(x) intel_##x##_verts#include "tnl/t_vb_rendertmp.h"#undef ELT#undef TAG#define TAG(x) intel_##x##_elts#define ELT(x) elt[x]#include "tnl/t_vb_rendertmp.h"/**********************************************************************//* Render clipped primitives *//**********************************************************************/static voidintelRenderClippedPoly(GLcontext * ctx, const GLuint * elts, GLuint n){ struct intel_context *intel = intel_context(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; GLuint prim = intel->render_primitive; /* Render the new vertices as an unclipped polygon. */ { GLuint *tmp = VB->Elts; VB->Elts = (GLuint *) elts; tnl->Driver.Render.PrimTabElts[GL_POLYGON] (ctx, 0, n, PRIM_BEGIN | PRIM_END); VB->Elts = tmp; } /* Restore the render primitive */ if (prim != GL_POLYGON) tnl->Driver.Render.PrimitiveNotify(ctx, prim);}static voidintelRenderClippedLine(GLcontext * ctx, GLuint ii, GLuint jj){ TNLcontext *tnl = TNL_CONTEXT(ctx); tnl->Driver.Render.Line(ctx, ii, jj);}static voidintelFastRenderClippedPoly(GLcontext * ctx, const GLuint * elts, GLuint n){ struct intel_context *intel = intel_context(ctx); const GLuint vertsize = intel->vertex_size; GLuint *vb = intelExtendInlinePrimitive(intel, (n - 2) * 3 * vertsize); GLubyte *vertptr = (GLubyte *) intel->verts; const GLuint *start = (const GLuint *) V(elts[0]); int i, j; for (i = 2; i < n; i++) { COPY_DWORDS(j, vb, vertsize, V(elts[i - 1])); COPY_DWORDS(j, vb, vertsize, V(elts[i])); COPY_DWORDS(j, vb, vertsize, start); }}/**********************************************************************//* Choose render functions *//**********************************************************************/#define ANY_FALLBACK_FLAGS (DD_LINE_STIPPLE | DD_TRI_STIPPLE | DD_POINT_ATTEN | DD_POINT_SMOOTH | DD_TRI_SMOOTH)#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE | DD_TRI_OFFSET | DD_TRI_UNFILLED)voidintelChooseRenderState(GLcontext * ctx){ TNLcontext *tnl = TNL_CONTEXT(ctx); struct intel_context *intel = intel_context(ctx); GLuint flags = ctx->_TriangleCaps; const struct gl_fragment_program *fprog = ctx->FragmentProgram._Current; GLboolean have_wpos = (fprog && (fprog->Base.InputsRead & FRAG_BIT_WPOS)); GLuint index = 0; if (INTEL_DEBUG & DEBUG_STATE) fprintf(stderr, "\n%s\n", __FUNCTION__); if ((flags & (ANY_FALLBACK_FLAGS | ANY_RASTER_FLAGS)) || have_wpos) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -