summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-09-26 16:14:40 -0700
committerEric Anholt <[email protected]>2011-10-01 22:16:07 -0700
commitddc348d83eff8c12ff0e6c245c32fa65120e7f4a (patch)
tree0a9aa476c4589cabfac3cb563138ad54d79d3829
parent617cdcd4c7b1cffb584c829c35bdf9c9bf04627b (diff)
i965: Make sure to upload the data for a collection of Stride == 0 arrays.
Commit d631c19db47181129811080bfa772b210d762d4d avoided this problem by forcing the driver to get the min/max index, but that commit was broken, so just fix the driver problem (confusion between "do I need to upload any data?" and "do I need the index bounds in order to upload any data?").
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw_upload.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c
index 7bc69c612e3..20325eba4fb 100644
--- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
@@ -31,6 +31,7 @@
#include "main/bufferobj.h"
#include "main/context.h"
#include "main/enums.h"
+#include "main/macros.h"
#include "brw_draw.h"
#include "brw_defines.h"
@@ -251,6 +252,22 @@ copy_array_to_vbo_array(struct brw_context *brw,
struct brw_vertex_buffer *buffer,
GLuint dst_stride)
{
+ if (min == -1) {
+ /* If we don't have computed min/max bounds, then this must be a use of
+ * the current attribute, which has a 0 stride. Otherwise, we wouldn't
+ * know what data to upload.
+ */
+ assert(element->glarray->StrideB == 0);
+
+ intel_upload_data(&brw->intel, element->glarray->Ptr,
+ element->element_size,
+ element->element_size,
+ &buffer->bo, &buffer->offset);
+
+ buffer->stride = 0;
+ return;
+ }
+
int src_stride = element->glarray->StrideB;
const unsigned char *src = element->glarray->Ptr + min * src_stride;
int count = max - min + 1;
@@ -442,7 +459,7 @@ static void brw_prepare_vertices(struct brw_context *brw)
else if (total_size < 2048) {
/* Upload non-interleaved arrays into a single interleaved array */
struct brw_vertex_buffer *buffer;
- int count = max_index - min_index + 1;
+ int count = MAX2(max_index - min_index + 1, 1);
int offset;
char *map;