Esempio n. 1
0
/**
 * 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 );
   }
}
Esempio n. 2
0
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");
      }
   }
}
Esempio n. 3
0
/* 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__ );
}