diff options
Diffstat (limited to 'src/mesa/swrast_setup/ss_vb.c')
-rw-r--r-- | src/mesa/swrast_setup/ss_vb.c | 226 |
1 files changed, 162 insertions, 64 deletions
diff --git a/src/mesa/swrast_setup/ss_vb.c b/src/mesa/swrast_setup/ss_vb.c index 25f2299f473..f6720dc2f7e 100644 --- a/src/mesa/swrast_setup/ss_vb.c +++ b/src/mesa/swrast_setup/ss_vb.c @@ -31,7 +31,6 @@ #include "swrast/swrast.h" #include "tnl/t_context.h" -#include "tnl/t_stages.h" #include "math/m_vector.h" #include "ss_context.h" @@ -44,8 +43,8 @@ * in this module, but not the rest of the swrast module. */ -typedef void (*SetupFunc)( struct vertex_buffer *VB, - GLuint start, GLuint end ); +typedef void (*SetupFunc)( GLcontext *ctx, + GLuint start, GLuint end, GLuint newinputs ); #define COLOR 0x1 #define INDEX 0x2 @@ -59,47 +58,145 @@ typedef void (*SetupFunc)( struct vertex_buffer *VB, static SetupFunc setup_func[MAX_SETUPFUNC]; +#define IND (0) +#define TAG(x) x##_none +#include "ss_vbtmp.h" + #define IND (COLOR) #define TAG(x) x##_color #include "ss_vbtmp.h" -#define IND (INDEX) -#define TAG(x) x##_index +#define IND (COLOR|SPEC) +#define TAG(x) x##_color_spec +#include "ss_vbtmp.h" + +#define IND (COLOR|FOG) +#define TAG(x) x##_color_fog +#include "ss_vbtmp.h" + +#define IND (COLOR|SPEC|FOG) +#define TAG(x) x##_color_spec_fog +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0) +#define TAG(x) x##_color_tex0 +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0|SPEC) +#define TAG(x) x##_color_tex0_spec +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0|FOG) +#define TAG(x) x##_color_tex0_fog #include "ss_vbtmp.h" -#define IND (TEX0|COLOR) -#define TAG(x) x##_tex0_color +#define IND (COLOR|TEX0|SPEC|FOG) +#define TAG(x) x##_color_tex0_spec_fog #include "ss_vbtmp.h" -#define IND (TEX0|COLOR|SPEC) -#define TAG(x) x##_tex0_color_spec +#define IND (COLOR|MULTITEX) +#define TAG(x) x##_color_multitex #include "ss_vbtmp.h" -#define IND (TEX0|COLOR|SPEC|FOG) -#define TAG(x) x##_tex0_color_spec_fog +#define IND (COLOR|MULTITEX|SPEC) +#define TAG(x) x##_color_multitex_spec #include "ss_vbtmp.h" -#define IND (MULTITEX|COLOR) -#define TAG(x) x##_multitex_color +#define IND (COLOR|MULTITEX|FOG) +#define TAG(x) x##_color_multitex_fog #include "ss_vbtmp.h" -#define IND (MULTITEX|COLOR|SPEC|FOG) -#define TAG(x) x##_multitex_color_spec_fog +#define IND (COLOR|MULTITEX|SPEC|FOG) +#define TAG(x) x##_color_multitex_spec_fog #include "ss_vbtmp.h" -#define IND (TEX0|COLOR|POINT) -#define TAG(x) x##_tex0_color_point +#define IND (COLOR|POINT) +#define TAG(x) x##_color_point #include "ss_vbtmp.h" -#define IND (MULTITEX|COLOR|SPEC|INDEX|POINT|FOG) -#define TAG(x) x##_multitex_color_spec_index_point_fog +#define IND (COLOR|SPEC|POINT) +#define TAG(x) x##_color_spec_point #include "ss_vbtmp.h" -#define IND (COLOR|INDEX|TEX0) -#define TAG(x) x##_selection_feedback +#define IND (COLOR|FOG|POINT) +#define TAG(x) x##_color_fog_point #include "ss_vbtmp.h" +#define IND (COLOR|SPEC|FOG|POINT) +#define TAG(x) x##_color_spec_fog_point +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0|POINT) +#define TAG(x) x##_color_tex0_point +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0|SPEC|POINT) +#define TAG(x) x##_color_tex0_spec_point +#include "ss_vbtmp.h" + +#define IND (COLOR|TEX0|FOG|POINT) +#define TAG(x) x##_color_tex0_fog_point +#include "ss_vbtmp.h" +#define IND (COLOR|TEX0|SPEC|FOG|POINT) +#define TAG(x) x##_color_tex0_spec_fog_point +#include "ss_vbtmp.h" + +#define IND (COLOR|MULTITEX|POINT) +#define TAG(x) x##_color_multitex_point +#include "ss_vbtmp.h" + +#define IND (COLOR|MULTITEX|SPEC|POINT) +#define TAG(x) x##_color_multitex_spec_point +#include "ss_vbtmp.h" + +#define IND (COLOR|MULTITEX|FOG|POINT) +#define TAG(x) x##_color_multitex_fog_point +#include "ss_vbtmp.h" + +#define IND (COLOR|MULTITEX|SPEC|FOG|POINT) +#define TAG(x) x##_color_multitex_spec_fog_point +#include "ss_vbtmp.h" + +#define IND (INDEX) +#define TAG(x) x##_index +#include "ss_vbtmp.h" + +#define IND (INDEX|TEX0) +#define TAG(x) x##_index_tex0 +#include "ss_vbtmp.h" + +#define IND (INDEX|FOG) +#define TAG(x) x##_index_fog +#include "ss_vbtmp.h" + +#define IND (INDEX|TEX0|FOG) +#define TAG(x) x##_index_tex0_fog +#include "ss_vbtmp.h" + +#define IND (INDEX|POINT) +#define TAG(x) x##_index_point +#include "ss_vbtmp.h" + +#define IND (INDEX|TEX0|POINT) +#define TAG(x) x##_index_tex0_point +#include "ss_vbtmp.h" + +#define IND (INDEX|FOG|POINT) +#define TAG(x) x##_index_fog_point +#include "ss_vbtmp.h" + +#define IND (INDEX|TEX0|FOG|POINT) +#define TAG(x) x##_index_tex0_fog_point +#include "ss_vbtmp.h" + + +static void +rs_invalid( GLcontext *ctx, GLuint start, GLuint end, GLuint newinputs ) +{ + fprintf(stderr, "swrast_setup: invalid setup function\n"); + (void) (ctx && start && end && newinputs); +} void _swsetup_vb_init( GLcontext *ctx ) @@ -108,45 +205,41 @@ _swsetup_vb_init( GLcontext *ctx ) (void) ctx; for (i = 0 ; i < Elements(setup_func) ; i++) - setup_func[i] = rs_multitex_color_spec_index_point_fog; + setup_func[i] = rs_invalid; - /* Some specialized cases: - */ - setup_func[0] = rs_color; + setup_func[0] = rs_none; setup_func[COLOR] = rs_color; - + setup_func[COLOR|SPEC] = rs_color_spec; + setup_func[COLOR|FOG] = rs_color_fog; + setup_func[COLOR|SPEC|FOG] = rs_color_spec_fog; + setup_func[COLOR|TEX0] = rs_color_tex0; + setup_func[COLOR|TEX0|SPEC] = rs_color_tex0_spec; + setup_func[COLOR|TEX0|FOG] = rs_color_tex0_fog; + setup_func[COLOR|TEX0|SPEC|FOG] = rs_color_tex0_spec_fog; + setup_func[COLOR|MULTITEX] = rs_color_multitex; + setup_func[COLOR|MULTITEX|SPEC] = rs_color_multitex_spec; + setup_func[COLOR|MULTITEX|FOG] = rs_color_multitex_fog; + setup_func[COLOR|MULTITEX|SPEC|FOG] = rs_color_multitex_spec_fog; + setup_func[COLOR|POINT] = rs_color_point; + setup_func[COLOR|SPEC|POINT] = rs_color_spec_point; + setup_func[COLOR|FOG|POINT] = rs_color_fog_point; + setup_func[COLOR|SPEC|FOG|POINT] = rs_color_spec_fog_point; + setup_func[COLOR|TEX0|POINT] = rs_color_tex0_point; + setup_func[COLOR|TEX0|SPEC|POINT] = rs_color_tex0_spec_point; + setup_func[COLOR|TEX0|FOG|POINT] = rs_color_tex0_fog_point; + setup_func[COLOR|TEX0|SPEC|FOG|POINT] = rs_color_tex0_spec_fog_point; + setup_func[COLOR|MULTITEX|POINT] = rs_color_multitex_point; + setup_func[COLOR|MULTITEX|SPEC|POINT] = rs_color_multitex_spec_point; + setup_func[COLOR|MULTITEX|FOG|POINT] = rs_color_multitex_fog_point; + setup_func[COLOR|MULTITEX|SPEC|FOG|POINT] = rs_color_multitex_spec_fog_point; setup_func[INDEX] = rs_index; - - setup_func[TEX0] = rs_tex0_color; - setup_func[TEX0|COLOR] = rs_tex0_color; - - setup_func[SPEC] = rs_tex0_color_spec; - setup_func[COLOR|SPEC] = rs_tex0_color_spec; - setup_func[TEX0|SPEC] = rs_tex0_color_spec; - setup_func[TEX0|COLOR|SPEC] = rs_tex0_color_spec; - - setup_func[MULTITEX] = rs_multitex_color; - setup_func[MULTITEX|COLOR] = rs_multitex_color; - - setup_func[FOG] = rs_tex0_color_spec_fog; - setup_func[COLOR|FOG] = rs_tex0_color_spec_fog; - setup_func[SPEC|FOG] = rs_tex0_color_spec_fog; - setup_func[COLOR|SPEC|FOG] = rs_tex0_color_spec_fog; - setup_func[TEX0|FOG] = rs_tex0_color_spec_fog; - setup_func[TEX0|COLOR|FOG] = rs_tex0_color_spec_fog; - setup_func[TEX0|SPEC|FOG] = rs_tex0_color_spec_fog; - setup_func[TEX0|COLOR|SPEC|FOG] = rs_tex0_color_spec_fog; - - setup_func[MULTITEX|SPEC] = rs_multitex_color_spec_fog; - setup_func[MULTITEX|COLOR|SPEC] = rs_multitex_color_spec_fog; - setup_func[MULTITEX|FOG] = rs_multitex_color_spec_fog; - setup_func[MULTITEX|SPEC|FOG] = rs_multitex_color_spec_fog; - setup_func[MULTITEX|COLOR|SPEC|FOG] = rs_multitex_color_spec_fog; - - setup_func[TEX0|POINT] = rs_tex0_color_point; - setup_func[TEX0|COLOR|POINT] = rs_tex0_color_point; - - setup_func[COLOR|INDEX|TEX0] = rs_selection_feedback; + setup_func[INDEX|TEX0] = rs_index_tex0; + setup_func[INDEX|FOG] = rs_index_fog; + setup_func[INDEX|TEX0|FOG] = rs_index_tex0_fog; + setup_func[INDEX|POINT] = rs_index_point; + setup_func[INDEX|TEX0|POINT] = rs_index_tex0_point; + setup_func[INDEX|FOG|POINT] = rs_index_fog_point; + setup_func[INDEX|TEX0|FOG|POINT] = rs_index_tex0_fog_point; } @@ -154,7 +247,7 @@ void _swsetup_choose_rastersetup_func(GLcontext *ctx) { SScontext *swsetup = SWSETUP_CONTEXT(ctx); - int funcindex; + int funcindex = 0; if (ctx->RenderMode == GL_RENDER) { if (ctx->Visual.RGBAflag) { @@ -179,11 +272,16 @@ _swsetup_choose_rastersetup_func(GLcontext *ctx) if (ctx->Fog.Enabled) funcindex |= FOG; } - else { - /* feedback or section */ - funcindex = (COLOR | INDEX | TEX0); - } - - swsetup->RasterSetup = setup_func[funcindex]; + else if (ctx->RenderMode == GL_FEEDBACK) { + if (ctx->Visual.RGBAflag) + funcindex = (COLOR | TEX0); /* is feedback color subject to fogging? */ + else + funcindex = (INDEX | TEX0); + } + else + funcindex = 0; + + swsetup->BuildProjVerts = setup_func[funcindex]; + ASSERT(setup_func[funcindex] != rs_invalid); } |