pull-in changes from DRI/Mesa-4.0.4
[mesa.git] / src / mesa / drivers / common / t_dd_vb.c
index 17dcac3b02e0a448b45213a6bc2b0cf2e3d4b6e2..3ba8fb3d8be8877f19539400adf25084cd1d111e 100644 (file)
@@ -1,4 +1,3 @@
-/* $Id: t_dd_vb.c,v 1.7 2001/03/17 17:31:42 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -26,6 +25,7 @@
  * Authors:
  *    Keith Whitwell <keithw@valinux.com>
  */
+#include "math/m_translate.h"
 
 #if (HAVE_HW_VIEWPORT)
 #define UNVIEWPORT_VARS
 #define LOCALVARS
 #endif
 
+#ifndef CHECK_HW_DIVIDE
+#define CHECK_HW_DIVIDE 1
+#endif
+
 /* These don't need to be duplicated, but there's currently nowhere
  * really convenient to put them.  Need to build some actual .o files in
  * this directory?
@@ -102,10 +106,9 @@ void TAG(translate_vertex)(GLcontext *ctx,
       dst->color[3] = src->tv.color.alpha;
    }
    else {
-      GLfloat oow = (HAVE_HW_DIVIDE) ? 1.0 / src->v.w : src->v.w;
-
       if (HAVE_HW_VIEWPORT) {
-        if (HAVE_HW_DIVIDE) {
+        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];
@@ -114,13 +117,13 @@ void TAG(translate_vertex)(GLcontext *ctx,
            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] = oow;
+           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] = oow;
+        dst->win[3] = src->v.w;
       }
 
       dst->color[0] = src->v.color.red;
@@ -132,7 +135,7 @@ void TAG(translate_vertex)(GLcontext *ctx,
       dst->specular[1] = src->v.specular.green;
       dst->specular[2] = src->v.specular.blue;
 
-      dst->fog = src->v.color.alpha/255.0;
+      dst->fog = src->v.specular.alpha/255.0;
 
       if (HAVE_PTEX_VERTICES &&
          ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) ||
@@ -191,26 +194,199 @@ void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v )
    LOCALVARS
    GLuint format = GET_VERTEX_FORMAT();
 
-   if (format == TINY_VERTEX_FORMAT) {
-      fprintf(stderr, "x %f y %f z %f\n", v->v.x, v->v.y, v->v.z);
-      fprintf(stderr, "r %d g %d b %d a %d\n",
+   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);
-   }
-   else {
-      fprintf(stderr, "x %f y %f z %f oow %f\n",
-             v->v.x, v->v.y, v->v.z, v->v.w);
-      fprintf(stderr, "r %d g %d b %d a %d\n",
+      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.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");
 }
 
+static void do_import( struct vertex_buffer *VB,
+                      struct gl_client_array *to,
+                      struct gl_client_array *from )
+{
+   GLuint count = VB->Count;
+
+   if (!to->Ptr) {
+      to->Ptr = ALIGN_MALLOC( VB->Size * 4 * sizeof(GLubyte), 32 );
+      to->Type = GL_UNSIGNED_BYTE;
+   }
+
+   /* No need to transform the same value 3000 times.
+    */
+   if (!from->StrideB) {
+      to->StrideB = 0;
+      count = 1;
+   }
+   else
+      to->StrideB = 4 * sizeof(GLubyte);
+   
+   _math_trans_4ub( (GLubyte (*)[4]) to->Ptr,
+                   from->Ptr,
+                   from->StrideB,
+                   from->Type,
+                   from->Size,
+                   0,
+                   count);
+}
+
+#ifndef IMPORT_QUALIFIER
+#define IMPORT_QUALIFIER static
+#endif
+
+IMPORT_QUALIFIER void TAG(import_float_colors)( GLcontext *ctx )
+{
+   LOCALVARS
+   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
+   struct gl_client_array *to = GET_UBYTE_COLOR_STORE();
+   do_import( VB, to, VB->ColorPtr[0] );
+   VB->ColorPtr[0] = to;
+}
+
+IMPORT_QUALIFIER void TAG(import_float_spec_colors)( GLcontext *ctx )
+{
+   LOCALVARS
+   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
+   struct gl_client_array *to = GET_UBYTE_SPEC_COLOR_STORE();
+   do_import( VB, to, VB->SecondaryColorPtr[0] );
+   VB->SecondaryColorPtr[0] = to;
+}
+
+/* Interpolate the elements of the VB not included in typical hardware
+ * vertices.  
+ *
+ * NOTE: All these arrays are guarenteed by tnl to be writeable and
+ * have good stride.
+ */
+#ifndef INTERP_QUALIFIER 
+#define INTERP_QUALIFIER static
+#endif
+
+#define GET_COLOR(ptr, idx) (((GLchan (*)[4])((ptr)->Ptr))[idx])
+
+
+INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx,
+                                         GLfloat t,
+                                         GLuint dst, GLuint out, GLuint in,
+                                         GLboolean force_boundary )
+{
+   LOCALVARS
+   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
+
+   if (VB->ColorPtr[1]) {
+      INTERP_4CHAN( t,
+                   GET_COLOR(VB->ColorPtr[1], dst),
+                   GET_COLOR(VB->ColorPtr[1], out),
+                   GET_COLOR(VB->ColorPtr[1], in) );
+
+      if (VB->SecondaryColorPtr[1]) {
+        INTERP_3CHAN( t,
+                      GET_COLOR(VB->SecondaryColorPtr[1], dst),
+                      GET_COLOR(VB->SecondaryColorPtr[1], out),
+                      GET_COLOR(VB->SecondaryColorPtr[1], in) );
+      }
+   }
+
+   if (VB->EdgeFlag) {
+      VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary;
+   }
+
+   INTERP_VERTEX(ctx, t, dst, out, in, force_boundary);
+}
+
+INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx, 
+                                          GLuint dst, GLuint src )
+{
+   LOCALVARS
+      struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
+
+   if (VB->ColorPtr[1]) {
+      COPY_CHAN4( GET_COLOR(VB->ColorPtr[1], dst), 
+                 GET_COLOR(VB->ColorPtr[1], src) );
+
+      if (VB->SecondaryColorPtr[1]) {
+        COPY_CHAN4( GET_COLOR(VB->SecondaryColorPtr[1], dst), 
+                    GET_COLOR(VB->SecondaryColorPtr[1], src) );
+      }
+   }
+
+   COPY_PV_VERTEX(ctx, dst, src);
+}
+
+
+#undef INTERP_QUALIFIER
+#undef IMPORT_QUALIFIER
+#undef GET_COLOR
 
+#undef IND
 #undef TAG