Example #1
0
void s3vChooseVertexState( GLcontext *ctx )
{
   s3vContextPtr vmesa = S3V_CONTEXT( ctx );
   TNLcontext *tnl = TNL_CONTEXT(ctx);

   GLuint ind = S3V_XYZW_BIT | S3V_RGBA_BIT;

   /* FIXME: will segv in tnl_dd/t_dd_vbtmp.h (line 196) on some demos */
/*
   if (ctx->Fog.Enabled)
      ind |= S3V_FOG_BIT;
*/


   if (ctx->Texture.Unit[0]._ReallyEnabled) {
      _tnl_need_projected_coords( ctx, GL_FALSE );
      ind |= S3V_TEX0_BIT;
   } else {
      _tnl_need_projected_coords( ctx, GL_TRUE );
   }

   vmesa->SetupIndex = ind;

   if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
      tnl->Driver.Render.Interp = s3v_interp_extras;
      tnl->Driver.Render.CopyPV = s3v_copy_pv_extras;
   } else {
      tnl->Driver.Render.Interp = setup_tab[ind].interp;
      tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
   }
}
Example #2
0
/* Return the width and height of the current color buffer.
 */
static void s3vDDGetBufferSize( GLframebuffer *buffer,
				 GLuint *width, GLuint *height )
{
   GET_CURRENT_CONTEXT(ctx);
   s3vContextPtr vmesa = S3V_CONTEXT(ctx);

/* S3VHW_LOCK( vmesa ); */
   *width  = vmesa->driDrawable->w;
   *height = vmesa->driDrawable->h;
/* S3VHW_UNLOCK( vmesa ); */
}
Example #3
0
static GLboolean s3v_run_render( GLcontext *ctx,
				  struct tnl_pipeline_stage *stage )
{
	s3vContextPtr vmesa = S3V_CONTEXT(ctx);
	TNLcontext *tnl = TNL_CONTEXT(ctx);
	struct vertex_buffer *VB = &tnl->vb;
	GLuint i;
	tnl_render_func *tab;

	DEBUG(("s3v_run_render\n"));
	
	/* FIXME: hw clip */
	if (VB->ClipOrMask || vmesa->RenderIndex != 0) {
		DEBUG(("*** CLIPPED in render ***\n"));
#if 1
		return GL_TRUE;	/* don't handle clipping here */
#endif
	}


	/* We don't do elts */
	if (VB->Elts)
		return GL_TRUE;

	tab = TAG(render_tab_verts);

	tnl->Driver.Render.Start( ctx );

	for (i = 0 ; i < VB->PrimitiveCount ; i++ )
	{
		GLuint prim = _tnl_translate_prim(&VB->Primitive[i]);
		GLuint start = VB->Primitive[i].start;
		GLuint length = VB->Primitive[i].count;

		DEBUG(("s3v_run_render (loop=%i) (lenght=%i)\n", i, length));

		if (length) {
			tnl->Driver.Render.BuildVertices( ctx, start,
                                start+length, ~0 /*stage->inputs*/); /* XXX */
			tnl->Driver.Render.PrimTabVerts[prim & PRIM_MODE_MASK]
				( ctx, start, start + length, prim );
			vmesa->SetupNewInputs = VERT_BIT_POS;
		}
	}
	
	tnl->Driver.Render.Finish( ctx );

	return GL_FALSE; /* finished the pipe */
}
Example #4
0
void s3vCheckTexSizes( GLcontext *ctx )
{
   TNLcontext *tnl = TNL_CONTEXT(ctx);
   s3vContextPtr vmesa = S3V_CONTEXT( ctx );

   if (!setup_tab[vmesa->SetupIndex].check_tex_sizes(ctx)) {

      vmesa->SetupIndex |= (S3V_PTEX_BIT|S3V_RGBA_BIT);

      if (1 || !(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
         tnl->Driver.Render.Interp = setup_tab[vmesa->SetupIndex].interp;
         tnl->Driver.Render.CopyPV = setup_tab[vmesa->SetupIndex].copy_pv;
      }
   }
}
Example #5
0
void s3vInitVB( GLcontext *ctx )
{
   s3vContextPtr vmesa = S3V_CONTEXT(ctx);
   GLuint size = TNL_CONTEXT(ctx)->vb.Size;

   vmesa->verts = (char *)ALIGN_MALLOC(size * 4 * 16, 32);

   {
      static int firsttime = 1;
      if (firsttime) {
	 init_setup_tab();
	 firsttime = 0;
	 vmesa->vertex_stride_shift = 6 /* 4 */; /* FIXME - only one vertex setup */
      }
   }
}
Example #6
0
void s3vFreeVB( GLcontext *ctx )
{
   s3vContextPtr vmesa = S3V_CONTEXT(ctx);
   if (vmesa->verts) {
      ALIGN_FREE(vmesa->verts);
      vmesa->verts = 0;
   }

   if (vmesa->UbyteSecondaryColor.Ptr) {
      ALIGN_FREE((void *)vmesa->UbyteSecondaryColor.Ptr);
      vmesa->UbyteSecondaryColor.Ptr = 0;
   }

   if (vmesa->UbyteColor.Ptr) {
      ALIGN_FREE((void *)vmesa->UbyteColor.Ptr);
      vmesa->UbyteColor.Ptr = 0;
   }
}
Example #7
0
static void VERT_FALLBACK( GLcontext *ctx,
			   GLuint start,
			   GLuint count,
			   GLuint flags )
{
	TNLcontext *tnl = TNL_CONTEXT(ctx);
/*	s3vContextPtr vmesa = S3V_CONTEXT(ctx); */
	int _flags;
   
	DEBUG(("VERT_FALLBACK: flags & PRIM_MODE_MASK = %i\n",
		flags & PRIM_MODE_MASK));
	DEBUG(("VERT_FALLBACK: flags=%i PRIM_MODE_MASK=%i\n",
		flags, PRIM_MODE_MASK));
#if 0
	tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
#endif
	tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );

	_flags = flags & PRIM_MODE_MASK;

	tnl->Driver.Render.PrimTabVerts[_flags]( ctx, start, count, flags );
	S3V_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
}
Example #8
0
void s3vBuildVertices( GLcontext *ctx, 
			 GLuint start, 
			 GLuint count,
			 GLuint newinputs )
{
	s3vContextPtr vmesa = S3V_CONTEXT( ctx );
	GLubyte *v = ((GLubyte *)vmesa->verts +
		(start<<vmesa->vertex_stride_shift));
	GLuint stride = 1<<vmesa->vertex_stride_shift;

	DEBUG(("*** s3vBuildVertices ***\n"));
	DEBUG(("vmesa->SetupNewInputs = 0x%x\n", vmesa->SetupNewInputs));
	DEBUG(("vmesa->SetupIndex = 0x%x\n", vmesa->SetupIndex));

#if 1
	setup_tab[vmesa->SetupIndex].emit( ctx, start, count, v, stride );
#else
	newinputs |= vmesa->SetupNewInputs;
	vmesa->SetupNewInputs = 0;

	DEBUG(("newinputs is 0x%x\n", newinputs));

	if (!newinputs) {
		DEBUG(("!newinputs\n"));
		return;
	}

	if (newinputs & VERT_CLIP) {
	setup_tab[vmesa->SetupIndex].emit( ctx, start, count, v, stride );
	DEBUG(("newinputs & VERT_CLIP\n"));
	return;
	} /* else { */
/*      GLuint ind = 0; */

	if (newinputs & VERT_RGBA) {
		DEBUG(("newinputs & VERT_RGBA\n"));
		ind |= S3V_RGBA_BIT;
	}
 
	if (newinputs & VERT_TEX0) {
		DEBUG(("newinputs & VERT_TEX0\n"));
		ind |= S3V_TEX0_BIT;
	}

    if (newinputs & VERT_FOG_COORD)
        ind |= S3V_FOG_BIT;

	if (vmesa->SetupIndex & S3V_PTEX_BIT)
		ind = ~0;

    ind &= vmesa->SetupIndex;

	DEBUG(("vmesa->SetupIndex = 0x%x\n", vmesa->SetupIndex));
	DEBUG(("ind = 0x%x\n", ind));
	DEBUG(("ind & vmesa->SetupIndex = 0x%x\n", (ind & vmesa->SetupIndex)));

	if (ind) {
		setup_tab[ind].emit( ctx, start, count, v, stride );   
	}
#endif
}