gallium: Fix typo in define name.
[mesa.git] / src / mesa / tnl / t_vertex.c
index 7732425dd1634d0108010a28adc0884e339d93c3..b661524c87088913c399bdc29989da3c0c728191 100644 (file)
@@ -25,9 +25,9 @@
  *    Keith Whitwell <keithw@tungstengraphics.com>
  */
 
-#include "glheader.h"
-#include "context.h"
-#include "colormac.h"
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/colormac.h"
 
 #include "t_context.h"
 #include "t_vertex.h"
@@ -46,7 +46,9 @@ static GLboolean match_fastpath( struct tnl_clipspace *vtx,
       return GL_FALSE;
 
    for (j = 0; j < vtx->attr_count; j++) 
-      if (vtx->attr[j].format != fp->attr[j].format) 
+      if (vtx->attr[j].format != fp->attr[j].format ||
+         vtx->attr[j].inputsize != fp->attr[j].size ||
+         vtx->attr[j].vertoffset != fp->attr[j].offset) 
         return GL_FALSE;
       
    if (fp->match_strides) {
@@ -85,11 +87,14 @@ void _tnl_register_fastpath( struct tnl_clipspace *vtx,
    fastpath->attr_count = vtx->attr_count;
    fastpath->match_strides = match_strides;
    fastpath->func = vtx->emit;
-   fastpath->attr = MALLOC(vtx->attr_count * sizeof(fastpath->attr[0]));
+   fastpath->attr = (struct tnl_attr_type *)
+      _mesa_malloc(vtx->attr_count * sizeof(fastpath->attr[0]));
 
    for (i = 0; i < vtx->attr_count; i++) {
       fastpath->attr[i].format = vtx->attr[i].format;
       fastpath->attr[i].stride = vtx->attr[i].inputstride;
+      fastpath->attr[i].size = vtx->attr[i].inputsize;
+      fastpath->attr[i].offset = vtx->attr[i].vertoffset;
    }
 
    fastpath->next = vtx->fastpath;
@@ -224,7 +229,15 @@ void _tnl_get_attr( GLcontext *ctx, const void *vin,
 
    /* Else return the value from ctx->Current.
     */
-   _mesa_memcpy( dest, ctx->Current.Attrib[attr], 4*sizeof(GLfloat));
+   if (attr == _TNL_ATTRIB_POINTSIZE) {
+      /* If the hardware vertex doesn't have point size then use size from
+       * GLcontext.  XXX this will be wrong if drawing attenuated points!
+       */
+      dest[0] = ctx->Point.Size;
+   }
+   else {
+      _mesa_memcpy( dest, ctx->Current.Attrib[attr], 4*sizeof(GLfloat));
+   }
 }
 
 
@@ -288,14 +301,6 @@ GLuint _tnl_install_attrs( GLcontext *ctx, const struct tnl_attr_map *map,
 
    if (vp) {
       vtx->need_viewport = GL_TRUE;
-      vtx->vp_scale[0] = vp[MAT_SX];
-      vtx->vp_scale[1] = vp[MAT_SY];
-      vtx->vp_scale[2] = vp[MAT_SZ];
-      vtx->vp_scale[3] = 1.0;
-      vtx->vp_xlate[0] = vp[MAT_TX];
-      vtx->vp_xlate[1] = vp[MAT_TY];
-      vtx->vp_xlate[2] = vp[MAT_TZ];
-      vtx->vp_xlate[3] = 0.0;
    }
 
    for (j = 0, i = 0; i < nr; i++) {
@@ -389,6 +394,17 @@ static void update_input_ptrs( GLcontext *ctx, GLuint start )
 
       a[j].inputptr = ((GLubyte *)vptr->data) + start * vptr->stride;
    }
+   
+   if (a->vp) {
+      vtx->vp_scale[0] = a->vp[MAT_SX];
+      vtx->vp_scale[1] = a->vp[MAT_SY];
+      vtx->vp_scale[2] = a->vp[MAT_SZ];
+      vtx->vp_scale[3] = 1.0;
+      vtx->vp_xlate[0] = a->vp[MAT_TX];
+      vtx->vp_xlate[1] = a->vp[MAT_TY];
+      vtx->vp_xlate[2] = a->vp[MAT_TZ];
+      vtx->vp_xlate[3] = 0.0;
+   }
 }
 
 
@@ -418,7 +434,7 @@ void *_tnl_emit_vertices_to_buffer( GLcontext *ctx,
 
    /* Note: dest should not be adjusted for non-zero 'start' values:
     */
-   vtx->emit( ctx, end - start, dest );        
+   vtx->emit( ctx, end - start, (GLubyte*) dest );     
    return (void *)((GLubyte *)dest + vtx->vertex_size * (end - start));
 }
 
@@ -467,8 +483,8 @@ void _tnl_init_vertices( GLcontext *ctx,
 
    vtx->codegen_emit = NULL;
 
-#ifdef __i386__
-   if (getenv("MESA_EXPERIMENTAL"))
+#ifdef USE_SSE_ASM
+   if (!_mesa_getenv("MESA_NO_CODEGEN"))
       vtx->codegen_emit = _tnl_generate_sse_emit;
 #endif
 }
@@ -487,7 +503,14 @@ void _tnl_free_vertices( GLcontext *ctx )
    for (fp = vtx->fastpath ; fp ; fp = tmp) {
       tmp = fp->next;
       FREE(fp->attr);
-      FREE((void *)fp->func);
+
+      /* KW: At the moment, fp->func is constrained to be allocated by
+       * _mesa_exec_alloc(), as the hardwired fastpaths in
+       * t_vertex_generic.c are handled specially.  It would be nice
+       * to unify them, but this probably won't change until this
+       * module gets another overhaul.
+       */
+      _mesa_exec_free((void *) fp->func);
       FREE(fp);
    }