summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZack Rusin <zackr@vmware.com>2010-06-17 10:47:10 -0400
committerZack Rusin <zackr@vmware.com>2010-06-17 10:47:10 -0400
commit91862051f98e646647906bb15aec5c5d537f87e4 (patch)
tree74c75f7c029dc29fe99a671e9002608a604904fe /src
parentc85971da31276f17f90fe7d7596c24b5daa204f9 (diff)
draw: validate stream output buffers
fixes a crash.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt_so_emit.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_so_emit.c b/src/gallium/auxiliary/draw/draw_pt_so_emit.c
index 84555a73c4..5d82934889 100644
--- a/src/gallium/auxiliary/draw/draw_pt_so_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_so_emit.c
@@ -57,6 +57,20 @@ void draw_pt_so_emit_prepare(struct pt_so_emit *emit)
emit->has_so = (draw->so.state.num_outputs > 0);
+ /* if we have a state with outputs make sure we have
+ * buffers to output to */
+ if (emit->has_so) {
+ boolean has_valid_buffer = FALSE;
+ unsigned i;
+ for (i = 0; i < draw->so.num_buffers; ++i) {
+ if (draw->so.buffers[i]) {
+ has_valid_buffer = TRUE;
+ break;
+ }
+ }
+ emit->has_so = has_valid_buffer;
+ }
+
if (!emit->has_so)
return;
@@ -240,8 +254,9 @@ void draw_pt_so_emit( struct pt_so_emit *emit,
emit->emitted_primitives = 0;
emit->input_vertex_stride = input_verts->stride;
emit->inputs = (const float (*)[4])input_verts->verts->data;
- for (i = 0; i < draw->so.num_buffers; ++i)
+ for (i = 0; i < draw->so.num_buffers; ++i) {
emit->buffers[i] = draw->so.buffers[i];
+ }
emit->single_buffer = TRUE;
for (i = 0; i < draw->so.state.num_outputs; ++i) {
if (draw->so.state.output_buffer[i] != 0)