X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fswrast%2Fs_triangle.c;h=ab262beabc1c49cb8cda363a4bbb21cf6ea8563a;hb=8ef874f1a543c693cfef9c935bed05903800fbfe;hp=b5d439609d66a7a6c03aba18159b76874ceb49fb;hpb=b7f5e92f1749ce4601a758f66ddc64959f11742b;p=mesa.git diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index b5d439609d6..ab262beabc1 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -1,10 +1,8 @@ -/* $Id: s_triangle.c,v 1.57 2002/04/12 15:39:59 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 4.1 + * Version: 6.1 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -34,9 +32,8 @@ #include "glheader.h" #include "context.h" #include "colormac.h" +#include "imports.h" #include "macros.h" -#include "mem.h" -#include "mmath.h" #include "texformat.h" #include "teximage.h" #include "texstate.h" @@ -49,11 +46,14 @@ #include "s_triangle.h" - -GLboolean _mesa_cull_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) +/* + * Just used for feedback mode. + */ +GLboolean +_swrast_culltriangle( GLcontext *ctx, + const SWvertex *v0, + const SWvertex *v1, + const SWvertex *v2 ) { GLfloat ex = v1->win[0] - v0->win[0]; GLfloat ey = v1->win[1] - v0->win[1]; @@ -61,7 +61,7 @@ GLboolean _mesa_cull_triangle( GLcontext *ctx, GLfloat fy = v2->win[1] - v0->win[1]; GLfloat c = ex*fy-ey*fx; - if (c * SWRAST_CONTEXT(ctx)->_backface_sign > 0) + if (c * SWRAST_CONTEXT(ctx)->_BackfaceSign > 0) return 0; return 1; @@ -72,59 +72,39 @@ GLboolean _mesa_cull_triangle( GLcontext *ctx, /* * Render a flat-shaded color index triangle. */ -static void flat_ci_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME flat_ci_triangle #define INTERP_Z 1 #define INTERP_FOG 1 - -#define SETUP_CODE \ - span.interpMask |= SPAN_INDEX; \ - span.index = IntToFixed(v2->index); \ +#define SETUP_CODE \ + span.interpMask |= SPAN_INDEX; \ + span.index = FloatToFixed(v2->index);\ span.indexStep = 0; - -#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_index_span(ctx, &span); #include "s_tritemp.h" -} /* * Render a smooth-shaded color index triangle. */ -static void smooth_ci_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME smooth_ci_triangle #define INTERP_Z 1 #define INTERP_FOG 1 #define INTERP_INDEX 1 - -#define RENDER_SPAN( span ) _mesa_write_index_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_index_span(ctx, &span); #include "s_tritemp.h" -} /* * Render a flat-shaded RGBA triangle. */ -static void flat_rgba_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME flat_rgba_triangle #define INTERP_Z 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE - #define SETUP_CODE \ - ASSERT(!ctx->Texture._ReallyEnabled); \ + ASSERT(ctx->Texture._EnabledCoordUnits == 0);\ ASSERT(ctx->Light.ShadeModel==GL_FLAT); \ span.interpMask |= SPAN_RGBA; \ span.red = ChanToFixed(v2->color[0]); \ @@ -135,41 +115,29 @@ static void flat_rgba_triangle( GLcontext *ctx, span.greenStep = 0; \ span.blueStep = 0; \ span.alphaStep = 0; - -#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_rgba_span(ctx, &span); #include "s_tritemp.h" -} /* * Render a smooth-shaded RGBA triangle. */ -static void smooth_rgba_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ - +#define NAME smooth_rgba_triangle #define INTERP_Z 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 #define INTERP_ALPHA 1 - #define SETUP_CODE \ { \ /* texturing must be off */ \ - ASSERT(!ctx->Texture._ReallyEnabled); \ + ASSERT(ctx->Texture._EnabledCoordUnits == 0); \ ASSERT(ctx->Light.ShadeModel==GL_SMOOTH); \ } - -#define RENDER_SPAN( span ) _mesa_write_rgba_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_rgba_span(ctx, &span); #include "s_tritemp.h" -} /* @@ -178,11 +146,7 @@ static void smooth_rgba_triangle( GLcontext *ctx, * * No fog. */ -static void simple_textured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME simple_textured_triangle #define INTERP_INT_TEX 1 #define S_SCALE twidth #define T_SCALE theight @@ -191,12 +155,12 @@ static void simple_textured_triangle( GLcontext *ctx, SWcontext *swrast = SWRAST_CONTEXT(ctx); \ struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D; \ const GLint b = obj->BaseLevel; \ - const GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ - const GLfloat theight = (GLfloat) obj->Image[b]->Height; \ - const GLint twidth_log2 = obj->Image[b]->WidthLog2; \ - const GLchan *texture = (const GLchan *) obj->Image[b]->Data; \ - const GLint smask = obj->Image[b]->Width - 1; \ - const GLint tmask = obj->Image[b]->Height - 1; \ + const GLfloat twidth = (GLfloat) obj->Image[0][b]->Width; \ + const GLfloat theight = (GLfloat) obj->Image[0][b]->Height; \ + const GLint twidth_log2 = obj->Image[0][b]->WidthLog2; \ + const GLchan *texture = (const GLchan *) obj->Image[0][b]->Data; \ + const GLint smask = obj->Image[0][b]->Width - 1; \ + const GLint tmask = obj->Image[0][b]->Height - 1; \ if (!texture) { \ /* this shouldn't happen */ \ return; \ @@ -211,18 +175,17 @@ static void simple_textured_triangle( GLcontext *ctx, GLint t = FixedToInt(span.intTex[1]) & tmask; \ GLint pos = (t << twidth_log2) + s; \ pos = pos + pos + pos; /* multiply by 3 */ \ - span.color.rgb[i][RCOMP] = texture[pos]; \ - span.color.rgb[i][GCOMP] = texture[pos+1]; \ - span.color.rgb[i][BCOMP] = texture[pos+2]; \ + span.array->rgb[i][RCOMP] = texture[pos]; \ + span.array->rgb[i][GCOMP] = texture[pos+1]; \ + span.array->rgb[i][BCOMP] = texture[pos+2]; \ span.intTex[0] += span.intTexStep[0]; \ span.intTex[1] += span.intTexStep[1]; \ } \ (*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y, \ - (CONST GLchan (*)[3]) span.color.rgb, \ + (CONST GLchan (*)[3]) span.array->rgb,\ NULL ); - #include "s_tritemp.h" -} + /* @@ -232,11 +195,7 @@ static void simple_textured_triangle( GLcontext *ctx, * * No fog. */ -static void simple_z_textured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME simple_z_textured_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_INT_TEX 1 @@ -247,12 +206,12 @@ static void simple_z_textured_triangle( GLcontext *ctx, SWcontext *swrast = SWRAST_CONTEXT(ctx); \ struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D; \ const GLint b = obj->BaseLevel; \ - const GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ - const GLfloat theight = (GLfloat) obj->Image[b]->Height; \ - const GLint twidth_log2 = obj->Image[b]->WidthLog2; \ - const GLchan *texture = (const GLchan *) obj->Image[b]->Data; \ - const GLint smask = obj->Image[b]->Width - 1; \ - const GLint tmask = obj->Image[b]->Height - 1; \ + const GLfloat twidth = (GLfloat) obj->Image[0][b]->Width; \ + const GLfloat theight = (GLfloat) obj->Image[0][b]->Height; \ + const GLint twidth_log2 = obj->Image[0][b]->WidthLog2; \ + const GLchan *texture = (const GLchan *) obj->Image[0][b]->Data; \ + const GLint smask = obj->Image[0][b]->Width - 1; \ + const GLint tmask = obj->Image[0][b]->Height - 1; \ if (!texture) { \ /* this shouldn't happen */ \ return; \ @@ -269,25 +228,24 @@ static void simple_z_textured_triangle( GLcontext *ctx, GLint t = FixedToInt(span.intTex[1]) & tmask; \ GLint pos = (t << twidth_log2) + s; \ pos = pos + pos + pos; /* multiply by 3 */ \ - span.color.rgb[i][RCOMP] = texture[pos]; \ - span.color.rgb[i][GCOMP] = texture[pos+1]; \ - span.color.rgb[i][BCOMP] = texture[pos+2]; \ + span.array->rgb[i][RCOMP] = texture[pos]; \ + span.array->rgb[i][GCOMP] = texture[pos+1]; \ + span.array->rgb[i][BCOMP] = texture[pos+2]; \ zRow[i] = z; \ - span.mask[i] = 1; \ + span.array->mask[i] = 1; \ } \ else { \ - span.mask[i] = 0; \ + span.array->mask[i] = 0; \ } \ span.intTex[0] += span.intTexStep[0]; \ span.intTex[1] += span.intTexStep[1]; \ span.z += span.zStep; \ } \ (*swrast->Driver.WriteRGBSpan)(ctx, span.end, span.x, span.y, \ - (CONST GLchan (*)[3]) span.color.rgb, \ - span.mask ); - + (CONST GLchan (*)[3]) span.array->rgb,\ + span.array->mask ); #include "s_tritemp.h" -} + #if CHAN_TYPE != GL_FLOAT @@ -452,7 +410,7 @@ affine_span(GLcontext *ctx, struct sw_span *span, GLuint i; - GLchan *dest = span->color.rgba[0]; + GLchan *dest = span->array->rgba[0]; span->intTex[0] -= FIXED_HALF; span->intTex[1] -= FIXED_HALF; @@ -475,7 +433,8 @@ affine_span(GLcontext *ctx, struct sw_span *span, SPAN_NEAREST(NEAREST_RGB;ADD,3); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode in SPAN_LINEAR"); + return; } break; case GL_RGBA: @@ -496,7 +455,8 @@ affine_span(GLcontext *ctx, struct sw_span *span, SPAN_NEAREST(NEAREST_RGBA_REPLACE,4); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (2) in SPAN_LINEAR"); + return; } break; } @@ -522,7 +482,8 @@ affine_span(GLcontext *ctx, struct sw_span *span, SPAN_LINEAR(LINEAR_RGB;ADD,3); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (3) in SPAN_LINEAR"); + return; } break; case GL_RGBA: @@ -543,14 +504,16 @@ affine_span(GLcontext *ctx, struct sw_span *span, SPAN_LINEAR(LINEAR_RGBA;REPLACE,4); break; default: - abort(); - } break; + _mesa_problem(ctx, "bad tex env mode (4) in SPAN_LINEAR"); + return; + } + break; } break; } span->interpMask &= ~SPAN_RGBA; ASSERT(span->arrayMask & SPAN_RGBA); - _mesa_write_rgba_span(ctx, span); + _swrast_write_rgba_span(ctx, span); #undef SPAN_NEAREST #undef SPAN_LINEAR @@ -561,11 +524,7 @@ affine_span(GLcontext *ctx, struct sw_span *span, /* * Render an RGB/RGBA textured triangle without perspective correction. */ -static void affine_textured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME affine_textured_triangle #define INTERP_Z 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE @@ -580,13 +539,13 @@ static void affine_textured_triangle( GLcontext *ctx, struct gl_texture_unit *unit = ctx->Texture.Unit+0; \ struct gl_texture_object *obj = unit->Current2D; \ const GLint b = obj->BaseLevel; \ - const GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ - const GLfloat theight = (GLfloat) obj->Image[b]->Height; \ - info.texture = (const GLchan *) obj->Image[b]->Data; \ - info.twidth_log2 = obj->Image[b]->WidthLog2; \ - info.smask = obj->Image[b]->Width - 1; \ - info.tmask = obj->Image[b]->Height - 1; \ - info.format = obj->Image[b]->Format; \ + const GLfloat twidth = (GLfloat) obj->Image[0][b]->Width; \ + const GLfloat theight = (GLfloat) obj->Image[0][b]->Height; \ + info.texture = (const GLchan *) obj->Image[0][b]->Data; \ + info.twidth_log2 = obj->Image[0][b]->WidthLog2; \ + info.smask = obj->Image[0][b]->Width - 1; \ + info.tmask = obj->Image[0][b]->Height - 1; \ + info.format = obj->Image[0][b]->Format; \ info.filter = obj->MinFilter; \ info.envmode = unit->EnvMode; \ span.arrayMask |= SPAN_RGBA; \ @@ -607,29 +566,27 @@ static void affine_textured_triangle( GLcontext *ctx, case GL_ALPHA: \ case GL_LUMINANCE: \ case GL_INTENSITY: \ - info.tbytesline = obj->Image[b]->Width; \ + info.tbytesline = obj->Image[0][b]->Width; \ break; \ case GL_LUMINANCE_ALPHA: \ - info.tbytesline = obj->Image[b]->Width * 2; \ + info.tbytesline = obj->Image[0][b]->Width * 2; \ break; \ case GL_RGB: \ - info.tbytesline = obj->Image[b]->Width * 3; \ + info.tbytesline = obj->Image[0][b]->Width * 3; \ break; \ case GL_RGBA: \ - info.tbytesline = obj->Image[b]->Width * 4; \ + info.tbytesline = obj->Image[0][b]->Width * 4; \ break; \ default: \ _mesa_problem(NULL, "Bad texture format in affine_texture_triangle");\ return; \ } \ - info.tsize = obj->Image[b]->Height * info.tbytesline; + info.tsize = obj->Image[0][b]->Height * info.tbytesline; #define RENDER_SPAN( span ) affine_span(ctx, &span, &info); #include "s_tritemp.h" -} - struct persp_info @@ -719,7 +676,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, GLuint i; GLfloat tex_coord[3], tex_step[3]; - GLchan *dest = span->color.rgba[0]; + GLchan *dest = span->array->rgba[0]; tex_coord[0] = span->tex[0][0] * (info->smask + 1); tex_step[0] = span->texStepX[0][0] * (info->smask + 1); @@ -748,7 +705,8 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, SPAN_NEAREST(NEAREST_RGB;ADD,3); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (5) in SPAN_LINEAR"); + return; } break; case GL_RGBA: @@ -769,7 +727,8 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, SPAN_NEAREST(NEAREST_RGBA_REPLACE,4); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (6) in SPAN_LINEAR"); + return; } break; } @@ -793,7 +752,8 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, SPAN_LINEAR(LINEAR_RGB;ADD,3); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (7) in SPAN_LINEAR"); + return; } break; case GL_RGBA: @@ -814,7 +774,8 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, SPAN_LINEAR(LINEAR_RGBA;REPLACE,4); break; default: - abort(); + _mesa_problem(ctx, "bad tex env mode (8) in SPAN_LINEAR"); + return; } break; } @@ -822,8 +783,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, } ASSERT(span->arrayMask & SPAN_RGBA); - _mesa_write_rgba_span(ctx, span); - + _swrast_write_rgba_span(ctx, span); #undef SPAN_NEAREST #undef SPAN_LINEAR @@ -836,12 +796,9 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, * by interpolated Q/W comes out right. * */ -static void persp_textured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME persp_textured_triangle #define INTERP_Z 1 +#define INTERP_W 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 @@ -853,11 +810,11 @@ static void persp_textured_triangle( GLcontext *ctx, const struct gl_texture_unit *unit = ctx->Texture.Unit+0; \ const struct gl_texture_object *obj = unit->Current2D; \ const GLint b = obj->BaseLevel; \ - info.texture = (const GLchan *) obj->Image[b]->Data; \ - info.twidth_log2 = obj->Image[b]->WidthLog2; \ - info.smask = obj->Image[b]->Width - 1; \ - info.tmask = obj->Image[b]->Height - 1; \ - info.format = obj->Image[b]->Format; \ + info.texture = (const GLchan *) obj->Image[0][b]->Data; \ + info.twidth_log2 = obj->Image[0][b]->WidthLog2; \ + info.smask = obj->Image[0][b]->Width - 1; \ + info.tmask = obj->Image[0][b]->Height - 1; \ + info.format = obj->Image[0][b]->Format; \ info.filter = obj->MinFilter; \ info.envmode = unit->EnvMode; \ \ @@ -877,22 +834,22 @@ static void persp_textured_triangle( GLcontext *ctx, case GL_ALPHA: \ case GL_LUMINANCE: \ case GL_INTENSITY: \ - info.tbytesline = obj->Image[b]->Width; \ + info.tbytesline = obj->Image[0][b]->Width; \ break; \ case GL_LUMINANCE_ALPHA: \ - info.tbytesline = obj->Image[b]->Width * 2; \ + info.tbytesline = obj->Image[0][b]->Width * 2; \ break; \ case GL_RGB: \ - info.tbytesline = obj->Image[b]->Width * 3; \ + info.tbytesline = obj->Image[0][b]->Width * 3; \ break; \ case GL_RGBA: \ - info.tbytesline = obj->Image[b]->Width * 4; \ + info.tbytesline = obj->Image[0][b]->Width * 4; \ break; \ default: \ _mesa_problem(NULL, "Bad texture format in persp_textured_triangle");\ return; \ } \ - info.tsize = obj->Image[b]->Height * info.tbytesline; + info.tsize = obj->Image[0][b]->Height * info.tbytesline; #define RENDER_SPAN( span ) \ span.interpMask &= ~SPAN_RGBA; \ @@ -901,8 +858,6 @@ static void persp_textured_triangle( GLcontext *ctx, #include "s_tritemp.h" -} - #endif /* CHAN_BITS != GL_FLOAT */ @@ -913,23 +868,17 @@ static void persp_textured_triangle( GLcontext *ctx, * Render a smooth-shaded, textured, RGBA triangle. * Interpolate S,T,R with perspective correction, w/out mipmapping. */ -static void general_textured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ +#define NAME general_textured_triangle #define INTERP_Z 1 +#define INTERP_W 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 #define INTERP_SPEC 1 #define INTERP_ALPHA 1 #define INTERP_TEX 1 - -#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_texture_span(ctx, &span); #include "s_tritemp.h" -} @@ -938,59 +887,50 @@ static void general_textured_triangle( GLcontext *ctx, * Interpolate Z, RGB, Alpha, specular, fog, and N sets of texture coordinates. * Yup, it's slow. */ -static void -multitextured_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ - +#define NAME multitextured_triangle #define INTERP_Z 1 +#define INTERP_W 1 #define INTERP_FOG 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 #define INTERP_ALPHA 1 #define INTERP_SPEC 1 #define INTERP_MULTITEX 1 - -#define RENDER_SPAN( span ) _mesa_write_texture_span(ctx, &span); - +#define RENDER_SPAN( span ) _swrast_write_texture_span(ctx, &span); #include "s_tritemp.h" -} - -static void occlusion_zless_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) -{ - if (ctx->OcclusionResult) { - return; - } +/* + * Special tri function for occlusion testing + */ +#define NAME occlusion_zless_triangle #define DO_OCCLUSION_TEST #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE - +#define SETUP_CODE \ + if (ctx->OcclusionResult && !ctx->Occlusion.Active) { \ + return; \ + } #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ GLdepth z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ ctx->OcclusionResult = GL_TRUE; \ - return; \ + ctx->Occlusion.PassedCounter++; \ } \ span.z += span.zStep; \ } - #include "s_tritemp.h" -} -static void nodraw_triangle( GLcontext *ctx, - const SWvertex *v0, - const SWvertex *v1, - const SWvertex *v2 ) + + +static void +nodraw_triangle( GLcontext *ctx, + const SWvertex *v0, + const SWvertex *v1, + const SWvertex *v2 ) { (void) (ctx && v0 && v1 && v2); } @@ -1094,12 +1034,13 @@ _swrast_choose_triangle( GLcontext *ctx ) if (ctx->RenderMode==GL_RENDER) { if (ctx->Polygon.SmoothFlag) { - _mesa_set_aa_triangle_function(ctx); + _swrast_set_aa_triangle_function(ctx); ASSERT(swrast->Triangle); return; } - if (ctx->Depth.OcclusionTest && + /* special case for occlusion testing */ + if ((ctx->Depth.OcclusionTest || ctx->Occlusion.Active) && ctx->Depth.Test && ctx->Depth.Mask == GL_FALSE && ctx->Depth.Func == GL_LESS && @@ -1116,24 +1057,28 @@ _swrast_choose_triangle( GLcontext *ctx ) } } - if (ctx->Texture._ReallyEnabled) { + if (ctx->Texture._EnabledCoordUnits || ctx->FragmentProgram.Enabled) { /* Ugh, we do a _lot_ of tests to pick the best textured tri func */ const struct gl_texture_object *texObj2D; const struct gl_texture_image *texImg; GLenum minFilter, magFilter, envMode; GLint format; texObj2D = ctx->Texture.Unit[0].Current2D; - texImg = texObj2D ? texObj2D->Image[texObj2D->BaseLevel] : NULL; + texImg = texObj2D ? texObj2D->Image[0][texObj2D->BaseLevel] : NULL; format = texImg ? texImg->TexFormat->MesaFormat : -1; minFilter = texObj2D ? texObj2D->MinFilter : (GLenum) 0; magFilter = texObj2D ? texObj2D->MagFilter : (GLenum) 0; envMode = ctx->Texture.Unit[0].EnvMode; - /* First see if we can used an optimized 2-D texture function */ - if (ctx->Texture._ReallyEnabled==TEXTURE0_2D + /* First see if we can use an optimized 2-D texture function */ + if (ctx->Texture._EnabledCoordUnits == 1 + && !ctx->FragmentProgram.Enabled + && ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT && texObj2D->WrapS==GL_REPEAT && texObj2D->WrapT==GL_REPEAT + && texObj2D->_IsPowerOfTwo && texImg->Border==0 + && texImg->Width == texImg->RowStride && (format == MESA_FORMAT_RGB || format == MESA_FORMAT_RGBA) && minFilter == magFilter && ctx->Light.Model.ColorControl == GL_SINGLE_COLOR @@ -1172,7 +1117,7 @@ _swrast_choose_triangle( GLcontext *ctx ) } else { /* general case textured triangles */ - if (ctx->Texture._ReallyEnabled > TEXTURE0_ANY) { + if (ctx->Texture._EnabledCoordUnits > 1) { USE(multitextured_triangle); } else { @@ -1181,7 +1126,7 @@ _swrast_choose_triangle( GLcontext *ctx ) } } else { - ASSERT(!ctx->Texture._ReallyEnabled); + ASSERT(!ctx->Texture._EnabledCoordUnits); if (ctx->Light.ShadeModel==GL_SMOOTH) { /* smooth shaded, no texturing, stippled or some raster ops */ if (rgbmode) { @@ -1203,10 +1148,10 @@ _swrast_choose_triangle( GLcontext *ctx ) } } else if (ctx->RenderMode==GL_FEEDBACK) { - USE(_mesa_feedback_triangle); + USE(_swrast_feedback_triangle); } else { /* GL_SELECT mode */ - USE(_mesa_select_triangle); + USE(_swrast_select_triangle); } }