/** * Copy the last specified normal, color, texcoord, edge flag, etc * from the immediate struct into the ctx->Current attribute group. */ void _tnl_copy_to_current( GLcontext *ctx, struct immediate *IM, GLuint flag, GLuint count ) { if (MESA_VERBOSE&VERBOSE_IMMEDIATE) _tnl_print_vert_flags("copy to current", flag); /* XXX should be able to replace these conditions with a loop over * the 16 vertex attributes. */ if (flag & VERT_BIT_NORMAL) COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], IM->Attrib[VERT_ATTRIB_NORMAL][count]); if (flag & VERT_BIT_COLOR0) { COPY_4FV(ctx->Current.Attrib[VERT_ATTRIB_COLOR0], IM->Attrib[VERT_ATTRIB_COLOR0][count]); if (ctx->Light.ColorMaterialEnabled) { _mesa_update_color_material( ctx, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); } } if (flag & VERT_BIT_COLOR1) COPY_4FV(ctx->Current.Attrib[VERT_ATTRIB_COLOR1], IM->Attrib[VERT_ATTRIB_COLOR1][count]); if (flag & VERT_BIT_FOG) ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = IM->Attrib[VERT_ATTRIB_FOG][count][0]; if (flag & VERT_BIT_SIX) COPY_4FV(ctx->Current.Attrib[VERT_ATTRIB_SIX], IM->Attrib[VERT_ATTRIB_SIX][count]); if (flag & VERT_BIT_SEVEN) COPY_4FV(ctx->Current.Attrib[VERT_ATTRIB_SEVEN], IM->Attrib[VERT_ATTRIB_SEVEN][count]); if (flag & VERT_BITS_TEX_ANY) { GLuint i; for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) { if (flag & VERT_BIT_TEX(i)) { COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0 + i], IM->Attrib[VERT_ATTRIB_TEX0 + i][count]); } } } if (flag & VERT_BIT_INDEX) ctx->Current.Index = IM->Index[count]; if (flag & VERT_BIT_EDGEFLAG) ctx->Current.EdgeFlag = IM->EdgeFlag[count]; if (flag & VERT_BIT_MATERIAL) { _mesa_update_material( ctx, IM->Material[IM->LastMaterial], IM->MaterialOrMask ); TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); } }
void _tnl_print_cassette( struct immediate *IM ) { GLuint i; GLuint *flags = IM->Flag; GLuint andflag = IM->CopyAndFlag; GLuint orflag = (IM->CopyOrFlag|IM->Evaluated); GLuint state = IM->BeginState; GLuint req = ~0; fprintf(stderr, "Cassette id %d, %u rows.\n", IM->id, IM->Count - IM->CopyStart); _tnl_print_vert_flags("Contains at least one", orflag); if (IM->Count != IM->CopyStart) { _tnl_print_vert_flags("Contains a full complement of", andflag); fprintf(stderr, "Final begin/end state %s/%s, errors %s/%s\n", (state & VERT_BEGIN_0) ? "in" : "out", (state & VERT_BEGIN_1) ? "in" : "out", (state & VERT_ERROR_0) ? "y" : "n", (state & VERT_ERROR_1) ? "y" : "n"); } if ((MESA_VERBOSE & VERBOSE_IMMEDIATE) && (MESA_VERBOSE & VERBOSE_VERTS)) { for (i = IM->CopyStart ; i <= IM->Count ; i++) { fprintf(stderr, "%u: ", i); if (req & VERT_OBJ_234) { if (flags[i] & VERT_EVAL_C1) fprintf(stderr, "EvalCoord %f ", IM->Obj[i][0]); else if (flags[i] & VERT_EVAL_P1) fprintf(stderr, "EvalPoint %.0f ", IM->Obj[i][0]); else if (flags[i] & VERT_EVAL_C2) fprintf(stderr, "EvalCoord %f %f ", IM->Obj[i][0], IM->Obj[i][1]); else if (flags[i] & VERT_EVAL_P2) fprintf(stderr, "EvalPoint %.0f %.0f ", IM->Obj[i][0], IM->Obj[i][1]); else if (i < IM->Count && (flags[i]&VERT_OBJ_234)) { fprintf(stderr, "Obj %f %f %f %f", IM->Obj[i][0], IM->Obj[i][1], IM->Obj[i][2], IM->Obj[i][3]); } } if (req & flags[i] & VERT_ELT) fprintf(stderr, " Elt %u\t", IM->Elt[i]); if (req & flags[i] & VERT_NORM) fprintf(stderr, " Norm %f %f %f ", IM->Normal[i][0], IM->Normal[i][1], IM->Normal[i][2]); if (req & flags[i] & VERT_TEX_ANY) { GLuint j; for (j = 0 ; j < MAX_TEXTURE_UNITS ; j++) { if (req & flags[i] & VERT_TEX(j)) { fprintf(stderr, "TC%d %f %f %f %f", j, IM->TexCoord[j][i][0], IM->TexCoord[j][i][1], IM->TexCoord[j][i][2], IM->TexCoord[j][i][2]); } } } if (req & flags[i] & VERT_RGBA) fprintf(stderr, " Rgba %f %f %f %f ", IM->Color[i][0], IM->Color[i][1], IM->Color[i][2], IM->Color[i][3]); if (req & flags[i] & VERT_SPEC_RGB) fprintf(stderr, " Spec %f %f %f ", IM->SecondaryColor[i][0], IM->SecondaryColor[i][1], IM->SecondaryColor[i][2]); if (req & flags[i] & VERT_FOG_COORD) fprintf(stderr, " Fog %f ", IM->FogCoord[i]); if (req & flags[i] & VERT_INDEX) fprintf(stderr, " Index %u ", IM->Index[i]); if (req & flags[i] & VERT_EDGE) fprintf(stderr, " Edgeflag %d ", IM->EdgeFlag[i]); if (req & flags[i] & VERT_MATERIAL) fprintf(stderr, " Material "); /* The order of these two is not easily knowable, but this is * the usually correct way to look at them. */ if (req & flags[i] & VERT_END) fprintf(stderr, " END "); if (req & flags[i] & VERT_BEGIN) fprintf(stderr, " BEGIN(%s) (%s%s%s%s)", _mesa_prim_name[IM->Primitive[i] & PRIM_MODE_MASK], (IM->Primitive[i] & PRIM_LAST) ? "LAST," : "", (IM->Primitive[i] & PRIM_BEGIN) ? "BEGIN," : "", (IM->Primitive[i] & PRIM_END) ? "END," : "", (IM->Primitive[i] & PRIM_PARITY) ? "PARITY," : ""); fprintf(stderr, "\n"); } } }
/* Emit any changed arrays to new agp memory, re-emit a packet to * update the arrays. */ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) { radeonContextPtr rmesa = RADEON_CONTEXT( ctx ); struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; struct radeon_dma_region **component = rmesa->tcl.aos_components; GLuint nr = 0; GLuint vfmt = 0; GLuint count = VB->Count; GLuint vtx; if (RADEON_DEBUG & DEBUG_VERTS) _tnl_print_vert_flags( __FUNCTION__, inputs ); if (1) { if (!rmesa->tcl.obj.buf) emit_vector( ctx, &rmesa->tcl.obj, (char *)VB->ObjPtr->data, VB->ObjPtr->size, VB->ObjPtr->stride, count); switch( VB->ObjPtr->size ) { case 4: vfmt |= RADEON_CP_VC_FRMT_W0; case 3: vfmt |= RADEON_CP_VC_FRMT_Z; case 2: vfmt |= RADEON_CP_VC_FRMT_XY; default: } component[nr++] = &rmesa->tcl.obj; } if (inputs & VERT_NORM) { if (!rmesa->tcl.norm.buf) emit_vector( ctx, &(rmesa->tcl.norm), (char *)VB->NormalPtr->data, 3, VB->NormalPtr->stride, count); vfmt |= RADEON_CP_VC_FRMT_N0; component[nr++] = &rmesa->tcl.norm; } if (inputs & VERT_RGBA) { if (VB->ColorPtr[0]->Type == GL_UNSIGNED_BYTE) { if (!rmesa->tcl.rgba.buf) emit_ubyte_rgba( ctx, &rmesa->tcl.rgba, (char *)VB->ColorPtr[0]->Ptr, VB->ColorPtr[0]->Size, VB->ColorPtr[0]->StrideB, count); vfmt |= RADEON_CP_VC_FRMT_PKCOLOR; } else { int emitsize; if (VB->ColorPtr[0]->Size == 4 && (VB->ColorPtr[0]->StrideB != 0 || ((GLfloat *)VB->ColorPtr[0]->Ptr)[3] != 1.0)) { vfmt |= RADEON_CP_VC_FRMT_FPCOLOR | RADEON_CP_VC_FRMT_FPALPHA; emitsize = 4; } else { vfmt |= RADEON_CP_VC_FRMT_FPCOLOR; emitsize = 3; } if (!rmesa->tcl.rgba.buf) emit_vector( ctx, &(rmesa->tcl.rgba), (char *)VB->ColorPtr[0]->Ptr, emitsize, VB->ColorPtr[0]->StrideB, count); } component[nr++] = &rmesa->tcl.rgba; } if (inputs & VERT_SPEC_RGB) { if (!rmesa->tcl.spec.buf) { if (VB->SecondaryColorPtr[0]->Type != GL_UNSIGNED_BYTE) radeon_import_float_spec_colors( ctx ); emit_ubyte_rgba( ctx, &rmesa->tcl.spec, (char *)VB->SecondaryColorPtr[0]->Ptr, 3, VB->SecondaryColorPtr[0]->StrideB, count); } vfmt |= RADEON_CP_VC_FRMT_PKSPEC; component[nr++] = &rmesa->tcl.spec; } vtx = (rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] & ~(RADEON_TCL_VTX_Q0|RADEON_TCL_VTX_Q1)); if (inputs & VERT_TEX0) { if (!rmesa->tcl.tex[0].buf) emit_tex_vector( ctx, &(rmesa->tcl.tex[0]), (char *)VB->TexCoordPtr[0]->data, VB->TexCoordPtr[0]->size, VB->TexCoordPtr[0]->stride, count ); switch( VB->TexCoordPtr[0]->size ) { case 4: vtx |= RADEON_TCL_VTX_Q0; vfmt |= RADEON_CP_VC_FRMT_Q0; default: vfmt |= RADEON_CP_VC_FRMT_ST0; } component[nr++] = &rmesa->tcl.tex[0]; } if (inputs & VERT_TEX1) { if (!rmesa->tcl.tex[1].buf) emit_tex_vector( ctx, &(rmesa->tcl.tex[1]), (char *)VB->TexCoordPtr[1]->data, VB->TexCoordPtr[1]->size, VB->TexCoordPtr[1]->stride, count ); switch( VB->TexCoordPtr[1]->size ) { case 4: vtx |= RADEON_TCL_VTX_Q1; vfmt |= RADEON_CP_VC_FRMT_Q1; default: vfmt |= RADEON_CP_VC_FRMT_ST1; } component[nr++] = &rmesa->tcl.tex[1]; } if (vtx != rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT]) { RADEON_STATECHANGE( rmesa, tcl ); rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] = vtx; } rmesa->tcl.nr_aos_components = nr; rmesa->tcl.vertex_format = vfmt; } void radeonReleaseArrays( GLcontext *ctx, GLuint newinputs ) { radeonContextPtr rmesa = RADEON_CONTEXT( ctx ); if (RADEON_DEBUG & DEBUG_VERTS) _tnl_print_vert_flags( __FUNCTION__, newinputs ); if (newinputs & VERT_OBJ) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.obj, __FUNCTION__ ); if (newinputs & VERT_NORM) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.norm, __FUNCTION__ ); if (newinputs & VERT_RGBA) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.rgba, __FUNCTION__ ); if (newinputs & VERT_SPEC_RGB) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.spec, __FUNCTION__ ); if (newinputs & VERT_TEX0) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.tex[0], __FUNCTION__ ); if (newinputs & VERT_TEX1) radeonReleaseDmaRegion( rmesa, &rmesa->tcl.tex[1], __FUNCTION__ ); }