st/mesa: don't draw instead of asserting in transform feedback

if we get a request to take the count from feedback, but there
is no buffer to take it from, just draw as if we got 0 vertices
so nothing.

This fixes this assert killing the ogl conform, and a piglit
test I've sent.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-07-30 20:44:50 +10:00
parent fdb8487613
commit 518abd0bbe
3 changed files with 7 additions and 4 deletions

View File

@ -191,7 +191,6 @@ st_transform_feedback_get_draw_target(struct gl_transform_feedback_object *obj)
} }
} }
assert(0);
return NULL; return NULL;
} }
@ -211,14 +210,17 @@ st_end_transform_feedback(struct gl_context *ctx,
} }
void bool
st_transform_feedback_draw_init(struct gl_transform_feedback_object *obj, st_transform_feedback_draw_init(struct gl_transform_feedback_object *obj,
struct pipe_draw_info *out) struct pipe_draw_info *out)
{ {
struct st_transform_feedback_object *sobj = struct st_transform_feedback_object *sobj =
st_transform_feedback_object(obj); st_transform_feedback_object(obj);
if (sobj->draw_count == NULL)
return false;
out->count_from_stream_output = sobj->draw_count; out->count_from_stream_output = sobj->draw_count;
return true;
} }

View File

@ -38,7 +38,7 @@ struct pipe_draw_info;
extern void extern void
st_init_xformfb_functions(struct dd_function_table *functions); st_init_xformfb_functions(struct dd_function_table *functions);
extern void extern bool
st_transform_feedback_draw_init(struct gl_transform_feedback_object *obj, st_transform_feedback_draw_init(struct gl_transform_feedback_object *obj,
struct pipe_draw_info *out); struct pipe_draw_info *out);

View File

@ -242,7 +242,8 @@ st_draw_vbo(struct gl_context *ctx,
/* Transform feedback drawing is always non-indexed. */ /* Transform feedback drawing is always non-indexed. */
/* Set info.count_from_stream_output. */ /* Set info.count_from_stream_output. */
if (tfb_vertcount) { if (tfb_vertcount) {
st_transform_feedback_draw_init(tfb_vertcount, &info); if (st_transform_feedback_draw_init(tfb_vertcount, &info) == false)
return;
} }
} }