/* Populate a swrast SWvertex from an attrib-style vertex. */ void _swsetup_Translate( GLcontext *ctx, const void *vertex, SWvertex *dest ) { const GLfloat *m = ctx->Viewport._WindowMap.m; GLfloat tmp[4]; GLuint i; _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POS, tmp ); dest->win[0] = m[0] * tmp[0] + m[12]; dest->win[1] = m[5] * tmp[1] + m[13]; dest->win[2] = m[10] * tmp[2] + m[14]; dest->win[3] = tmp[3]; for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_TEX0+i, dest->texcoord[i] ); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR0, tmp ); UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->color, tmp ); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR1, tmp ); UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->specular, tmp ); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_FOG, tmp ); dest->fog = tmp[0]; _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_INDEX, tmp ); dest->index = (GLuint) tmp[0]; _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POINTSIZE, tmp ); dest->pointSize = tmp[0]; }
/* Currently not working - VERT_ATTRIB_POINTSIZE isn't correctly * represented in the fragment program InputsRead field. */ static void intel_atten_point(struct intel_context *intel, intelVertexPtr v0) { GLcontext *ctx = &intel->ctx; GLfloat psz[4], col[4], restore_psz, restore_alpha; _tnl_get_attr(ctx, v0, _TNL_ATTRIB_POINTSIZE, psz); _tnl_get_attr(ctx, v0, _TNL_ATTRIB_COLOR0, col); restore_psz = psz[0]; restore_alpha = col[3]; if (psz[0] >= ctx->Point.Threshold) { psz[0] = MIN2(psz[0], ctx->Point.MaxSize); } else { GLfloat dsize = psz[0] / ctx->Point.Threshold; psz[0] = MAX2(ctx->Point.Threshold, ctx->Point.MinSize); col[3] *= dsize * dsize; } if (psz[0] < 1.0) psz[0] = 1.0; if (restore_psz != psz[0] || restore_alpha != col[3]) { _tnl_set_attr(ctx, v0, _TNL_ATTRIB_POINTSIZE, psz); _tnl_set_attr(ctx, v0, _TNL_ATTRIB_COLOR0, col); intel_draw_point(intel, v0); psz[0] = restore_psz; col[3] = restore_alpha; _tnl_set_attr(ctx, v0, _TNL_ATTRIB_POINTSIZE, psz); _tnl_set_attr(ctx, v0, _TNL_ATTRIB_COLOR0, col); } else intel_draw_point(intel, v0); }
/** * Populate a swrast SWvertex from an attrib-style vertex. */ void _swsetup_Translate( struct gl_context *ctx, const void *vertex, SWvertex *dest ) { const GLfloat *m = ctx->Viewport._WindowMap.m; GLfloat tmp[4]; GLuint i; _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POS, tmp ); dest->attrib[VARYING_SLOT_POS][0] = m[0] * tmp[0] + m[12]; dest->attrib[VARYING_SLOT_POS][1] = m[5] * tmp[1] + m[13]; dest->attrib[VARYING_SLOT_POS][2] = m[10] * tmp[2] + m[14]; dest->attrib[VARYING_SLOT_POS][3] = tmp[3]; /** XXX try to limit these loops someday */ for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_TEX0 + i, dest->attrib[VARYING_SLOT_TEX0 + i] ); for (i = 0 ; i < ctx->Const.MaxVarying ; i++) _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_GENERIC0 + i, dest->attrib[VARYING_SLOT_VAR0 + i] ); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR0, dest->attrib[VARYING_SLOT_COL0] ); UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->color, tmp ); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR1, dest->attrib[VARYING_SLOT_COL1]); _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_FOG, tmp ); dest->attrib[VARYING_SLOT_FOGC][0] = tmp[0]; /* XXX See _tnl_get_attr about pointsize ... */ _tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POINTSIZE, tmp ); dest->pointSize = tmp[0]; }