i965: allow unsourced enabled VAO
authorJuan A. Suarez Romero <jasuarez@igalia.com>
Thu, 3 Nov 2016 07:56:23 +0000 (08:56 +0100)
committerJuan A. Suarez Romero <jasuarez@igalia.com>
Wed, 21 Dec 2016 11:37:22 +0000 (12:37 +0100)
The GL 4.5 spec says:
    "If any enabled array’s buffer binding is zero when DrawArrays
    or one of the other drawing commands defined in section 10.4 is
    called, the result is undefined."

This commits avoids crashing the code, which is not a very good
"undefined result".

This fixes spec/!opengl 3.1/vao-broken-attrib piglit test.

src/mesa/drivers/dri/i965/brw_draw_upload.c

index b138cb7ef6259215c90026b19c876ce27f7c877c..578156459240b7c7ff9ba2aabf8edee8659a402d 100644 (file)
@@ -423,13 +423,22 @@ copy_array_to_vbo_array(struct brw_context *brw,
    uint8_t *dst = intel_upload_space(brw, size, dst_stride,
                                      &buffer->bo, &buffer->offset);
 
-   if (dst_stride == src_stride) {
-      memcpy(dst, src, size);
-   } else {
-      while (count--) {
-        memcpy(dst, src, dst_stride);
-        src += src_stride;
-        dst += dst_stride;
+   /* The GL 4.5 spec says:
+    *      "If any enabled array’s buffer binding is zero when DrawArrays or
+    *      one of the other drawing commands defined in section 10.4 is called,
+    *      the result is undefined."
+    *
+    * In this case, let's the dst with undefined values
+    */
+   if (src != NULL) {
+      if (dst_stride == src_stride) {
+         memcpy(dst, src, size);
+      } else {
+         while (count--) {
+            memcpy(dst, src, dst_stride);
+            src += src_stride;
+            dst += dst_stride;
+         }
       }
    }
    buffer->stride = dst_stride;