X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_draw.c;h=2ad679b1cb8e5dff3f5f357f650f75ce2a268ca1;hb=bfd3d5244b26aca7696715066f5e5331e0b5fe2a;hp=c8189faade58cb8dad212c52e978e7ad1a01d547;hpb=c03477050a6f51e601f75cb3c061a3e16a5b7171;p=mesa.git diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index c8189faade5..2ad679b1cb8 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -40,6 +40,7 @@ #include "main/image.h" #include "main/bufferobj.h" #include "main/macros.h" +#include "main/varray.h" #include "vbo/vbo.h" @@ -105,9 +106,10 @@ setup_index_buffer(struct st_context *st, } else if (st->indexbuf_uploader) { /* upload indexes from user memory into a real buffer */ - if (u_upload_data(st->indexbuf_uploader, 0, - ib->count * ibuffer->index_size, ib->ptr, - &ibuffer->offset, &ibuffer->buffer) != PIPE_OK) { + u_upload_data(st->indexbuf_uploader, 0, + ib->count * ibuffer->index_size, ib->ptr, + &ibuffer->offset, &ibuffer->buffer); + if (!ibuffer->buffer) { /* out of memory */ return FALSE; } @@ -140,7 +142,7 @@ check_uniforms(struct gl_context *ctx) if (shProg[j] == NULL || !shProg[j]->LinkStatus) continue; - for (i = 0; i < shProg[j]->NumUserUniformStorage; i++) { + for (i = 0; i < shProg[j]->NumUniformStorage; i++) { const struct gl_uniform_storage *u = &shProg[j]->UniformStorage[i]; if (!u->initialized) { _mesa_warning(ctx, @@ -163,6 +165,7 @@ translate_prim(const struct gl_context *ctx, unsigned prim) STATIC_ASSERT(GL_POINTS == PIPE_PRIM_POINTS); STATIC_ASSERT(GL_QUADS == PIPE_PRIM_QUADS); STATIC_ASSERT(GL_TRIANGLE_STRIP_ADJACENCY == PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY); + STATIC_ASSERT(GL_PATCHES == PIPE_PRIM_PATCHES); return prim; } @@ -182,6 +185,7 @@ st_draw_vbo(struct gl_context *ctx, GLuint min_index, GLuint max_index, struct gl_transform_feedback_object *tfb_vertcount, + unsigned stream, struct gl_buffer_object *indirect) { struct st_context *st = st_context(ctx); @@ -225,7 +229,7 @@ st_draw_vbo(struct gl_context *ctx, } info.indexed = TRUE; - if (min_index != ~0 && max_index != ~0) { + if (min_index != ~0U && max_index != ~0U) { info.min_index = min_index; info.max_index = max_index; } @@ -234,16 +238,25 @@ st_draw_vbo(struct gl_context *ctx, * so we only set these fields for indexed drawing: */ info.primitive_restart = ctx->Array._PrimitiveRestart; - info.restart_index = ctx->Array.RestartIndex; + info.restart_index = _mesa_primitive_restart_index(ctx, ib->type); } else { /* Transform feedback drawing is always non-indexed. */ /* Set info.count_from_stream_output. */ if (tfb_vertcount) { - st_transform_feedback_draw_init(tfb_vertcount, &info); + if (!st_transform_feedback_draw_init(tfb_vertcount, stream, &info)) + return; } } + if (indirect) { + info.indirect = st_buffer_object(indirect)->buffer; + + /* Primitive restart is not handled by the VBO module in this case. */ + info.primitive_restart = ctx->Array._PrimitiveRestart; + info.restart_index = ctx->Array.RestartIndex; + } + /* do actual drawing */ for (i = 0; i < nr_prims; i++) { info.mode = translate_prim(ctx, prims[i].mode); @@ -251,11 +264,13 @@ st_draw_vbo(struct gl_context *ctx, info.count = prims[i].count; info.start_instance = prims[i].base_instance; info.instance_count = prims[i].num_instances; + info.vertices_per_patch = ctx->TessCtrlProgram.patch_vertices; info.index_bias = prims[i].basevertex; if (!ib) { info.min_index = info.start; info.max_index = info.start + info.count - 1; } + info.indirect_offset = prims[i].indirect_offset; if (ST_DEBUG & DEBUG_DRAW) { debug_printf("st/draw: mode %s start %u count %u indexed %d\n", @@ -265,7 +280,7 @@ st_draw_vbo(struct gl_context *ctx, info.indexed); } - if (info.count_from_stream_output) { + if (info.count_from_stream_output || info.indirect) { cso_draw_vbo(st->cso_context, &info); } else if (info.primitive_restart) {