void TAG(translate_vertex)(GLcontext *ctx, const VERTEX *src, SWvertex *dst) { LOCALVARS GLuint format = GET_VERTEX_FORMAT(); UNVIEWPORT_VARS; CARD32 *p = (CARD32 *)src + 10 - mmesa->vertex_size; dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0; switch ( format ) { case TEX1_VERTEX_FORMAT: #ifdef MACH64_PREMULT_TEXCOORDS { float rhw = 1.0 / LE32_IN_FLOAT( p + 2 ); dst->attrib[FRAG_ATTRIB_TEX1][0] = rhw*LE32_IN_FLOAT( p++ ); dst->attrib[FRAG_ATTRIB_TEX1][1] = rhw*LE32_IN_FLOAT( p++ ); } #else dst->attrib[FRAG_ATTRIB_TEX1][0] = LE32_IN_FLOAT( p++ ); dst->attrib[FRAG_ATTRIB_TEX1][1] = LE32_IN_FLOAT( p++ ); #endif dst->attrib[FRAG_ATTRIB_TEX1][3] = 1.0; p++; case TEX0_VERTEX_FORMAT: #ifdef MACH64_PREMULT_TEXCOORDS { float rhw = 1.0 / LE32_IN_FLOAT( p + 2 ); dst->attrib[FRAG_ATTRIB_TEX0][0] = rhw*LE32_IN_FLOAT( p++ ); dst->attrib[FRAG_ATTRIB_TEX0][1] = rhw*LE32_IN_FLOAT( p++ ); } #else dst->attrib[FRAG_ATTRIB_TEX0][0] = LE32_IN_FLOAT( p++ ); dst->attrib[FRAG_ATTRIB_TEX0][1] = LE32_IN_FLOAT( p++ ); #endif dst->attrib[FRAG_ATTRIB_TEX0][3] = 1.0; dst->attrib[FRAG_ATTRIB_WPOS][3] = LE32_IN_FLOAT( p++ ); case NOTEX_VERTEX_FORMAT: dst->attrib[FRAG_ATTRIB_COL1][2] = UBYTE_TO_FLOAT(((GLubyte *)p)[0]); dst->attrib[FRAG_ATTRIB_COL1][1] = UBYTE_TO_FLOAT(((GLubyte *)p)[1]); dst->attrib[FRAG_ATTRIB_COL1][0] = UBYTE_TO_FLOAT(((GLubyte *)p)[2]); dst->attrib[FRAG_ATTRIB_FOGC][0] = ((GLubyte *)p)[3]; /*XXX int->float?*/ p++; case TINY_VERTEX_FORMAT: dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( LE32_IN( p++ ) ); dst->color[2] = ((GLubyte *)p)[0]; dst->color[1] = ((GLubyte *)p)[1]; dst->color[0] = ((GLubyte *)p)[2]; dst->color[3] = ((GLubyte *)p)[3]; p++; { GLuint xy = LE32_IN( p ); dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( (GLfloat)(GLshort)( xy >> 16 ) ); dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( (GLfloat)(GLshort)( xy & 0xffff ) ); } } assert( p + 1 - (CARD32 *)src == 10 ); dst->pointSize = ctx->Point.Size; }
void TAG(translate_vertex)(GLcontext *ctx, const VERTEX *src, SWvertex *dst) { LOCALVARS GLuint format = GET_VERTEX_FORMAT(); GLfloat *s = ctx->Viewport._WindowMap.m; UNVIEWPORT_VARS; if (format == TINY_VERTEX_FORMAT) { if (HAVE_HW_VIEWPORT) { dst->win[0] = s[0] * src->v.x + s[12]; dst->win[1] = s[5] * src->v.y + s[13]; dst->win[2] = s[10] * src->v.z + s[14]; dst->win[3] = 1.0; } else { dst->win[0] = UNVIEWPORT_X( src->v.x ); dst->win[1] = UNVIEWPORT_Y( src->v.y ); dst->win[2] = UNVIEWPORT_Z( src->v.z ); dst->win[3] = 1.0; } dst->color[0] = src->tv.color.red; dst->color[1] = src->tv.color.green; dst->color[2] = src->tv.color.blue; dst->color[3] = src->tv.color.alpha; } else { if (HAVE_HW_VIEWPORT) { if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) { GLfloat oow = 1.0 / src->v.w; dst->win[0] = s[0] * src->v.x * oow + s[12]; dst->win[1] = s[5] * src->v.y * oow + s[13]; dst->win[2] = s[10] * src->v.z * oow + s[14]; dst->win[3] = oow; } else { dst->win[0] = s[0] * src->v.x + s[12]; dst->win[1] = s[5] * src->v.y + s[13]; dst->win[2] = s[10] * src->v.z + s[14]; dst->win[3] = src->v.w; } } else { dst->win[0] = UNVIEWPORT_X( src->v.x ); dst->win[1] = UNVIEWPORT_Y( src->v.y ); dst->win[2] = UNVIEWPORT_Z( src->v.z ); dst->win[3] = src->v.w; } dst->color[0] = src->v.color.red; dst->color[1] = src->v.color.green; dst->color[2] = src->v.color.blue; dst->color[3] = src->v.color.alpha; dst->specular[0] = src->v.specular.red; dst->specular[1] = src->v.specular.green; dst->specular[2] = src->v.specular.blue; dst->fog = src->v.specular.alpha/255.0; if (HAVE_PTEX_VERTICES && ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) || (format == PROJ_TEX1_VERTEX_FORMAT))) { dst->texcoord[0][0] = src->pv.u0; dst->texcoord[0][1] = src->pv.v0; dst->texcoord[0][3] = src->pv.q0; dst->texcoord[1][0] = src->pv.u1; dst->texcoord[1][1] = src->pv.v1; dst->texcoord[1][3] = src->pv.q1; if (HAVE_TEX2_VERTICES) { dst->texcoord[2][0] = src->pv.u2; dst->texcoord[2][1] = src->pv.v2; dst->texcoord[2][3] = src->pv.q2; } if (HAVE_TEX3_VERTICES) { dst->texcoord[3][0] = src->pv.u3; dst->texcoord[3][1] = src->pv.v3; dst->texcoord[3][3] = src->pv.q3; } } else { dst->texcoord[0][0] = src->v.u0; dst->texcoord[0][1] = src->v.v0; dst->texcoord[0][3] = 1.0; dst->texcoord[1][0] = src->v.u1; dst->texcoord[1][1] = src->v.v1; dst->texcoord[1][3] = 1.0; if (HAVE_TEX2_VERTICES) { dst->texcoord[2][0] = src->v.u2; dst->texcoord[2][1] = src->v.v2; dst->texcoord[2][3] = 1.0; } if (HAVE_TEX3_VERTICES) { dst->texcoord[3][0] = src->v.u3; dst->texcoord[3][1] = src->v.v3; dst->texcoord[3][3] = 1.0; } } } dst->pointSize = ctx->Point._Size; }