⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intel_tris.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   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 + -