Implemented GL_EXT_multi_draw_arrays: glMultiDrawArraysEXT() and glMultiDrawElementsE...
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 30 Jun 2002 15:47:00 +0000 (15:47 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 30 Jun 2002 15:47:00 +0000 (15:47 +0000)
src/mesa/glapi/glapioffsets.h
src/mesa/glapi/glapitable.h
src/mesa/glapi/glapitemp.h
src/mesa/main/dlist.c
src/mesa/main/glprocs.h
src/mesa/main/state.c
src/mesa/main/varray.c
src/mesa/main/varray.h
src/mesa/sparc/glapi_sparc.S
src/mesa/x86/glapi_x86.S

index 2ecf718bbb20992773045085cde48b04274c6cfc..21d70ef2536edc678a9505a67524a9a534bcb977 100644 (file)
 #define _gloffset_VertexAttribs4ubvNV 641
 #define _gloffset_PointParameteriNV 642
 #define _gloffset_PointParameterivNV 643
+#define _gloffset_MultiDrawArraysEXT 644
+#define _gloffset_MultiDrawElementsEXT 645
 
 #endif
index 2f98e9b1a1940ca121719a7e2ccd0d49493f4e2d..5511863b67b58780eee481d1a720d18248308f55 100644 (file)
@@ -650,6 +650,8 @@ struct _glapi_table
    void (*VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 641 */
    void (*PointParameteriNV)(GLenum pname, GLint params); /* 642 */
    void (*PointParameterivNV)(GLenum pname, const GLint * params); /* 643 */
+   void (*MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); /* 644 */
+   void (*MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount); /* 645 */
 };
 
 #endif
index cf1976e9b8deb658fdc9ab6bc3f4aee92e53d36c..0fcb59d6ac114e83f88d9aa18c5c02b07ca80298 100644 (file)
@@ -3169,8 +3169,16 @@ KEYWORD1 void KEYWORD2 NAME(SecondaryColorPointerEXT)(GLint size, GLenum type, G
 }
 
 /* No dispatch for TextureNormalEXT() */
-/* No dispatch for MultiDrawArraysEXT() */
-/* No dispatch for MultiDrawElementsEXT() */
+KEYWORD1 void KEYWORD2 NAME(MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount)
+{
+   DISPATCH(MultiDrawArraysEXT, (mode, first, count, primcount), (F, "glMultiDrawArraysEXT(0x%x, %p, %p, %d);\n", mode, (void *) first, (void *) count, primcount));
+}
+
+KEYWORD1 void KEYWORD2 NAME(MultiDrawElementsEXT)(GLenum mode, const GLsizei * count, GLenum type, const GLvoid ** indices, GLsizei primcount)
+{
+   DISPATCH(MultiDrawElementsEXT, (mode, count, type, indices, primcount), (F, "glMultiDrawElementsEXT(0x%x, %p, 0x%x, %p, %d);\n", mode, (void *) count, type, (void *) indices, primcount));
+}
+
 KEYWORD1 void KEYWORD2 NAME(FogCoordfEXT)(GLfloat coord)
 {
    DISPATCH(FogCoordfEXT, (coord), (F, "glFogCoordfEXT(%f);\n", coord));
@@ -4611,6 +4619,8 @@ void *DISPATCH_TABLE_NAME[] = {
    TABLE_ENTRY(VertexAttribs4ubvNV),
    TABLE_ENTRY(PointParameteriNV),
    TABLE_ENTRY(PointParameterivNV),
+   TABLE_ENTRY(MultiDrawArraysEXT),
+   TABLE_ENTRY(MultiDrawElementsEXT),
    /* A whole bunch of no-op functions.  These might be called
     * when someone tries to call a dynamically-registered
     * extension function without a current rendering context.
index 1409f0ee4204250f92b468b17e909b5ab6a6afe5..07687e4dab79e3ec7047bae8d1835ffd18243927 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: dlist.c,v 1.91 2002/06/29 19:48:15 brianp Exp $ */
+/* $Id: dlist.c,v 1.92 2002/06/30 15:47:00 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -5725,6 +5725,26 @@ static void exec_FogCoordPointerEXT(GLenum type, GLsizei stride,
    ctx->Exec->FogCoordPointerEXT( type, stride, ptr);
 }
 
+/* GL_EXT_multi_draw_arrays */
+static void exec_MultiDrawArraysEXT(GLenum mode, GLint *first,
+                                    GLsizei *count, GLsizei primcount)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   FLUSH_VERTICES(ctx, 0);
+   ctx->Exec->MultiDrawArraysEXT( mode, first, count, primcount );
+}
+
+/* GL_EXT_multi_draw_arrays */
+static void exec_MultiDrawElementsEXT(GLenum mode, const GLsizei *count,
+                                      GLenum type, const GLvoid **indices,
+                                      GLsizei primcount)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   FLUSH_VERTICES(ctx, 0);
+   ctx->Exec->MultiDrawElementsEXT(mode, count, type, indices, primcount);
+}
+
+
 
 /*
  * Assign all the pointers in <table> to point to Mesa's display list
@@ -6045,6 +6065,10 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize )
    /* 145. GL_EXT_secondary_color */
    table->SecondaryColorPointerEXT = exec_SecondaryColorPointerEXT;
 
+   /* 148. GL_EXT_multi_draw_arrays */
+   table->MultiDrawArraysEXT = exec_MultiDrawArraysEXT;
+   table->MultiDrawElementsEXT = exec_MultiDrawElementsEXT;
+
    /* 149. GL_EXT_fog_coord */
    table->FogCoordPointerEXT = exec_FogCoordPointerEXT;
 
index 433910af441e216f0dda1912ea7aa7ba895a6eaf..b98c25dc31377ad9c98d6d41db0b3101011b9b5e 100644 (file)
@@ -619,6 +619,8 @@ static struct name_address_offset static_functions[] = {
    { "glSecondaryColor3usEXT", (GLvoid *) glSecondaryColor3usEXT, _gloffset_SecondaryColor3usEXT },
    { "glSecondaryColor3usvEXT", (GLvoid *) glSecondaryColor3usvEXT, _gloffset_SecondaryColor3usvEXT },
    { "glSecondaryColorPointerEXT", (GLvoid *) glSecondaryColorPointerEXT, _gloffset_SecondaryColorPointerEXT },
+   { "glMultiDrawArraysEXT", (GLvoid *) glMultiDrawArraysEXT, _gloffset_MultiDrawArraysEXT },
+   { "glMultiDrawElementsEXT", (GLvoid *) glMultiDrawElementsEXT, _gloffset_MultiDrawElementsEXT },
    { "glFogCoordfEXT", (GLvoid *) glFogCoordfEXT, _gloffset_FogCoordfEXT },
    { "glFogCoordfvEXT", (GLvoid *) glFogCoordfvEXT, _gloffset_FogCoordfvEXT },
    { "glFogCoorddEXT", (GLvoid *) glFogCoorddEXT, _gloffset_FogCoorddEXT },
index 52cec5a0af3938f9339852b739218f9158194759..27e7e0017adbc2d8eff4b756da91c4b787c022e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: state.c,v 1.87 2002/06/25 02:31:37 brianp Exp $ */
+/* $Id: state.c,v 1.88 2002/06/30 15:47:01 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -425,6 +425,10 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize)
    exec->LockArraysEXT = _mesa_LockArraysEXT;
    exec->UnlockArraysEXT = _mesa_UnlockArraysEXT;
 
+   /* 148. GL_EXT_multi_draw_arrays */
+   exec->MultiDrawArraysEXT = _mesa_MultiDrawArraysEXT;
+   exec->MultiDrawElementsEXT = _mesa_MultiDrawElementsEXT;
+
    /* 173. GL_INGR_blend_func_separate */
    exec->BlendFuncSeparateEXT = _mesa_BlendFuncSeparateEXT;
 
index e913869366469dbba6b16b65173c5bf2b07913b8..3fd318e7d4cfa193d707390e2691df52b74aa4b8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: varray.c,v 1.45 2002/06/15 02:38:16 brianp Exp $ */
+/* $Id: varray.c,v 1.46 2002/06/30 15:47:01 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -799,3 +799,41 @@ _mesa_UnlockArraysEXT( void )
    if (ctx->Driver.UnlockArraysEXT)
       ctx->Driver.UnlockArraysEXT( ctx );
 }
+
+
+
+/* GL_EXT_multi_draw_arrays */
+/* Somebody forgot to spec the first and count parameters as const! <sigh> */
+void
+_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first,
+                          GLsizei *count, GLsizei primcount )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLint i;
+
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   for (i = 0; i < primcount; i++) {
+      if (count[i] > 0) {
+         (ctx->Exec->DrawArrays)(mode, first[i], count[i]);
+      }
+   }
+}
+
+
+/* GL_EXT_multi_draw_arrays */
+void
+_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
+                            const GLvoid **indices, GLsizei primcount )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLint i;
+
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   for (i = 0; i < primcount; i++) {
+      if (count[i] > 0) {
+         (ctx->Exec->DrawElements)(mode, count[i], type, indices[i]);
+      }
+   }
+}
index b2f18667cd118059a0c22b4e56d66b7156863bd0..cf114cda8a95e7540aa9037a30414ad5f720db3f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: varray.h,v 1.13 2002/01/11 17:25:35 brianp Exp $ */
+/* $Id: varray.h,v 1.14 2002/06/30 15:47:01 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -111,4 +111,13 @@ extern void
 _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
 
 
+extern void
+_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first,
+                          GLsizei *count, GLsizei primcount );
+
+extern void
+_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
+                            const GLvoid **indices, GLsizei primcount );
+
+
 #endif
index c9bf45b604ab36b302a89220a293e5dd8489b7a3..a70b6300ffb4c65db42cf643e0f0f1460728f5b7 100644 (file)
@@ -12936,6 +12936,48 @@ glSecondaryColorPointerEXT:
        jmpl    %g3, %g0
        nop
 
+.globl glMultiDrawArraysEXT
+.type glMultiDrawArraysEXT,#function
+glMultiDrawArraysEXT:
+#ifdef __sparc_v9__
+       sethi   %hi(0x00000000), %g2
+       sethi   %hi(0x00000000), %g1
+       or      %g2, %lo(0x00000000), %g2
+       or      %g1, %lo(0x00000000), %g1
+       sllx    %g2, 32, %g2
+       ldx     [%g1 + %g2], %g1
+       sethi   %hi(8 * _gloffset_MultiDrawArraysEXT), %g2
+       or      %g2, %lo(8 * _gloffset_MultiDrawArraysEXT), %g2
+       ldx     [%g1 + %g2], %g3
+#else
+       sethi   %hi(0x00000000), %g1
+       ld      [%g1 + %lo(0x00000000)], %g1
+       ld      [%g1 + (4 * _gloffset_MultiDrawArraysEXT)], %g3
+#endif
+       jmpl    %g3, %g0
+       nop
+
+.globl glMultiDrawElementsEXT
+.type glMultiDrawElementsEXT,#function
+glMultiDrawElementsEXT:
+#ifdef __sparc_v9__
+       sethi   %hi(0x00000000), %g2
+       sethi   %hi(0x00000000), %g1
+       or      %g2, %lo(0x00000000), %g2
+       or      %g1, %lo(0x00000000), %g1
+       sllx    %g2, 32, %g2
+       ldx     [%g1 + %g2], %g1
+       sethi   %hi(8 * _gloffset_MultiDrawElementsEXT), %g2
+       or      %g2, %lo(8 * _gloffset_MultiDrawElementsEXT), %g2
+       ldx     [%g1 + %g2], %g3
+#else
+       sethi   %hi(0x00000000), %g1
+       ld      [%g1 + %lo(0x00000000)], %g1
+       ld      [%g1 + (4 * _gloffset_MultiDrawElementsEXT)], %g3
+#endif
+       jmpl    %g3, %g0
+       nop
+
 .globl glFogCoordfEXT
 .type glFogCoordfEXT,#function
 glFogCoordfEXT:
index f99538697a4a686dc9ed83ea9c78650ab2dbfaf6..7b26f94fea8b9124bd4a1011363c57af34ed689f 100644 (file)
@@ -3711,6 +3711,18 @@ GL_PREFIX(SecondaryColorPointerEXT):
        MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX)
        JMP(GL_OFFSET(_gloffset_SecondaryColorPointerEXT))
 
+ALIGNTEXT16
+GLOBL_FN(GL_PREFIX(MultiDrawArraysEXT))
+GL_PREFIX(MultiDrawArraysEXT):
+       MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX)
+       JMP(GL_OFFSET(_gloffset_MultiDrawArraysEXT))
+
+ALIGNTEXT16
+GLOBL_FN(GL_PREFIX(MultiDrawElementsEXT))
+GL_PREFIX(MultiDrawElementsEXT):
+       MOV_L(CONTENT(GLNAME(_glapi_Dispatch)), EAX)
+       JMP(GL_OFFSET(_gloffset_MultiDrawElementsEXT))
+
 ALIGNTEXT16
 GLOBL_FN(GL_PREFIX(FogCoordfEXT))
 GL_PREFIX(FogCoordfEXT):