vertex program attribute array work
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 21 Apr 2002 18:49:18 +0000 (18:49 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 21 Apr 2002 18:49:18 +0000 (18:49 +0000)
src/mesa/array_cache/ac_context.h
src/mesa/array_cache/ac_import.c
src/mesa/array_cache/acache.h
src/mesa/main/dd.h
src/mesa/main/enable.c
src/mesa/main/mtypes.h
src/mesa/main/varray.c

index 18a639b3f83af8a56f0323b99f9f0aeb65147426..55257983f6e48fa31d8eac3a3db1a7deea4f943d 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: ac_context.h,v 1.3 2001/03/12 00:48:41 gareth Exp $ */
+/* $Id: ac_context.h,v 1.4 2002/04/21 18:49:19 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -47,6 +47,7 @@ struct ac_arrays {
    struct gl_client_array Index;
    struct gl_client_array TexCoord[MAX_TEXTURE_UNITS];
    struct gl_client_array EdgeFlag;
+   struct gl_client_array Attrib[VERT_ATTRIB_MAX];  /* GL_NV_vertex_program */
 };
 
 struct ac_array_pointers {
@@ -58,6 +59,7 @@ struct ac_array_pointers {
    struct gl_client_array *Index;
    struct gl_client_array *TexCoord[MAX_TEXTURE_UNITS];
    struct gl_client_array *EdgeFlag;
+   struct gl_client_array *Attrib[VERT_ATTRIB_MAX];  /* GL_NV_vertex_program */
 };
 
 struct ac_array_flags {
@@ -69,6 +71,7 @@ struct ac_array_flags {
    GLboolean Index;
    GLboolean TexCoord[MAX_TEXTURE_UNITS];
    GLboolean EdgeFlag;
+   GLboolean Attrib[VERT_ATTRIB_MAX];  /* GL_NV_vertex_program */
 };
 
 
index 2fc13dc2d7765cce7c14c2f773b7b70da91fdbd6..9867f9f51bfa660c16cf6194938005e71403b952 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ac_import.c,v 1.16 2002/01/05 20:51:12 brianp Exp $ */
+/* $Id: ac_import.c,v 1.17 2002/04/21 18:49:19 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -147,6 +147,7 @@ static void reset_index( GLcontext *ctx )
    ac->NewArrayState &= ~_NEW_ARRAY_INDEX;
 }
 
+
 static void reset_fogcoord( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
@@ -162,6 +163,7 @@ static void reset_fogcoord( GLcontext *ctx )
    ac->NewArrayState &= ~_NEW_ARRAY_FOGCOORD;
 }
 
+
 static void reset_edgeflag( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
@@ -178,7 +180,33 @@ static void reset_edgeflag( GLcontext *ctx )
 }
 
 
+static void reset_attrib( GLcontext *ctx, GLuint index )
+{
+   ACcontext *ac = AC_CONTEXT(ctx);
+
+   if (ctx->Array._Enabled & _NEW_ARRAY_ATTRIB(index)) {
+      ac->Raw.Attrib[index] = ctx->Array.VertexAttrib[index];
+      STRIDE_ARRAY(ac->Raw.Attrib[index], ac->start);
+   }
+   else {
+      ac->Raw.Attrib[index] = ac->Fallback.Attrib[index];
+
+      if (ctx->Current.Attrib[index][3] != 1.0)
+        ac->Raw.Attrib[index].Size = 4;
+      else if (ctx->Current.Attrib[index][2] != 0.0)
+        ac->Raw.Attrib[index].Size = 3;
+      else
+        ac->Raw.Attrib[index].Size = 2;
+   }
+
+   ac->IsCached.Attrib[index] = GL_FALSE;
+   ac->NewArrayState &= ~_NEW_ARRAY_ATTRIB(index);
+}
 
+
+/*
+ * Generic import function for color data
+ */
 static void import( GLcontext *ctx,
                    GLenum type,
                    struct gl_client_array *to,
@@ -237,8 +265,12 @@ static void import( GLcontext *ctx,
 
 
 
-/* Functions to import array ranges with specified types and strides.
+/*
+ * Functions to import array ranges with specified types and strides.
+ * For example, if the vertex data is GLshort[2] and we want GLfloat[3]
+ * we'll use an import function to do the data conversion.
  */
+
 static void import_texcoord( GLcontext *ctx, GLuint unit,
                             GLenum type, GLuint stride )
 {
@@ -246,6 +278,8 @@ static void import_texcoord( GLcontext *ctx, GLuint unit,
    struct gl_client_array *from = &ac->Raw.TexCoord[unit];
    struct gl_client_array *to = &ac->Cache.TexCoord[unit];
 
+   ASSERT(unit < ctx->Const.MaxTextureUnits);
+
    /* Limited choices at this stage:
     */
    ASSERT(type == GL_FLOAT);
@@ -316,9 +350,6 @@ static void import_normal( GLcontext *ctx,
    ac->IsCached.Normal = GL_TRUE;
 }
 
-                   
-
-
 static void import_color( GLcontext *ctx,
                          GLenum type, GLuint stride )
 {
@@ -415,10 +446,42 @@ static void import_edgeflag( GLcontext *ctx,
    ac->IsCached.EdgeFlag = GL_TRUE;
 }
 
+static void import_attrib( GLcontext *ctx, GLuint index,
+                           GLenum type, GLuint stride )
+{
+   ACcontext *ac = AC_CONTEXT(ctx);
+   struct gl_client_array *from = &ac->Raw.Attrib[index];
+   struct gl_client_array *to = &ac->Cache.Attrib[index];
 
+   ASSERT(index < VERT_ATTRIB_MAX);
 
-/* Externals to request arrays with specific properties:
+   /* Limited choices at this stage:
+    */
+   ASSERT(type == GL_FLOAT);
+   ASSERT(stride == 4*sizeof(GLfloat) || stride == 0);
+   ASSERT(ac->count - ac->start < ctx->Const.MaxArrayLockSize);
+
+   _math_trans_4f( (GLfloat (*)[4]) to->Ptr,
+                  from->Ptr,
+                  from->StrideB,
+                  from->Type,
+                  from->Size,
+                  0,
+                  ac->count - ac->start);
+
+   to->Size = from->Size;
+   to->StrideB = 4 * sizeof(GLfloat);
+   to->Type = GL_FLOAT;
+   ac->IsCached.Attrib[index] = GL_TRUE;
+}
+
+
+
+/*
+ * Externals to request arrays with specific properties:
  */
+
+
 struct gl_client_array *_ac_import_texcoord( GLcontext *ctx,
                                             GLuint unit,
                                             GLenum type,
@@ -429,6 +492,8 @@ struct gl_client_array *_ac_import_texcoord( GLcontext *ctx,
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
+   ASSERT(unit < ctx->Const.MaxTextureUnits);
+
    /* Can we keep the existing version?
     */
    if (ac->NewArrayState & _NEW_ARRAY_TEXCOORD(unit))
@@ -656,9 +721,6 @@ struct gl_client_array *_ac_import_fogcoord( GLcontext *ctx,
    }
 }
 
-
-
-
 struct gl_client_array *_ac_import_edgeflag( GLcontext *ctx,
                                             GLenum type,
                                             GLuint reqstride,
@@ -689,8 +751,45 @@ struct gl_client_array *_ac_import_edgeflag( GLcontext *ctx,
    }
 }
 
+/* GL_NV_vertex_program */
+struct gl_client_array *_ac_import_attrib( GLcontext *ctx,
+                                           GLuint index,
+                                           GLenum type,
+                                           GLuint reqstride,
+                                           GLuint reqsize,
+                                           GLboolean reqwriteable,
+                                           GLboolean *writeable )
+{
+   ACcontext *ac = AC_CONTEXT(ctx);
+
+   ASSERT(index < VERT_ATTRIB_MAX);
 
+   /* Can we keep the existing version?
+    */
+   if (ac->NewArrayState & _NEW_ARRAY_ATTRIB(index))
+      reset_attrib( ctx, index );
 
+   /* Is the request impossible?
+    */
+   if (reqsize != 0 && ac->Raw.Attrib[index].Size > (GLint) reqsize)
+      return 0;
+
+   /* Do we need to pull in a copy of the client data:
+    */
+   if (ac->Raw.Attrib[index].Type != type ||
+       (reqstride != 0 && ac->Raw.Attrib[index].StrideB != (GLint)reqstride) ||
+       reqwriteable)
+   {
+      if (!ac->IsCached.Attrib[index])
+        import_attrib(ctx, index, type, reqstride );
+      *writeable = GL_TRUE;
+      return &ac->Cache.Attrib[index];
+   }
+   else {
+      *writeable = GL_FALSE;
+      return &ac->Raw.Attrib[index];
+   }
+}
 
 
 /* Clients must call this function to validate state and set bounds
@@ -723,8 +822,8 @@ void _ac_import_range( GLcontext *ctx, GLuint start, GLuint count )
 
 
 
-/* Additional convienence function for importing the element list
- * for drawelements, drawrangeelements:
+/* Additional convienence function for importing the element list
+ * for glDrawElements() and glDrawRangeElements().
  */
 CONST void *
 _ac_import_elements( GLcontext *ctx,
index 6cb211535462c16e8c42115c19cc546de17a9c7b..4e0e377915039d38b6b1583b519b88a1e97e3345 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: acache.h,v 1.2 2001/03/12 00:48:41 gareth Exp $ */
+/* $Id: acache.h,v 1.3 2002/04/21 18:49:19 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -42,15 +42,6 @@ _ac_DestroyContext( GLcontext *ctx );
 extern void
 _ac_InvalidateState( GLcontext *ctx, GLuint new_state );
 
-extern struct gl_client_array *
-_ac_import_texcoord( GLcontext *ctx,
-                    GLuint unit,
-                    GLenum type,
-                    GLuint reqstride,
-                    GLuint reqsize,
-                    GLboolean reqwritable,
-                    GLboolean *writable );
-
 extern struct gl_client_array *
 _ac_import_vertex( GLcontext *ctx,
                   GLenum type,
@@ -103,6 +94,24 @@ _ac_import_edgeflag( GLcontext *ctx,
                     GLboolean reqwritable,
                     GLboolean *writable );
 
+extern struct gl_client_array *
+_ac_import_texcoord( GLcontext *ctx,
+                    GLuint unit,
+                    GLenum type,
+                    GLuint reqstride,
+                    GLuint reqsize,
+                    GLboolean reqwritable,
+                    GLboolean *writable );
+
+extern struct gl_client_array *
+_ac_import_attrib( GLcontext *ctx,
+                   GLuint index,
+                   GLenum type,
+                   GLuint reqstride,
+                   GLuint reqsize,
+                   GLboolean reqwritable,
+                   GLboolean *writable );
+
 
 /* Clients must call this function to validate state and set bounds
  * before importing any data:
index 572bd054f3f0862ea031bc17b990aa88fda0290b..25b72245e407a37700167ecda15f5df71d9b5ef2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: dd.h,v 1.67 2002/03/16 00:57:14 brianp Exp $ */
+/* $Id: dd.h,v 1.68 2002/04/21 18:49:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -542,6 +542,8 @@ struct dd_function_table {
    void (*TexCoordPointer)(GLcontext *ctx, GLint size, GLenum type,
                           GLsizei stride, const GLvoid *ptr);
    void (*EdgeFlagPointer)(GLcontext *ctx, GLsizei stride, const GLvoid *ptr);
+   void (*VertexAttribPointer)(GLcontext *ctx, GLuint index, GLint size,
+                               GLenum type, GLsizei stride, const GLvoid *ptr);
 
 
    /*** State-query functions
index 78c200dcae441d28b37d9231eea8da2f17d0a972..af870e1639aafc1abdf4be22cddf5a6843b435e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: enable.c,v 1.61 2002/04/19 08:38:23 alanh Exp $ */
+/* $Id: enable.c,v 1.62 2002/04/21 18:49:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -112,7 +112,7 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state )
          {
             GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
             var = &ctx->Array.VertexAttrib[n].Enabled;
-            flag = _NEW_ARRAY_VERT_ATTRIB0;  /* XXX flag OK? */
+            flag = _NEW_ARRAY_ATTRIB(n);
          }
          break;
       default:
index 6dde32b52c16ed2496effe439853a02af0fe097c..a14347fb55389e2d0f759c7190a0ad63da7400fd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mtypes.h,v 1.71 2002/04/19 15:49:40 kschultz Exp $ */
+/* $Id: mtypes.h,v 1.72 2002/04/21 18:49:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1538,10 +1538,11 @@ struct matrix_stack
 #define _NEW_ARRAY_TEXCOORD_6       VERT_BIT_TEX6
 #define _NEW_ARRAY_TEXCOORD_7       VERT_BIT_TEX7
 #define _NEW_ARRAY_ALL              0xffff
-#define _NEW_ARRAY_VERT_ATTRIB0     0x10000
+#define _NEW_ARRAY_ATTRIB_0         0x10000  /* start at bit 16 */
 
 
 #define _NEW_ARRAY_TEXCOORD(i) (_NEW_ARRAY_TEXCOORD_0 << (i))
+#define _NEW_ARRAY_ATTRIB(i) (_NEW_ARRAY_ATTRIB_0 << (i))
 
 /* A bunch of flags that we think might be useful to drivers.
  */
index bf783ee97077f3b3b6465c6b94a3fd372dc5f23b..f35e50c8724affd5946ccadae13aae27bbb4c340 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: varray.c,v 1.42 2002/04/04 23:59:14 brianp Exp $ */
+/* $Id: varray.c,v 1.43 2002/04/21 18:49:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -452,12 +452,12 @@ _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr)
 
 
 void _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
-                                 GLsizei stride, const GLvoid *pointer)
+                                 GLsizei stride, const GLvoid *ptr)
 {
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   if (index >= VP_NUM_PROG_REGS) {
+   if (index >= VERT_ATTRIB_MAX) {
       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
       return;
    }
@@ -502,16 +502,13 @@ void _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
    ctx->Array.VertexAttrib[index].Stride = stride;
    ctx->Array.VertexAttrib[index].Size = size;
    ctx->Array.VertexAttrib[index].Type = type;
+   ctx->Array.VertexAttrib[index].Ptr = (void *) ptr;
 
-   /* XXX need new flags here??? */
    ctx->NewState |= _NEW_ARRAY;
-   /* XXX probably need new flags!!!! */
-   ctx->Array.NewState |= _NEW_ARRAY_VERT_ATTRIB0;
+   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
 
-   /* XXX
-   if (ctx->Driver.VertexAttribdPointer)
+   if (ctx->Driver.VertexAttribPointer)
       ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr );
-   */
 }