textures. progs/demos/cubemap and progs/demos/stex3d seem to work correctly at all tcl_mode settings. x86 / SSE codegen is currently disabled.tags/R300_DRIVER_0
| @@ -49,7 +49,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| #include "colormac.h" | |||
| #include "r200_reg.h" | |||
| #define ENABLE_HW_3D_TEXTURE 0 /* XXX this is temporary! */ | |||
| #define ENABLE_HW_3D_TEXTURE 1 /* XXX this is temporary! */ | |||
| struct r200_context; | |||
| typedef struct r200_context r200ContextRec; | |||
| @@ -365,6 +365,12 @@ struct r200_state_atom { | |||
| #define VTX_COLOR(v,n) (((v)>>(R200_VTX_COLOR_0_SHIFT+(n)*2))&\ | |||
| R200_VTX_COLOR_MASK) | |||
| /** | |||
| * Given the \c R200_SE_VTX_FMT_1 for the current vertex state, determine | |||
| * how many components are in texture coordinate \c n. | |||
| */ | |||
| #define VTX_TEXn_COUNT(v,n) (((v) >> (3 * n)) & 0x07) | |||
| #define MAT_CMD_0 0 | |||
| #define MAT_ELT_0 1 | |||
| #define MAT_STATE_SIZE 17 | |||
| @@ -703,10 +709,14 @@ struct dfn_lists { | |||
| struct dynfn SecondaryColor3fvEXT; | |||
| struct dynfn Normal3f; | |||
| struct dynfn Normal3fv; | |||
| struct dynfn TexCoord3f; | |||
| struct dynfn TexCoord3fv; | |||
| struct dynfn TexCoord2f; | |||
| struct dynfn TexCoord2fv; | |||
| struct dynfn TexCoord1f; | |||
| struct dynfn TexCoord1fv; | |||
| struct dynfn MultiTexCoord3fARB; | |||
| struct dynfn MultiTexCoord3fvARB; | |||
| struct dynfn MultiTexCoord2fARB; | |||
| struct dynfn MultiTexCoord2fvARB; | |||
| struct dynfn MultiTexCoord1fARB; | |||
| @@ -732,10 +742,14 @@ struct dfn_generators { | |||
| struct dynfn *(*SecondaryColor3fvEXT)( GLcontext *, const int * ); | |||
| struct dynfn *(*Normal3f)( GLcontext *, const int * ); | |||
| struct dynfn *(*Normal3fv)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord3f)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord3fv)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord2f)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord2fv)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord1f)( GLcontext *, const int * ); | |||
| struct dynfn *(*TexCoord1fv)( GLcontext *, const int * ); | |||
| struct dynfn *(*MultiTexCoord3fARB)( GLcontext *, const int * ); | |||
| struct dynfn *(*MultiTexCoord3fvARB)( GLcontext *, const int * ); | |||
| struct dynfn *(*MultiTexCoord2fARB)( GLcontext *, const int * ); | |||
| struct dynfn *(*MultiTexCoord2fvARB)( GLcontext *, const int * ); | |||
| struct dynfn *(*MultiTexCoord1fARB)( GLcontext *, const int * ); | |||
| @@ -756,17 +770,16 @@ struct r200_vbinfo { | |||
| void (*notify)( void ); | |||
| GLint vertex_size; | |||
| /* A maximum total of 15 elements per vertex: 3 floats for position, 3 | |||
| /* A maximum total of 17 elements per vertex: 3 floats for position, 3 | |||
| * floats for normal, 4 floats for color, 4 bytes for secondary color, | |||
| * 2 floats for each texture unit (4 floats total). | |||
| * 3 floats for each texture unit (6 floats total). | |||
| * | |||
| * As soon as the 3rd TMU is supported or cube maps (or 3D textures) are | |||
| * supported, this value will grow. | |||
| * As soon as the 3rd through 6th TMUs are supported, this value will grow. | |||
| * | |||
| * The position data is never actually stored here, so 3 elements could be | |||
| * trimmed out of the buffer. | |||
| */ | |||
| union { float f; int i; r200_color_t color; } vertex[15]; | |||
| union { float f; int i; r200_color_t color; } vertex[17]; | |||
| GLfloat *normalptr; | |||
| GLfloat *floatcolorptr; | |||
| @@ -343,6 +343,8 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs ) | |||
| GLuint nr = 0; | |||
| GLuint vfmt0 = 0, vfmt1 = 0; | |||
| GLuint count = VB->Count; | |||
| GLuint i; | |||
| GLuint re_cntl; | |||
| if (1) { | |||
| if (!rmesa->tcl.obj.buf) | |||
| @@ -422,30 +424,34 @@ void r200EmitArrays( GLcontext *ctx, GLuint inputs ) | |||
| /* vtx = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] & */ | |||
| /* ~(R200_TCL_VTX_Q0|R200_TCL_VTX_Q1)); */ | |||
| if (inputs & VERT_BIT_TEX0) { | |||
| if (!rmesa->tcl.tex[0].buf) | |||
| emit_vector( ctx, | |||
| &(rmesa->tcl.tex[0]), | |||
| (char *)VB->TexCoordPtr[0]->data, | |||
| VB->TexCoordPtr[0]->size, | |||
| VB->TexCoordPtr[0]->stride, | |||
| count ); | |||
| vfmt1 |= VB->TexCoordPtr[0]->size << R200_VTX_TEX0_COMP_CNT_SHIFT; | |||
| component[nr++] = &rmesa->tcl.tex[0]; | |||
| re_cntl = rmesa->hw.set.cmd[SET_RE_CNTL] & ~(R200_VTX_STQ0_D3D | | |||
| R200_VTX_STQ1_D3D | | |||
| R200_VTX_STQ2_D3D | | |||
| R200_VTX_STQ3_D3D | | |||
| R200_VTX_STQ4_D3D | | |||
| R200_VTX_STQ5_D3D ); | |||
| for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { | |||
| if (inputs & (VERT_BIT_TEX0 << i)) { | |||
| if (!rmesa->tcl.tex[i].buf) | |||
| emit_vector( ctx, | |||
| &(rmesa->tcl.tex[i]), | |||
| (char *)VB->TexCoordPtr[i]->data, | |||
| VB->TexCoordPtr[i]->size, | |||
| VB->TexCoordPtr[i]->stride, | |||
| count ); | |||
| if ( ctx->Texture.Unit[i]._ReallyEnabled == TEXTURE_CUBE_BIT ) { | |||
| re_cntl |= R200_VTX_STQ0_D3D << (2 * i); | |||
| } | |||
| vfmt1 |= VB->TexCoordPtr[i]->size << (i * 3); | |||
| component[nr++] = &rmesa->tcl.tex[i]; | |||
| } | |||
| } | |||
| if (inputs & VERT_BIT_TEX1) { | |||
| if (!rmesa->tcl.tex[1].buf) | |||
| emit_vector( ctx, | |||
| &(rmesa->tcl.tex[1]), | |||
| (char *)VB->TexCoordPtr[1]->data, | |||
| VB->TexCoordPtr[1]->size, | |||
| VB->TexCoordPtr[1]->stride, | |||
| count ); | |||
| vfmt1 |= VB->TexCoordPtr[1]->size << R200_VTX_TEX1_COMP_CNT_SHIFT; | |||
| component[nr++] = &rmesa->tcl.tex[1]; | |||
| if ( re_cntl != rmesa->hw.set.cmd[SET_RE_CNTL] ) { | |||
| R200_STATECHANGE( rmesa, set ); | |||
| rmesa->hw.set.cmd[SET_RE_CNTL] = re_cntl; | |||
| } | |||
| if (vfmt0 != rmesa->hw.vtx.cmd[VTX_VTXFMT_0] || | |||
| @@ -147,22 +147,15 @@ static void r200SetVertexFormat( GLcontext *ctx ) | |||
| GLuint sz = VB->TexCoordPtr[i]->size; | |||
| GLuint emit; | |||
| /* r200 doesn't like 1D or 4D texcoords (is that true?): | |||
| /* r200 doesn't like 4D texcoords (is that true?): | |||
| */ | |||
| switch (sz) { | |||
| case 1: | |||
| case 2: | |||
| case 3: /* no attempt at cube texturing so far */ | |||
| emit = EMIT_2F; | |||
| sz = 2; | |||
| break; | |||
| case 4: | |||
| if (sz != 4) { | |||
| emit = EMIT_1F + (sz - 1); | |||
| } | |||
| else { | |||
| sz = 3; | |||
| emit = EMIT_3F_XYW; | |||
| sz = 3; | |||
| break; | |||
| default: | |||
| continue; | |||
| }; | |||
| } | |||
| fmt_1 |= sz << (3 * i); | |||
| EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_SZ(sz), 0 ); | |||
| @@ -747,6 +747,7 @@ static GLboolean r200UpdateTextureEnv( GLcontext *ctx, int unit ) | |||
| #define TEXOBJ_TXFORMAT_X_MASK (R200_DEPTH_LOG2_MASK | \ | |||
| R200_TEXCOORD_MASK | \ | |||
| R200_CLAMP_Q_MASK | \ | |||
| R200_VOLUME_FILTER_MASK) | |||
| @@ -88,10 +88,14 @@ static void count_funcs( r200ContextPtr rmesa ) | |||
| count_func( "SecondaryColor3ubv", &rmesa->vb.dfn_cache.SecondaryColor3ubvEXT ); | |||
| count_func( "Normal3f", &rmesa->vb.dfn_cache.Normal3f ); | |||
| count_func( "Normal3fv", &rmesa->vb.dfn_cache.Normal3fv ); | |||
| count_func( "TexCoord3f", &rmesa->vb.dfn_cache.TexCoord3f ); | |||
| count_func( "TexCoord3fv", &rmesa->vb.dfn_cache.TexCoord3fv ); | |||
| count_func( "TexCoord2f", &rmesa->vb.dfn_cache.TexCoord2f ); | |||
| count_func( "TexCoord2fv", &rmesa->vb.dfn_cache.TexCoord2fv ); | |||
| count_func( "TexCoord1f", &rmesa->vb.dfn_cache.TexCoord1f ); | |||
| count_func( "TexCoord1fv", &rmesa->vb.dfn_cache.TexCoord1fv ); | |||
| count_func( "MultiTexCoord3fARB", &rmesa->vb.dfn_cache.MultiTexCoord3fARB ); | |||
| count_func( "MultiTexCoord3fvARB", &rmesa->vb.dfn_cache.MultiTexCoord3fvARB ); | |||
| count_func( "MultiTexCoord2fARB", &rmesa->vb.dfn_cache.MultiTexCoord2fARB ); | |||
| count_func( "MultiTexCoord2fvARB", &rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); | |||
| count_func( "MultiTexCoord1fARB", &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); | |||
| @@ -102,6 +106,7 @@ static void count_funcs( r200ContextPtr rmesa ) | |||
| void r200_copy_to_current( GLcontext *ctx ) | |||
| { | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| unsigned i; | |||
| if (R200_DEBUG & DEBUG_VFMT) | |||
| fprintf(stderr, "%s\n", __FUNCTION__); | |||
| @@ -145,18 +150,29 @@ void r200_copy_to_current( GLcontext *ctx ) | |||
| ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2] = UBYTE_TO_FLOAT( rmesa->vb.specptr->blue ); | |||
| } | |||
| if (rmesa->vb.vtxfmt_1 & (7 << R200_VTX_TEX0_COMP_CNT_SHIFT)) { | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0][0] = rmesa->vb.texcoordptr[0][0]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0][1] = rmesa->vb.texcoordptr[0][1]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0][2] = 0.0F; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0][3] = 1.0F; | |||
| } | |||
| for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { | |||
| const unsigned count = VTX_TEXn_COUNT( rmesa->vb.vtxfmt_1, i ); | |||
| GLfloat * const src = rmesa->vb.texcoordptr[i]; | |||
| if ( count != 0 ) { | |||
| switch( count ) { | |||
| case 3: | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][1] = src[1]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][2] = src[2]; | |||
| break; | |||
| case 2: | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][1] = src[1]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][2] = 0.0F; | |||
| break; | |||
| case 1: | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][1] = 0.0F; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][2] = 0.0F; | |||
| break; | |||
| } | |||
| if (rmesa->vb.vtxfmt_1 & (7 << R200_VTX_TEX1_COMP_CNT_SHIFT)) { | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX1][0] = rmesa->vb.texcoordptr[1][0]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX1][1] = rmesa->vb.texcoordptr[1][1]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX1][2] = 0.0F; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX1][3] = 1.0F; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][0] = src[0]; | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0+i][3] = 1.0F; | |||
| } | |||
| } | |||
| ctx->Driver.NeedFlush &= ~FLUSH_UPDATE_CURRENT; | |||
| @@ -378,6 +394,42 @@ static void VFMT_FALLBACK_OUTSIDE_BEGIN_END( const char *caller ) | |||
| } | |||
| static void dispatch_texcoord( GLuint count, GLfloat * f ) | |||
| { | |||
| switch( count ) { | |||
| case 3: | |||
| _glapi_Dispatch->TexCoord3fv( f ); | |||
| break; | |||
| case 2: | |||
| _glapi_Dispatch->TexCoord2fv( f ); | |||
| break; | |||
| case 1: | |||
| _glapi_Dispatch->TexCoord1fv( f ); | |||
| break; | |||
| default: | |||
| assert( count == 0 ); | |||
| break; | |||
| } | |||
| } | |||
| static void dispatch_multitexcoord( GLuint count, GLuint unit, GLfloat * f ) | |||
| { | |||
| switch( count ) { | |||
| case 3: | |||
| _glapi_Dispatch->MultiTexCoord3fvARB( GL_TEXTURE0+unit, f ); | |||
| break; | |||
| case 2: | |||
| _glapi_Dispatch->MultiTexCoord2fvARB( GL_TEXTURE0+unit, f ); | |||
| break; | |||
| case 1: | |||
| _glapi_Dispatch->MultiTexCoord1fvARB( GL_TEXTURE0+unit, f ); | |||
| break; | |||
| default: | |||
| assert( count == 0 ); | |||
| break; | |||
| } | |||
| } | |||
| static void VFMT_FALLBACK( const char *caller ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| @@ -388,6 +440,8 @@ static void VFMT_FALLBACK( const char *caller ) | |||
| GLuint ind1 = rmesa->vb.vtxfmt_1; | |||
| GLuint nrverts; | |||
| GLfloat alpha = 1.0; | |||
| GLuint count; | |||
| GLuint unit; | |||
| if (R200_DEBUG & (DEBUG_FALLBACKS|DEBUG_VFMT)) | |||
| fprintf(stderr, "%s from %s\n", __FUNCTION__, caller); | |||
| @@ -425,6 +479,7 @@ static void VFMT_FALLBACK( const char *caller ) | |||
| */ | |||
| for (i = 0 ; i < nrverts; i++) { | |||
| GLuint offset = 3; | |||
| if (ind0 & R200_VTX_N0) { | |||
| _glapi_Dispatch->Normal3fv( &tmp[i][offset] ); | |||
| offset += 3; | |||
| @@ -448,14 +503,14 @@ static void VFMT_FALLBACK( const char *caller ) | |||
| offset++; | |||
| } | |||
| if (ind1 & (7 << R200_VTX_TEX0_COMP_CNT_SHIFT)) { | |||
| _glapi_Dispatch->TexCoord2fv( &tmp[i][offset] ); | |||
| offset += 2; | |||
| } | |||
| count = VTX_TEXn_COUNT( ind1, 0 ); | |||
| dispatch_texcoord( count, &tmp[i][offset] ); | |||
| offset += count; | |||
| if (ind1 & (7 << R200_VTX_TEX1_COMP_CNT_SHIFT)) { | |||
| _glapi_Dispatch->MultiTexCoord2fvARB( GL_TEXTURE1, &tmp[i][offset] ); | |||
| offset += 2; | |||
| for ( unit = 1 ; unit < ctx->Const.MaxTextureUnits ; unit++ ) { | |||
| count = VTX_TEXn_COUNT( ind1, unit ); | |||
| dispatch_multitexcoord( count, unit, &tmp[i][offset] ); | |||
| offset += count; | |||
| } | |||
| _glapi_Dispatch->Vertex3fv( &tmp[i][0] ); | |||
| @@ -492,12 +547,12 @@ static void VFMT_FALLBACK( const char *caller ) | |||
| rmesa->vb.specptr->green, | |||
| rmesa->vb.specptr->blue ); | |||
| if (ind1 & (7 << R200_VTX_TEX0_COMP_CNT_SHIFT)) { | |||
| _glapi_Dispatch->TexCoord2fv( rmesa->vb.texcoordptr[0] ); | |||
| } | |||
| count = VTX_TEXn_COUNT( ind1, 0 ); | |||
| dispatch_texcoord( count, rmesa->vb.texcoordptr[0] ); | |||
| if (ind1 & (7 << R200_VTX_TEX1_COMP_CNT_SHIFT)) { | |||
| _glapi_Dispatch->MultiTexCoord2fvARB( GL_TEXTURE1, rmesa->vb.texcoordptr[1] ); | |||
| for ( unit = 1 ; unit < ctx->Const.MaxTextureUnits ; unit++ ) { | |||
| count = VTX_TEXn_COUNT( ind1, unit ); | |||
| dispatch_multitexcoord( count, unit, rmesa->vb.texcoordptr[unit] ); | |||
| } | |||
| } | |||
| @@ -582,12 +637,34 @@ static void wrap_buffer( void ) | |||
| } | |||
| /** | |||
| * Determines the hardware vertex format based on the current state vector. | |||
| * | |||
| * \returns | |||
| * If the hardware TCL unit is capable of handling the current state vector, | |||
| * \c GL_TRUE is returned. Otherwise, \c GL_FALSE is returned. | |||
| * | |||
| * \todo | |||
| * Make this color format selection data driven. If we receive only ubytes, | |||
| * send color as ubytes. Also check if converting (with free checking for | |||
| * overflow) is cheaper than sending floats directly. | |||
| * | |||
| * \todo | |||
| * When intializing texture coordinates, it might be faster to just copy the | |||
| * entire \c VERT_ATTRIB_TEX0 vector into the vertex buffer. It may mean that | |||
| * some of the data (i.e., the last texture coordinate components) get copied | |||
| * over, but that still may be faster than the conditional branching. If | |||
| * nothing else, the code will be smaller and easier to follow. | |||
| */ | |||
| static GLboolean check_vtx_fmt( GLcontext *ctx ) | |||
| { | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLuint ind0 = R200_VTX_Z0; | |||
| GLuint ind1 = 0; | |||
| GLuint i; | |||
| GLuint count[R200_MAX_TEXTURE_UNITS]; | |||
| GLuint re_cntl; | |||
| if (rmesa->TclFallback || rmesa->vb.fell_back || ctx->CompileFlag) | |||
| return GL_FALSE; | |||
| @@ -600,11 +677,6 @@ static GLboolean check_vtx_fmt( GLcontext *ctx ) | |||
| if (ctx->Light.Enabled) { | |||
| ind0 |= R200_VTX_N0; | |||
| /* TODO: make this data driven: If we receive only ubytes, send | |||
| * color as ubytes. Also check if converting (with free | |||
| * checking for overflow) is cheaper than sending floats | |||
| * directly. | |||
| */ | |||
| if (ctx->Light.ColorMaterialEnabled) | |||
| ind0 |= R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT; | |||
| else | |||
| @@ -620,36 +692,46 @@ static GLboolean check_vtx_fmt( GLcontext *ctx ) | |||
| } | |||
| } | |||
| if (ctx->Texture.Unit[0]._ReallyEnabled) { | |||
| if (ctx->Texture.Unit[0].TexGenEnabled) { | |||
| if (rmesa->TexGenNeedNormals[0]) { | |||
| ind0 |= R200_VTX_N0; | |||
| re_cntl = rmesa->hw.set.cmd[SET_RE_CNTL] & ~(R200_VTX_STQ0_D3D | | |||
| R200_VTX_STQ1_D3D | | |||
| R200_VTX_STQ2_D3D | | |||
| R200_VTX_STQ3_D3D | | |||
| R200_VTX_STQ4_D3D | | |||
| R200_VTX_STQ5_D3D ); | |||
| for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { | |||
| count[i] = 0; | |||
| if (ctx->Texture.Unit[i]._ReallyEnabled) { | |||
| if (ctx->Texture.Unit[i].TexGenEnabled) { | |||
| if (rmesa->TexGenNeedNormals[i]) { | |||
| ind0 |= R200_VTX_N0; | |||
| } | |||
| } | |||
| } else { | |||
| if (ctx->Current.Attrib[VERT_ATTRIB_TEX0][2] != 0.0F || | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX0][3] != 1.0) { | |||
| if (R200_DEBUG & (DEBUG_VFMT|DEBUG_FALLBACKS)) | |||
| fprintf(stderr, "%s: rq0\n", __FUNCTION__); | |||
| return GL_FALSE; | |||
| else { | |||
| switch( ctx->Texture.Unit[i]._ReallyEnabled ) { | |||
| case TEXTURE_CUBE_BIT: | |||
| re_cntl |= R200_VTX_STQ0_D3D << (2 * i); | |||
| /* FALLTHROUGH */ | |||
| case TEXTURE_3D_BIT: | |||
| count[i] = 3; | |||
| break; | |||
| case TEXTURE_2D_BIT: | |||
| case TEXTURE_RECT_BIT: | |||
| count[i] = 2; | |||
| break; | |||
| case TEXTURE_1D_BIT: | |||
| count[i] = 1; | |||
| break; | |||
| } | |||
| ind1 |= count[i] << (3 * i); | |||
| } | |||
| ind1 |= 2 << R200_VTX_TEX0_COMP_CNT_SHIFT; | |||
| } | |||
| } | |||
| if (ctx->Texture.Unit[1]._ReallyEnabled) { | |||
| if (ctx->Texture.Unit[1].TexGenEnabled) { | |||
| if (rmesa->TexGenNeedNormals[1]) { | |||
| ind0 |= R200_VTX_N0; | |||
| } | |||
| } else { | |||
| if (ctx->Current.Attrib[VERT_ATTRIB_TEX1][2] != 0.0F || | |||
| ctx->Current.Attrib[VERT_ATTRIB_TEX1][3] != 1.0) { | |||
| if (R200_DEBUG & (DEBUG_VFMT|DEBUG_FALLBACKS)) | |||
| fprintf(stderr, "%s: rq1\n", __FUNCTION__); | |||
| return GL_FALSE; | |||
| } | |||
| ind1 |= 2 << R200_VTX_TEX1_COMP_CNT_SHIFT; | |||
| } | |||
| if ( re_cntl != rmesa->hw.set.cmd[SET_RE_CNTL] ) { | |||
| R200_STATECHANGE( rmesa, set ); | |||
| rmesa->hw.set.cmd[SET_RE_CNTL] = re_cntl; | |||
| } | |||
| if (R200_DEBUG & (DEBUG_VFMT|DEBUG_STATE)) | |||
| @@ -713,19 +795,20 @@ static GLboolean check_vtx_fmt( GLcontext *ctx ) | |||
| } | |||
| if (ind1 & (7 << R200_VTX_TEX0_COMP_CNT_SHIFT)) { | |||
| rmesa->vb.texcoordptr[0] = &rmesa->vb.vertex[rmesa->vb.vertex_size].f; | |||
| rmesa->vb.vertex_size += 2; | |||
| rmesa->vb.texcoordptr[0][0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0][0]; | |||
| rmesa->vb.texcoordptr[0][1] = ctx->Current.Attrib[VERT_ATTRIB_TEX0][1]; | |||
| } | |||
| for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { | |||
| if ( count[i] != 0 ) { | |||
| float * const attr = ctx->Current.Attrib[VERT_ATTRIB_TEX0+i]; | |||
| unsigned j; | |||
| if (ind1 & (7 << R200_VTX_TEX1_COMP_CNT_SHIFT)) { | |||
| rmesa->vb.texcoordptr[1] = &rmesa->vb.vertex[rmesa->vb.vertex_size].f; | |||
| rmesa->vb.vertex_size += 2; | |||
| rmesa->vb.texcoordptr[1][0] = ctx->Current.Attrib[VERT_ATTRIB_TEX1][0]; | |||
| rmesa->vb.texcoordptr[1][1] = ctx->Current.Attrib[VERT_ATTRIB_TEX1][1]; | |||
| } | |||
| rmesa->vb.texcoordptr[i] = &rmesa->vb.vertex[rmesa->vb.vertex_size].f; | |||
| for ( j = 0 ; j < count[i] ; j++ ) { | |||
| rmesa->vb.texcoordptr[i][j] = attr[j]; | |||
| } | |||
| rmesa->vb.vertex_size += count[i]; | |||
| } | |||
| } | |||
| if (rmesa->vb.installed_vertex_format != rmesa->vb.vtxfmt_0) { | |||
| if (R200_DEBUG & DEBUG_VFMT) | |||
| @@ -736,7 +819,10 @@ static GLboolean check_vtx_fmt( GLcontext *ctx ) | |||
| if (R200_DEBUG & DEBUG_VFMT) | |||
| fprintf(stderr, "%s -- success\n", __FUNCTION__); | |||
| fprintf( stderr, "[%s:%u] vertex size = %u\n", __func__, __LINE__, | |||
| rmesa->vb.vertex_size ); | |||
| return GL_TRUE; | |||
| } | |||
| @@ -1026,12 +1112,8 @@ void r200VtxfmtInit( GLcontext *ctx, GLboolean useCodegen ) | |||
| vfmt->EvalMesh2 = r200_fallback_EvalMesh2; | |||
| vfmt->EvalPoint1 = r200_fallback_EvalPoint1; | |||
| vfmt->EvalPoint2 = r200_fallback_EvalPoint2; | |||
| vfmt->TexCoord3f = r200_fallback_TexCoord3f; | |||
| vfmt->TexCoord3fv = r200_fallback_TexCoord3fv; | |||
| vfmt->TexCoord4f = r200_fallback_TexCoord4f; | |||
| vfmt->TexCoord4fv = r200_fallback_TexCoord4fv; | |||
| vfmt->MultiTexCoord3fARB = r200_fallback_MultiTexCoord3fARB; | |||
| vfmt->MultiTexCoord3fvARB = r200_fallback_MultiTexCoord3fvARB; | |||
| vfmt->MultiTexCoord4fARB = r200_fallback_MultiTexCoord4fARB; | |||
| vfmt->MultiTexCoord4fvARB = r200_fallback_MultiTexCoord4fvARB; | |||
| vfmt->Vertex4f = r200_fallback_Vertex4f; | |||
| @@ -1071,10 +1153,14 @@ void r200VtxfmtInit( GLcontext *ctx, GLboolean useCodegen ) | |||
| make_empty_list( &rmesa->vb.dfn_cache.SecondaryColor3ubvEXT ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.Normal3f ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.Normal3fv ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord3f ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord3fv ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord2f ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord2fv ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord1f ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.TexCoord1fv ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord3fARB ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord3fvARB ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord2fARB ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); | |||
| make_empty_list( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); | |||
| @@ -1126,10 +1212,14 @@ void r200VtxfmtDestroy( GLcontext *ctx ) | |||
| free_funcs( &rmesa->vb.dfn_cache.SecondaryColor3fvEXT ); | |||
| free_funcs( &rmesa->vb.dfn_cache.Normal3f ); | |||
| free_funcs( &rmesa->vb.dfn_cache.Normal3fv ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord3f ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord3fv ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord2f ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord2fv ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord1f ); | |||
| free_funcs( &rmesa->vb.dfn_cache.TexCoord1fv ); | |||
| free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord3fARB ); | |||
| free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord3fvARB ); | |||
| free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord2fARB ); | |||
| free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord2fvARB ); | |||
| free_funcs( &rmesa->vb.dfn_cache.MultiTexCoord1fARB ); | |||
| @@ -505,41 +505,30 @@ static void r200_Normal3fv( const GLfloat *v ) | |||
| /* TexCoord | |||
| */ | |||
| static void r200_TexCoord1f( GLfloat s ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[0]; | |||
| dest[0] = s; | |||
| dest[1] = 0; | |||
| } | |||
| static void r200_TexCoord1fv( const GLfloat *v ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[0]; | |||
| dest[0] = v[0]; | |||
| dest[1] = 0; | |||
| } | |||
| static void r200_TexCoord2f( GLfloat s, GLfloat t ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[0]; | |||
| dest[0] = s; | |||
| dest[1] = t; | |||
| } | |||
| #define TEX_to_nF(N, P, S, T, R) \ | |||
| static void r200_TexCoord ## N P \ | |||
| { \ | |||
| GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); \ | |||
| GLfloat * const dest = rmesa->vb.texcoordptr[0]; \ | |||
| switch( ctx->Texture.Unit[0]._ReallyEnabled ) { \ | |||
| case TEXTURE_CUBE_BIT: \ | |||
| case TEXTURE_3D_BIT: \ | |||
| dest[2] = R; \ | |||
| case TEXTURE_2D_BIT: \ | |||
| case TEXTURE_RECT_BIT: \ | |||
| dest[1] = T; \ | |||
| case TEXTURE_1D_BIT: \ | |||
| dest[0] = S; \ | |||
| } \ | |||
| } | |||
| static void r200_TexCoord2fv( const GLfloat *v ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[0]; | |||
| dest[0] = v[0]; | |||
| dest[1] = v[1]; | |||
| } | |||
| TEX_to_nF( 1f, (GLfloat s), s, 0.0, 0.0 ) | |||
| TEX_to_nF( 2f, (GLfloat s, GLfloat t), s, t, 0.0 ) | |||
| TEX_to_nF( 3f, (GLfloat s, GLfloat t, GLfloat r), s, t, r ) | |||
| TEX_to_nF( 1fv, (const GLfloat * v), v[0], 0.0, 0.0 ) | |||
| TEX_to_nF( 2fv, (const GLfloat * v), v[0], v[1], 0.0 ) | |||
| TEX_to_nF( 3fv, (const GLfloat * v), v[0], v[1], v[2] ) | |||
| /* MultiTexcoord | |||
| @@ -552,41 +541,30 @@ static void r200_TexCoord2fv( const GLfloat *v ) | |||
| * the subtraction has been omitted. | |||
| */ | |||
| static void r200_MultiTexCoord1fARB( GLenum target, GLfloat s ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; | |||
| dest[0] = s; | |||
| dest[1] = 0; | |||
| } | |||
| static void r200_MultiTexCoord1fvARB( GLenum target, const GLfloat *v ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; | |||
| dest[0] = v[0]; | |||
| dest[1] = 0; | |||
| } | |||
| #define MTEX_to_nF(N, P, U, S, T, R) \ | |||
| static void r200_MultiTexCoord ## N ## ARB P \ | |||
| { \ | |||
| GET_CURRENT_CONTEXT(ctx); r200ContextPtr rmesa = R200_CONTEXT(ctx); \ | |||
| GLfloat * const dest = rmesa->vb.texcoordptr[U]; \ | |||
| switch( ctx->Texture.Unit[U]._ReallyEnabled ) { \ | |||
| case TEXTURE_CUBE_BIT: \ | |||
| case TEXTURE_3D_BIT: \ | |||
| dest[2] = R; \ | |||
| case TEXTURE_2D_BIT: \ | |||
| case TEXTURE_RECT_BIT: \ | |||
| dest[1] = T; \ | |||
| case TEXTURE_1D_BIT: \ | |||
| dest[0] = S; \ | |||
| } \ | |||
| } | |||
| static void r200_MultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; | |||
| dest[0] = s; | |||
| dest[1] = t; | |||
| } | |||
| MTEX_to_nF( 1f, (GLenum target, GLfloat s), (target & 1), s, 0.0, 0.0 ) | |||
| MTEX_to_nF( 2f, (GLenum target, GLfloat s, GLfloat t), (target & 1), s, t, 0.0 ) | |||
| MTEX_to_nF( 3f, (GLenum target, GLfloat s, GLfloat t, GLfloat r), (target & 1), s, t, r ) | |||
| static void r200_MultiTexCoord2fvARB( GLenum target, const GLfloat *v ) | |||
| { | |||
| GET_CURRENT_CONTEXT(ctx); | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| GLfloat *dest = rmesa->vb.texcoordptr[target & 1]; | |||
| dest[0] = v[0]; | |||
| dest[1] = v[1]; | |||
| } | |||
| MTEX_to_nF( 1fv, (GLenum target, const GLfloat *v), (target & 1), v[0], 0.0, 0.0 ) | |||
| MTEX_to_nF( 2fv, (GLenum target, const GLfloat *v), (target & 1), v[0], v[1], 0.0 ) | |||
| MTEX_to_nF( 3fv, (GLenum target, const GLfloat *v), (target & 1), v[0], v[1], v[2] ) | |||
| static struct dynfn *lookup( struct dynfn *l, const int *key ) | |||
| { | |||
| @@ -732,6 +710,8 @@ static void choose_##FN ARGS1 \ | |||
| /* VTXFMT_0 | |||
| */ | |||
| #define MASK_XYZW (R200_VTX_W0|R200_VTX_Z0) | |||
| @@ -749,6 +729,7 @@ typedef void (*p4f)( GLfloat, GLfloat, GLfloat, GLfloat ); | |||
| typedef void (*p3f)( GLfloat, GLfloat, GLfloat ); | |||
| typedef void (*p2f)( GLfloat, GLfloat ); | |||
| typedef void (*p1f)( GLfloat ); | |||
| typedef void (*pe3f)( GLenum, GLfloat, GLfloat, GLfloat ); | |||
| typedef void (*pe2f)( GLenum, GLfloat, GLfloat ); | |||
| typedef void (*pe1f)( GLenum, GLfloat ); | |||
| typedef void (*p4ub)( GLubyte, GLubyte, GLubyte, GLubyte ); | |||
| @@ -793,6 +774,10 @@ CHOOSE_SECONDARY_COLOR(SecondaryColor3fEXT, p3f, MASK_SPEC, 0, | |||
| CHOOSE_SECONDARY_COLOR(SecondaryColor3fvEXT, pfv, MASK_SPEC, 0, | |||
| (const GLfloat *v), (v)) | |||
| CHOOSE(TexCoord3f, p3f, ~0, MASK_ST0, | |||
| (GLfloat a,GLfloat b,GLfloat c), (a,b,c)) | |||
| CHOOSE(TexCoord3fv, pfv, ~0, MASK_ST0, | |||
| (const GLfloat *v), (v)) | |||
| CHOOSE(TexCoord2f, p2f, ~0, MASK_ST0, | |||
| (GLfloat a,GLfloat b), (a,b)) | |||
| CHOOSE(TexCoord2fv, pfv, ~0, MASK_ST0, | |||
| @@ -802,6 +787,10 @@ CHOOSE(TexCoord1f, p1f, ~0, MASK_ST0, | |||
| CHOOSE(TexCoord1fv, pfv, ~0, MASK_ST0, | |||
| (const GLfloat *v), (v)) | |||
| CHOOSE(MultiTexCoord3fARB, pe3f, ~0, ~0, | |||
| (GLenum u,GLfloat a,GLfloat b,GLfloat c), (u,a,b,c)) | |||
| CHOOSE(MultiTexCoord3fvARB, pefv, ~0, ~0, | |||
| (GLenum u,const GLfloat *v), (u,v)) | |||
| CHOOSE(MultiTexCoord2fARB, pe2f, ~0, ~0, | |||
| (GLenum u,GLfloat a,GLfloat b), (u,a,b)) | |||
| CHOOSE(MultiTexCoord2fvARB, pefv, ~0, ~0, | |||
| @@ -836,12 +825,16 @@ void r200VtxfmtInitChoosers( GLvertexformat *vfmt ) | |||
| vfmt->MultiTexCoord1fvARB = choose_MultiTexCoord1fvARB; | |||
| vfmt->MultiTexCoord2fARB = choose_MultiTexCoord2fARB; | |||
| vfmt->MultiTexCoord2fvARB = choose_MultiTexCoord2fvARB; | |||
| vfmt->MultiTexCoord3fARB = choose_MultiTexCoord3fARB; | |||
| vfmt->MultiTexCoord3fvARB = choose_MultiTexCoord3fvARB; | |||
| vfmt->Normal3f = choose_Normal3f; | |||
| vfmt->Normal3fv = choose_Normal3fv; | |||
| vfmt->TexCoord1f = choose_TexCoord1f; | |||
| vfmt->TexCoord1fv = choose_TexCoord1fv; | |||
| vfmt->TexCoord2f = choose_TexCoord2f; | |||
| vfmt->TexCoord2fv = choose_TexCoord2fv; | |||
| vfmt->TexCoord3f = choose_TexCoord3f; | |||
| vfmt->TexCoord3fv = choose_TexCoord3fv; | |||
| vfmt->Vertex2f = choose_Vertex2f; | |||
| vfmt->Vertex2fv = choose_Vertex2fv; | |||
| vfmt->Vertex3f = choose_Vertex3f; | |||
| @@ -874,10 +867,21 @@ void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) | |||
| gen->Color4ubv = codegen_noop; | |||
| gen->Normal3f = codegen_noop; | |||
| gen->Normal3fv = codegen_noop; | |||
| gen->TexCoord3f = codegen_noop; | |||
| gen->TexCoord3fv = codegen_noop; | |||
| gen->TexCoord2f = codegen_noop; | |||
| gen->TexCoord2fv = codegen_noop; | |||
| gen->TexCoord1f = codegen_noop; | |||
| gen->TexCoord1fv = codegen_noop; | |||
| gen->MultiTexCoord3fARB = codegen_noop; | |||
| gen->MultiTexCoord3fvARB = codegen_noop; | |||
| gen->MultiTexCoord2fARB = codegen_noop; | |||
| gen->MultiTexCoord2fvARB = codegen_noop; | |||
| gen->MultiTexCoord1fARB = codegen_noop; | |||
| gen->MultiTexCoord1fvARB = codegen_noop; | |||
| gen->Vertex2f = codegen_noop; | |||
| gen->Vertex2fv = codegen_noop; | |||
| gen->Color3ub = codegen_noop; | |||
| @@ -890,10 +894,6 @@ void r200InitCodegen( struct dfn_generators *gen, GLboolean useCodegen ) | |||
| gen->SecondaryColor3fvEXT = codegen_noop; | |||
| gen->SecondaryColor3ubEXT = codegen_noop; | |||
| gen->SecondaryColor3ubvEXT = codegen_noop; | |||
| gen->TexCoord1f = codegen_noop; | |||
| gen->TexCoord1fv = codegen_noop; | |||
| gen->MultiTexCoord1fARB = codegen_noop; | |||
| gen->MultiTexCoord1fvARB = codegen_noop; | |||
| if (useCodegen) { | |||
| #if defined(USE_X86_ASM) | |||
| @@ -154,6 +154,7 @@ static struct dynfn *r200_makeSSEColor3f( GLcontext *ctx, const int * key ) | |||
| } | |||
| } | |||
| #if 0 /* Temporarily disabled as it is broken w/the new cubemap code. - idr */ | |||
| static struct dynfn *r200_makeSSETexCoord2fv( GLcontext *ctx, const int * key ) | |||
| { | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| @@ -205,6 +206,7 @@ static struct dynfn *r200_makeSSEMultiTexCoord2f( GLcontext *ctx, const int * ke | |||
| } | |||
| return dfn; | |||
| } | |||
| #endif | |||
| void r200InitSSECodegen( struct dfn_generators *gen ) | |||
| { | |||
| @@ -213,10 +215,12 @@ void r200InitSSECodegen( struct dfn_generators *gen ) | |||
| gen->Normal3f = (void *) r200_makeSSENormal3f; | |||
| gen->Color3fv = (void *) r200_makeSSEColor3fv; | |||
| gen->Color3f = (void *) r200_makeSSEColor3f; | |||
| #if 0 /* Temporarily disabled as it is broken w/the new cubemap code. - idr */ | |||
| gen->TexCoord2fv = (void *) r200_makeSSETexCoord2fv; | |||
| gen->TexCoord2f = (void *) r200_makeSSETexCoord2f; | |||
| gen->MultiTexCoord2fvARB = (void *) r200_makeSSEMultiTexCoord2fv; | |||
| gen->MultiTexCoord2fARB = (void *) r200_makeSSEMultiTexCoord2f; | |||
| #endif | |||
| } | |||
| } | |||
| @@ -337,6 +337,7 @@ struct dynfn *r200_makeX86Color3f( GLcontext *ctx, const int *key ) | |||
| #if 0 /* Temporarily disabled as it is broken w/the new cubemap code. - idr */ | |||
| struct dynfn *r200_makeX86TexCoord2fv( GLcontext *ctx, const int *key ) | |||
| { | |||
| r200ContextPtr rmesa = R200_CONTEXT(ctx); | |||
| @@ -395,7 +396,7 @@ struct dynfn *r200_makeX86MultiTexCoord2fARB( GLcontext *ctx, | |||
| } | |||
| return dfn; | |||
| } | |||
| #endif | |||
| void r200InitX86Codegen( struct dfn_generators *gen ) | |||
| { | |||
| @@ -405,10 +406,12 @@ void r200InitX86Codegen( struct dfn_generators *gen ) | |||
| gen->Color4ubv = r200_makeX86Color4ubv; /* PKCOLOR only */ | |||
| gen->Normal3f = r200_makeX86Normal3f; | |||
| gen->Normal3fv = r200_makeX86Normal3fv; | |||
| #if 0 /* Temporarily disabled as it is broken w/the new cubemap code. - idr */ | |||
| gen->TexCoord2f = r200_makeX86TexCoord2f; | |||
| gen->TexCoord2fv = r200_makeX86TexCoord2fv; | |||
| gen->MultiTexCoord2fARB = r200_makeX86MultiTexCoord2fARB; | |||
| gen->MultiTexCoord2fvARB = r200_makeX86MultiTexCoord2fvARB; | |||
| #endif | |||
| gen->Color3f = r200_makeX86Color3f; | |||
| gen->Color3fv = r200_makeX86Color3fv; | |||