Fix SGL testGeoSets.exe polygon mode problem (wrong interpretation of
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 2 Aug 2001 21:30:10 +0000 (21:30 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 2 Aug 2001 21:30:10 +0000 (21:30 +0000)
count parameter in DrawArrays)

src/mesa/tnl/t_array_api.c

index cbca11e..b5a275f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_array_api.c,v 1.16 2001/08/02 19:58:07 keithw Exp $ */
+/* $Id: t_array_api.c,v 1.17 2001/08/02 21:30:10 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -56,7 +56,9 @@ static void fallback_drawarrays( GLcontext *ctx, GLenum mode, GLint start,
     * operations: producing the flag array and computing the orflag
     * of the flag array.
     */
-#if 1
+#if 0
+   /* Buggy - see sgl testGeoSets.exe polygon mode
+    */
    if (_tnl_hard_begin( ctx, mode )) {
       GLint i;
       for (i = 0 ; i < count ; ) {
@@ -95,9 +97,11 @@ static void fallback_drawelements( GLcontext *ctx, GLenum mode, GLsizei count,
 {
 /*     fprintf(stderr, "%s\n", __FUNCTION__); */
 
-#if 1
+#if 0
    /* Optimized code that fakes the effect of calling
     * _tnl_array_element for each index in the list.
+    *
+    * Possibly buggy, see above.
     */
    if (_tnl_hard_begin( ctx, mode )) {
       GLint i, j;
@@ -172,7 +176,7 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    struct vertex_buffer *VB = &tnl->vb;
 
-/*     fprintf(stderr, "%s\n", __FUNCTION__); */
+/*     fprintf(stderr, "%s %d %d\n", __FUNCTION__, start, count); */
    
    /* Check arguments, etc.
     */
@@ -183,9 +187,9 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
       _tnl_validate_pipeline( ctx );
 
    if (ctx->CompileFlag) {
-      fallback_drawarrays( ctx, mode, start, count );
+      fallback_drawarrays( ctx, mode, start, start + count );
    }    
-   else if (count - start < (GLint) ctx->Const.MaxArrayLockSize) {
+   else if (count < (GLint) ctx->Const.MaxArrayLockSize) {
 
       /* Small primitives which can fit in a single vertex buffer:
        */
@@ -195,8 +199,8 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
       {
         if (start < (GLint) ctx->Array.LockFirst)
             start = ctx->Array.LockFirst;
-        if (count > (GLint) ctx->Array.LockCount)
-            count = ctx->Array.LockCount;
+        if (start + count > (GLint) ctx->Array.LockCount)
+            count = ctx->Array.LockCount - start;
         if (start >= count)
             return;
 
@@ -205,7 +209,7 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
         _tnl_vb_bind_arrays( ctx, ctx->Array.LockFirst, ctx->Array.LockCount );
         VB->FirstPrimitive = start;
         VB->Primitive[start] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST;
-        VB->PrimitiveLength[start] = count - start;
+        VB->PrimitiveLength[start] = count;
         tnl->Driver.RunPipeline( ctx );
       } else {
         /* The arrays are small enough to fit in a single VB; just bind
@@ -214,10 +218,10 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
          *
          * Invalidate any cached data dependent on these arrays.
          */
-        _tnl_vb_bind_arrays( ctx, start, count );
+        _tnl_vb_bind_arrays( ctx, start, start + count );
         VB->FirstPrimitive = 0;
         VB->Primitive[0] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST;
-        VB->PrimitiveLength[0] = count - start;
+        VB->PrimitiveLength[0] = count;
         tnl->pipeline.run_input_changes |= ctx->Array._Enabled;
         tnl->Driver.RunPipeline( ctx );
         tnl->pipeline.run_input_changes |= ctx->Array._Enabled;
@@ -272,7 +276,7 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
         /* Primitives requiring a copied vertex (fan-like primitives)
          * must use the slow path:
          */
-        fallback_drawarrays( ctx, mode, start, count );
+        fallback_drawarrays( ctx, mode, start, start + count );
         return;
       }
 
@@ -284,6 +288,7 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count)
       
       bufsz -= bufsz % modulo;
       bufsz -= minimum;
+      count += start;
 
       for (j = start + minimum ; j < count ; j += nr + skip ) {
 
@@ -312,6 +317,8 @@ _tnl_DrawRangeElements(GLenum mode,
    GET_CURRENT_CONTEXT(ctx);
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    GLuint *ui_indices;
+   
+/*     fprintf(stderr, "%s\n", __FUNCTION__); */
 
    /* Check arguments, etc.
     */