r300: vertex array stride = 0 means that data are tightly packed in the array
authorMaciej Cencora <m.cencora@gmail.com>
Fri, 5 Jun 2009 15:58:04 +0000 (17:58 +0200)
committerDave Airlie <airlied@redhat.com>
Sun, 7 Jun 2009 06:40:04 +0000 (16:40 +1000)
src/mesa/drivers/dri/r300/r300_draw.c

index c9588fbb21c809cf0cea03db6f8a818643ed546b..684b1d0ef840a57694de7c0b74a63a285f9c84f0 100644 (file)
@@ -123,7 +123,7 @@ static int getTypeSize(GLenum type)
                                *dst_ptr++ = MACRO(*in);                \
                                in++;                           \
                        }                                       \
-                       src_ptr += input->StrideB;                      \
+                       src_ptr += stride;                      \
                }                                               \
        } else {                                        \
                for (i = 0; i < count; i++) {           \
@@ -132,7 +132,7 @@ static int getTypeSize(GLenum type)
                                *dst_ptr++ = (GLfloat)(*in);            \
                                in++;                           \
                        }                                       \
-                       src_ptr += input->StrideB;                      \
+                       src_ptr += stride;                      \
                }                                               \
        }                                               \
 } while (0)
@@ -144,6 +144,7 @@ static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const st
        struct vertex_attribute r300_attr;
        const void *src_ptr;
        GLenum type;
+       GLuint stride;
 
        if (input->BufferObj->Name) {
                if (!input->BufferObj->Pointer) {
@@ -157,10 +158,12 @@ static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const st
        } else
                src_ptr = input->Ptr;
 
-       if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT || input->StrideB < 4){
+       stride = (input->StrideB == 0) ? getTypeSize(input->Type) * input->Size : input->StrideB;
+
+       if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT || stride < 4){
                if (RADEON_DEBUG & DEBUG_FALLBACKS) {
                        fprintf(stderr, "%s: Converting vertex attributes, attribute data format %x,", __FUNCTION__, input->Type);
-                       fprintf(stderr, "stride %d, components %d\n", input->StrideB, input->Size);
+                       fprintf(stderr, "stride %d, components %d\n", stride, input->Size);
                }
 
                GLfloat *dst_ptr, *tmp;
@@ -203,7 +206,7 @@ static void r300TranslateAttrib(GLcontext *ctx, GLuint attr, int count, const st
                type = input->Type;
                r300_attr.free_needed = GL_FALSE;
                r300_attr.data = (GLvoid *)src_ptr;
-               r300_attr.stride = input->StrideB;
+               r300_attr.stride = stride;
                r300_attr.dwords = (getTypeSize(type) * input->Size  + 3)/ 4;
        }