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; }
void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v ) { LOCALVARS GLuint format = GET_VERTEX_FORMAT(); CARD32 *p = (CARD32 *)v + 10 - mmesa->vertex_size; switch ( format ) { case TEX1_VERTEX_FORMAT: { GLfloat u, v, w; #ifdef MACH64_PREMULT_TEXCOORDS float rhw = 1.0 / LE32_IN_FLOAT( p + 2 ); u = rhw*LE32_IN_FLOAT( p++ ); v = rhw*LE32_IN_FLOAT( p++ ); #else u = LE32_IN_FLOAT( p++ ); v = LE32_IN_FLOAT( p++ ); #endif w = LE32_IN_FLOAT( p++ ); fprintf( stderr, "u1 %f v1 %f w1 %f\n", u, v, w ); } case TEX0_VERTEX_FORMAT: { GLfloat u, v, w; #ifdef MACH64_PREMULT_TEXCOORDS float rhw = 1.0 / LE32_IN_FLOAT( p + 2 ); u = rhw*LE32_IN_FLOAT( p++ ); v = rhw*LE32_IN_FLOAT( p++ ); #else u = LE32_IN_FLOAT( p++ ); v = LE32_IN_FLOAT( p++ ); #endif w = LE32_IN_FLOAT( p++ ); fprintf( stderr, "u0 %f v0 %f w0 %f\n", u, v, w ); } case NOTEX_VERTEX_FORMAT: { GLubyte r, g, b, a; b = ((GLubyte *)p)[0]; g = ((GLubyte *)p)[1]; r = ((GLubyte *)p)[2]; a = ((GLubyte *)p)[3]; p++; fprintf(stderr, "spec: r %d g %d b %d a %d\n", r, g, b, a); } case TINY_VERTEX_FORMAT: { GLuint xy; GLfloat x, y, z; GLubyte r, g, b, a; z = LE32_IN( p++ ) / 65536.0; b = ((GLubyte *)p)[0]; g = ((GLubyte *)p)[1]; r = ((GLubyte *)p)[2]; a = ((GLubyte *)p)[3]; p++; xy = LE32_IN( p ); x = (GLfloat)(GLshort)( xy >> 16 ) / 4.0; y = (GLfloat)(GLshort)( xy & 0xffff ) / 4.0; fprintf(stderr, "x %f y %f z %f\n", x, y, z); fprintf(stderr, "r %d g %d b %d a %d\n", r, g, b, a); } } assert( p + 1 - (CARD32 *)v == 10 ); fprintf(stderr, "\n"); }
void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v ) { LOCALVARS GLuint format = GET_VERTEX_FORMAT(); fprintf(stderr, "(%x) ", format); switch (format) { #if HAVE_TINY_VERTICES case TINY_VERTEX_FORMAT: fprintf(stderr, "xyz %.4f,%.4f,%.4f rgba %x:%x:%x:%x\n", v->v.x, v->v.y, v->v.z, v->tv.color.red, v->tv.color.green, v->tv.color.blue, v->tv.color.alpha); break; #endif #if HAVE_NOTEX_VERTICES case NOTEX_VERTEX_FORMAT: fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x spec %x:%x:%x:%x\n", v->v.x, v->v.y, v->v.z, v->v.w, v->v.color.red, v->v.color.green, v->v.color.blue, v->v.color.alpha, v->v.specular.red, v->v.specular.green, v->v.specular.blue, v->v.specular.alpha); break; #endif #if HAVE_TEX0_VERTICES case TEX0_VERTEX_FORMAT: fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f\n", v->v.x, v->v.y, v->v.z, v->v.w, v->v.color.red, v->v.color.green, v->v.color.blue, v->v.color.alpha, v->v.u0, v->v.v0); break; #endif #if HAVE_TEX1_VERTICES case TEX1_VERTEX_FORMAT: fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f st %.4f,%.4f\n", v->v.x, v->v.y, v->v.z, v->v.w, v->v.color.red, v->v.color.green, v->v.color.blue, v->v.color.alpha, v->v.u0, v->v.v0, v->v.u1, v->v.u2); break; #endif #if HAVE_PTEX_VERTICES case PROJ_TEX1_VERTEX_FORMAT: fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x stq %.4f,%.4f,%.4f stq %.4f,%.4f,%.4f\n", v->v.x, v->v.y, v->v.z, v->v.w, v->v.color.red, v->v.color.green, v->v.color.blue, v->v.color.alpha, v->pv.u0, v->pv.v0, v->pv.q0, v->pv.u1, v->pv.v1, v->pv.q1); break; #endif default: fprintf(stderr, "???\n"); break; } fprintf(stderr, "\n"); }