From b78ab9c741ac758e9d1eb237f7e8ddc3b70235f5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 10 Feb 2020 21:42:56 -0500 Subject: [PATCH] mesa: move num_instances and base_instance out of _mesa_prim They are never used by multi draws and internal draws. Acked-by: Pierre-Eric Pelloux-Prayer Reviewed-by: Ian Romanick Part-of: --- src/mesa/drivers/dri/i965/brw_draw.c | 45 ++++++++++--------- src/mesa/drivers/dri/i965/brw_draw.h | 5 ++- .../drivers/dri/i965/brw_primitive_restart.c | 10 +++-- src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 17 +++++-- src/mesa/main/dd.h | 3 ++ src/mesa/main/draw.c | 23 ++++------ src/mesa/main/draw.h | 2 - src/mesa/state_tracker/st_cb_rasterpos.c | 4 +- src/mesa/state_tracker/st_draw.c | 6 ++- src/mesa/state_tracker/st_draw.h | 2 + src/mesa/state_tracker/st_draw_feedback.c | 7 ++- src/mesa/tnl/t_draw.c | 14 +++--- src/mesa/tnl/t_rebase.c | 3 ++ src/mesa/tnl/t_rebase.h | 2 + src/mesa/tnl/t_split.c | 8 +++- src/mesa/tnl/t_split.h | 2 + src/mesa/tnl/t_split_copy.c | 3 +- src/mesa/tnl/t_split_inplace.c | 12 +++-- src/mesa/tnl/tnl.h | 7 +++ src/mesa/vbo/vbo.h | 1 + src/mesa/vbo/vbo_exec.c | 4 +- src/mesa/vbo/vbo_exec_api.c | 2 - src/mesa/vbo/vbo_exec_draw.c | 2 +- src/mesa/vbo/vbo_primitive_restart.c | 8 +++- src/mesa/vbo/vbo_save_api.c | 4 -- src/mesa/vbo/vbo_save_draw.c | 2 +- 26 files changed, 120 insertions(+), 78 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 10c599e796c..2b702297a68 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -160,6 +160,7 @@ brw_emit_prim(struct brw_context *brw, const struct _mesa_prim *prim, uint32_t hw_prim, bool is_indexed, + GLuint num_instances, GLuint base_instance, struct brw_transform_feedback_object *xfb_obj, unsigned stream, bool is_indirect, @@ -217,7 +218,7 @@ brw_emit_prim(struct brw_context *brw, BEGIN_BATCH(9); OUT_BATCH(MI_LOAD_REGISTER_IMM | (9 - 2)); OUT_BATCH(GEN7_3DPRIM_INSTANCE_COUNT); - OUT_BATCH(prim->num_instances); + OUT_BATCH(num_instances); OUT_BATCH(GEN7_3DPRIM_START_VERTEX); OUT_BATCH(0); OUT_BATCH(GEN7_3DPRIM_BASE_VERTEX); @@ -270,8 +271,8 @@ brw_emit_prim(struct brw_context *brw, } OUT_BATCH(verts_per_instance); OUT_BATCH(start_vertex_location); - OUT_BATCH(prim->num_instances); - OUT_BATCH(prim->base_instance); + OUT_BATCH(num_instances); + OUT_BATCH(base_instance); OUT_BATCH(base_vertex_location); ADVANCE_BATCH(); @@ -899,7 +900,7 @@ brw_finish_drawing(struct gl_context *ctx) */ static void gen9_emit_preempt_wa(struct brw_context *brw, - const struct _mesa_prim *prim) + const struct _mesa_prim *prim, GLuint num_instances) { bool object_preemption = true; ASSERTED const struct gen_device_info *devinfo = &brw->screen->devinfo; @@ -944,7 +945,7 @@ gen9_emit_preempt_wa(struct brw_context *brw, * * WA: Disable preemption when using instanceing. */ - if (prim->num_instances > 1) + if (num_instances > 1) object_preemption = false; brw_enable_obj_preemption(brw, object_preemption); @@ -958,6 +959,7 @@ brw_draw_single_prim(struct gl_context *ctx, const struct _mesa_prim *prim, unsigned prim_id, bool is_indexed, + GLuint num_instances, GLuint base_instance, struct brw_transform_feedback_object *xfb_obj, unsigned stream, GLsizeiptr indirect_offset) @@ -980,12 +982,12 @@ brw_draw_single_prim(struct gl_context *ctx, intel_batchbuffer_save_state(brw); fail_next = intel_batchbuffer_saved_state_is_empty(brw); - if (brw->num_instances != prim->num_instances || + if (brw->num_instances != num_instances || brw->basevertex != prim->basevertex || - brw->baseinstance != prim->base_instance) { - brw->num_instances = prim->num_instances; + brw->baseinstance != base_instance) { + brw->num_instances = num_instances; brw->basevertex = prim->basevertex; - brw->baseinstance = prim->base_instance; + brw->baseinstance = base_instance; if (prim_id > 0) { /* For i == 0 we just did this before the loop */ brw->ctx.NewDriverState |= BRW_NEW_VERTICES; brw_merge_inputs(brw); @@ -999,7 +1001,7 @@ brw_draw_single_prim(struct gl_context *ctx, */ const int new_firstvertex = is_indexed ? prim->basevertex : prim->start; - const int new_baseinstance = prim->base_instance; + const int new_baseinstance = base_instance; const struct brw_vs_prog_data *vs_prog_data = brw_vs_prog_data(brw->vs.base.prog_data); if (prim_id > 0) { @@ -1068,10 +1070,11 @@ retry: } if (devinfo->gen == 9) - gen9_emit_preempt_wa(brw, prim); + gen9_emit_preempt_wa(brw, prim, num_instances); - brw_emit_prim(brw, prim, brw->primitive, is_indexed, xfb_obj, stream, - is_indirect, indirect_offset); + brw_emit_prim(brw, prim, brw->primitive, is_indexed, num_instances, + base_instance, xfb_obj, stream, is_indirect, + indirect_offset); brw->batch.no_wrap = false; @@ -1108,6 +1111,8 @@ brw_draw_prims(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *gl_xfb_obj, unsigned stream) { @@ -1121,7 +1126,8 @@ brw_draw_prims(struct gl_context *ctx, return; /* Handle primitive restart if needed */ - if (brw_handle_primitive_restart(ctx, prims, nr_prims, ib)) { + if (brw_handle_primitive_restart(ctx, prims, nr_prims, ib, num_instances, + base_instance)) { /* The draw was handled, so we can exit now */ return; } @@ -1134,8 +1140,8 @@ brw_draw_prims(struct gl_context *ctx, _mesa_enum_to_string(ctx->RenderMode)); _swsetup_Wakeup(ctx); _tnl_wakeup(ctx); - _tnl_draw(ctx, prims, nr_prims, ib, - index_bounds_valid, min_index, max_index, NULL, 0); + _tnl_draw(ctx, prims, nr_prims, ib, index_bounds_valid, min_index, + max_index, num_instances, base_instance, NULL, 0); return; } @@ -1187,7 +1193,8 @@ brw_draw_prims(struct gl_context *ctx, brw->predicate.state = BRW_PREDICATE_STATE_USE_BIT; } - brw_draw_single_prim(ctx, &prims[i], i, ib != NULL, xfb_obj, stream, + brw_draw_single_prim(ctx, &prims[i], i, ib != NULL, num_instances, + base_instance, xfb_obj, stream, brw->draw.draw_indirect_offset + brw->draw.draw_indirect_stride * i); } @@ -1239,9 +1246,7 @@ brw_draw_indirect_prims(struct gl_context *ctx, brw->draw.draw_indirect_data = indirect_data; - brw_draw_prims(ctx, prim, draw_count, - ib, false, 0, ~0, - NULL, 0); + brw_draw_prims(ctx, prim, draw_count, ib, false, 0, ~0, 0, 0, NULL, 0); brw->draw.draw_indirect_data = NULL; free(prim); diff --git a/src/mesa/drivers/dri/i965/brw_draw.h b/src/mesa/drivers/dri/i965/brw_draw.h index ddbf6238a17..c2e7d26f3ca 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.h +++ b/src/mesa/drivers/dri/i965/brw_draw.h @@ -51,6 +51,8 @@ void brw_draw_prims(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *unused_tfb_object, unsigned stream); @@ -65,7 +67,8 @@ GLboolean brw_handle_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, - const struct _mesa_index_buffer *ib); + const struct _mesa_index_buffer *ib, + GLuint num_instances, GLuint base_instance); void brw_draw_indirect_prims(struct gl_context *ctx, diff --git a/src/mesa/drivers/dri/i965/brw_primitive_restart.c b/src/mesa/drivers/dri/i965/brw_primitive_restart.c index 158f9477939..c539cd78476 100644 --- a/src/mesa/drivers/dri/i965/brw_primitive_restart.c +++ b/src/mesa/drivers/dri/i965/brw_primitive_restart.c @@ -130,7 +130,8 @@ GLboolean brw_handle_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, - const struct _mesa_index_buffer *ib) + const struct _mesa_index_buffer *ib, + GLuint num_instances, GLuint base_instance) { struct brw_context *brw = brw_context(ctx); @@ -162,7 +163,8 @@ brw_handle_primitive_restart(struct gl_context *ctx, /* Cut index should work for primitive restart, so use it */ brw->prim_restart.enable_cut_index = true; - brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, NULL, 0); + brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, + num_instances, base_instance, NULL, 0); brw->prim_restart.enable_cut_index = false; } else { /* Not all the primitive draw modes are supported by the cut index, @@ -173,8 +175,8 @@ brw_handle_primitive_restart(struct gl_context *ctx, /* Clear this to make the draw direct. */ brw->draw.draw_indirect_data = NULL; - vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, - indirect_data, + vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, num_instances, + base_instance, indirect_data, brw->draw.draw_indirect_offset); } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c index d365f7a531a..83fb9596d58 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c @@ -244,6 +244,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream); @@ -251,7 +252,8 @@ static GLboolean vbo_maybe_split(struct gl_context *ctx, const struct tnl_vertex_array *arrays, const struct _mesa_prim *prims, GLuint nr_prims, const struct _mesa_index_buffer *ib, - GLuint min_index, GLuint max_index) + GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance) { struct nouveau_context *nctx = to_nouveau_context(ctx); struct nouveau_render_state *render = to_render_state(ctx); @@ -277,7 +279,8 @@ vbo_maybe_split(struct gl_context *ctx, const struct tnl_vertex_array *arrays, }; _tnl_split_prims(ctx, arrays, prims, nr_prims, ib, min_index, - max_index, TAG(vbo_render_prims), &limits); + max_index, num_instances, base_instance, + TAG(vbo_render_prims), &limits); return GL_TRUE; } @@ -481,6 +484,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -494,7 +498,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx, vbo_choose_attrs(ctx, arrays); if (vbo_maybe_split(ctx, arrays, prims, nr_prims, ib, min_index, - max_index)) + max_index, num_instances, base_instance)) return; vbo_init_arrays(ctx, ib, arrays); @@ -518,6 +522,7 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -528,11 +533,13 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx, if (nctx->fallback == HWTNL) TAG(vbo_render_prims)(ctx, arrays, prims, nr_prims, ib, index_bounds_valid, min_index, max_index, - tfb_vertcount, stream); + num_instances, base_instance, + tfb_vertcount, stream); if (nctx->fallback == SWTNL) _tnl_draw_prims(ctx, arrays, prims, nr_prims, ib, index_bounds_valid, min_index, max_index, + num_instances, base_instance, tfb_vertcount, stream); } @@ -542,6 +549,7 @@ TAG(vbo_draw)(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -551,6 +559,7 @@ TAG(vbo_draw)(struct gl_context *ctx, TAG(vbo_check_render_prims)(ctx, arrays, prims, nr_prims, ib, index_bounds_valid, min_index, max_index, + num_instances, base_instance, tfb_vertcount, stream); } diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 824f320668b..3fd47ba6f9e 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -528,6 +528,8 @@ struct dd_function_table { * \param index_bounds_valid are min_index and max_index valid? * \param min_index lowest vertex index used * \param max_index highest vertex index used + * \param num_instances instance count from ARB_draw_instanced + * \param base_instance base instance from ARB_base_instance * \param tfb_vertcount if non-null, indicates which transform feedback * object has the vertex count. * \param tfb_stream If called via DrawTransformFeedbackStream, specifies @@ -542,6 +544,7 @@ struct dd_function_table { const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned tfb_stream); diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index 7fb57f67290..02efab74db1 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -362,15 +362,14 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, .begin = 1, .end = 1, .mode = mode, - .num_instances = numInstances, - .base_instance = baseInstance, .draw_id = drawID, .start = start, .count = count, }; ctx->Driver.Draw(ctx, &prim, 1, NULL, - GL_TRUE, start, start + count - 1, NULL, 0); + GL_TRUE, start, start + count - 1, + numInstances, baseInstance, NULL, 0); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { _mesa_flush(ctx); @@ -773,8 +772,6 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, GLenum mode, prim.start = 0; prim.count = count; prim.basevertex = basevertex; - prim.num_instances = numInstances; - prim.base_instance = baseInstance; prim.draw_id = 0; /* Need to give special consideration to rendering a range of @@ -809,7 +806,8 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, GLenum mode, */ ctx->Driver.Draw(ctx, &prim, 1, &ib, - index_bounds_valid, start, end, NULL, 0); + index_bounds_valid, start, end, + numInstances, baseInstance, NULL, 0); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { _mesa_flush(ctx); @@ -1229,8 +1227,6 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode, prim[i].start = ((uintptr_t) indices[i] - min_index_ptr) / index_type_size; prim[i].count = count[i]; - prim[i].num_instances = 1; - prim[i].base_instance = 0; prim[i].draw_id = i; if (basevertex != NULL) prim[i].basevertex = basevertex[i]; @@ -1239,7 +1235,7 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode, } ctx->Driver.Draw(ctx, prim, primcount, &ib, - false, 0, ~0, NULL, 0); + false, 0, ~0, 1, 0, NULL, 0); } else { /* render one prim at a time */ @@ -1256,15 +1252,13 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode, prim[0].mode = mode; prim[0].start = 0; prim[0].count = count[i]; - prim[0].num_instances = 1; - prim[0].base_instance = 0; prim[0].draw_id = i; if (basevertex != NULL) prim[0].basevertex = basevertex[i]; else prim[0].basevertex = 0; - ctx->Driver.Draw(ctx, prim, 1, &ib, false, 0, ~0, NULL, 0); + ctx->Driver.Draw(ctx, prim, 1, &ib, false, 0, ~0, 1, 0, NULL, 0); } } @@ -1374,14 +1368,13 @@ _mesa_draw_transform_feedback(struct gl_context *ctx, GLenum mode, prim.begin = 1; prim.end = 1; prim.mode = mode; - prim.num_instances = numInstances; - prim.base_instance = 0; /* Maybe we should do some primitive splitting for primitive restart * (like in DrawArrays), but we have no way to know how many vertices * will be rendered. */ - ctx->Driver.Draw(ctx, &prim, 1, NULL, GL_FALSE, 0, ~0, obj, stream); + ctx->Driver.Draw(ctx, &prim, 1, NULL, GL_FALSE, 0, ~0, numInstances, 0, + obj, stream); if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) { _mesa_flush(ctx); diff --git a/src/mesa/main/draw.h b/src/mesa/main/draw.h index 1363ff58df2..3a7dedea529 100644 --- a/src/mesa/main/draw.h +++ b/src/mesa/main/draw.h @@ -61,8 +61,6 @@ struct _mesa_prim GLuint start; GLuint count; GLint basevertex; - GLuint num_instances; - GLuint base_instance; GLuint draw_id; }; diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c index 7a009d3a0d4..f45e616abfa 100644 --- a/src/mesa/state_tracker/st_cb_rasterpos.c +++ b/src/mesa/state_tracker/st_cb_rasterpos.c @@ -209,8 +209,6 @@ new_draw_rastpos_stage(struct gl_context *ctx, struct draw_context *draw) rs->prim.end = 1; rs->prim.start = 0; rs->prim.count = 1; - rs->prim.num_instances = 1; - rs->prim.base_instance = 0; return rs; } @@ -262,7 +260,7 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4]) _mesa_set_draw_vao(ctx, rs->VAO, VERT_BIT_POS); /* Draw the point. */ - st_feedback_draw_vbo(ctx, &rs->prim, 1, NULL, GL_TRUE, 0, 1, + st_feedback_draw_vbo(ctx, &rs->prim, 1, NULL, GL_TRUE, 0, 1, 1, 0, NULL, 0); /* restore draw's rasterization stage depending on rendermode */ diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index d0a27a01d26..b370e552e79 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -172,6 +172,8 @@ st_draw_vbo(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -188,6 +190,8 @@ st_draw_vbo(struct gl_context *ctx, info.indirect = NULL; info.count_from_stream_output = NULL; info.restart_index = 0; + info.start_instance = base_instance; + info.instance_count = num_instances; if (ib) { struct gl_buffer_object *bufobj = ib->obj; @@ -244,8 +248,6 @@ st_draw_vbo(struct gl_context *ctx, info.mode = translate_prim(ctx, prims[i].mode); info.start = start + prims[i].start; - info.start_instance = prims[i].base_instance; - info.instance_count = prims[i].num_instances; info.index_bias = prims[i].basevertex; info.drawid = prims[i].draw_id; if (!ib) { diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h index 5c1dd033cd4..d04277a2325 100644 --- a/src/mesa/state_tracker/st_draw.h +++ b/src/mesa/state_tracker/st_draw.h @@ -55,6 +55,8 @@ st_feedback_draw_vbo(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream); diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 16c88efa2ae..14c809c8a09 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -100,6 +100,8 @@ st_feedback_draw_vbo(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -419,6 +421,9 @@ st_feedback_draw_vbo(struct gl_context *ctx, } draw_set_images(draw, PIPE_SHADER_VERTEX, images, prog->info.num_images); + info.start_instance = base_instance; + info.instance_count = num_instances; + /* draw here */ for (i = 0; i < nr_prims; i++) { info.count = prims[i].count; @@ -428,8 +433,6 @@ st_feedback_draw_vbo(struct gl_context *ctx, info.mode = prims[i].mode; info.start = start + prims[i].start; - info.start_instance = prims[i].base_instance; - info.instance_count = prims[i].num_instances; info.index_bias = prims[i].basevertex; info.drawid = prims[i].draw_id; if (!ib) { diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c index a2388b9b14f..b39c8443814 100644 --- a/src/mesa/tnl/t_draw.c +++ b/src/mesa/tnl/t_draw.c @@ -434,6 +434,8 @@ void _tnl_draw_prims(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -469,7 +471,7 @@ void _tnl_draw_prims(struct gl_context *ctx, /* We always translate away calls with min_index != 0. */ t_rebase_prims( ctx, arrays, prim, nr_prims, ib, - min_index, max_index, + min_index, max_index, num_instances, base_instance, _tnl_draw_prims ); return; } @@ -488,6 +490,7 @@ void _tnl_draw_prims(struct gl_context *ctx, */ _tnl_split_prims( ctx, arrays, prim, nr_prims, ib, 0, max_index + prim->basevertex, + num_instances, base_instance, _tnl_draw_prims, &limits ); } @@ -499,6 +502,8 @@ void _tnl_draw_prims(struct gl_context *ctx, GLuint nr_bo = 0; GLuint inst; + assert(num_instances > 0); + for (i = 0; i < nr_prims;) { GLuint this_nr_prims; @@ -512,12 +517,10 @@ void _tnl_draw_prims(struct gl_context *ctx, break; } - assert(prim[i].num_instances > 0); - /* Binding inputs may imply mapping some vertex buffer objects. * They will need to be unmapped below. */ - for (inst = 0; inst < prim[i].num_instances; inst++) { + for (inst = 0; inst < num_instances; inst++) { bind_prims(ctx, &prim[i], this_nr_prims); bind_inputs(ctx, arrays, max_index + prim[i].basevertex + 1, @@ -637,6 +640,7 @@ _tnl_draw(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream) { @@ -646,7 +650,7 @@ _tnl_draw(struct gl_context *ctx, _tnl_draw_prims(ctx, arrays, prim, nr_prims, ib, index_bounds_valid, min_index, max_index, - tfb_vertcount, stream); + num_instances, base_instance, tfb_vertcount, stream); } diff --git a/src/mesa/tnl/t_rebase.c b/src/mesa/tnl/t_rebase.c index 24abcef98a2..06d67620f63 100644 --- a/src/mesa/tnl/t_rebase.c +++ b/src/mesa/tnl/t_rebase.c @@ -110,6 +110,8 @@ void t_rebase_prims( struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw ) { struct gl_array_attributes tmp_attribs[VERT_ATTRIB_MAX]; @@ -242,6 +244,7 @@ void t_rebase_prims( struct gl_context *ctx, GL_TRUE, 0, max_index - min_index, + num_instances, base_instance, NULL, 0); free(tmp_indices); diff --git a/src/mesa/tnl/t_rebase.h b/src/mesa/tnl/t_rebase.h index d0aa9e18905..b596d93995b 100644 --- a/src/mesa/tnl/t_rebase.h +++ b/src/mesa/tnl/t_rebase.h @@ -34,6 +34,8 @@ void t_rebase_prims( struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw ); #endif diff --git a/src/mesa/tnl/t_split.c b/src/mesa/tnl/t_split.c index d7aac10e4c8..9c59380c831 100644 --- a/src/mesa/tnl/t_split.c +++ b/src/mesa/tnl/t_split.c @@ -106,6 +106,8 @@ _tnl_split_prims(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw, const struct split_limits *limits) { @@ -135,7 +137,8 @@ _tnl_split_prims(struct gl_context *ctx, * individual primitives. */ _tnl_split_inplace(ctx, arrays, prim, nr_prims, ib, - min_index, max_index, draw, limits); + min_index, max_index, num_instances, + base_instance, draw, limits); } else { /* Why were we called? */ @@ -149,7 +152,8 @@ _tnl_split_prims(struct gl_context *ctx, * otherwise try to split the individual primitives. */ _tnl_split_inplace(ctx, arrays, prim, nr_prims, ib, - min_index, max_index, draw, limits); + min_index, max_index, num_instances, + base_instance, draw, limits); } else { /* Why were we called? */ diff --git a/src/mesa/tnl/t_split.h b/src/mesa/tnl/t_split.h index 49017e5dfb8..7634e553a87 100644 --- a/src/mesa/tnl/t_split.h +++ b/src/mesa/tnl/t_split.h @@ -57,6 +57,8 @@ _tnl_split_inplace(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw, const struct split_limits *limits); diff --git a/src/mesa/tnl/t_split_copy.c b/src/mesa/tnl/t_split_copy.c index 511e46c1e2f..45b20fbd49c 100644 --- a/src/mesa/tnl/t_split_copy.c +++ b/src/mesa/tnl/t_split_copy.c @@ -211,6 +211,8 @@ flush(struct copy_context *copy) GL_TRUE, 0, copy->dstbuf_nr - 1, + 1, + 0, NULL, 0); /* Reset all pointers: @@ -237,7 +239,6 @@ begin(struct copy_context *copy, GLenum mode, GLboolean begin_flag) prim->mode = mode; prim->begin = begin_flag; - prim->num_instances = 1; } diff --git a/src/mesa/tnl/t_split_inplace.c b/src/mesa/tnl/t_split_inplace.c index 048f87309ee..d9ea52dfaf1 100644 --- a/src/mesa/tnl/t_split_inplace.c +++ b/src/mesa/tnl/t_split_inplace.c @@ -49,6 +49,8 @@ struct split_context { const struct _mesa_index_buffer *ib; GLuint min_index; GLuint max_index; + GLuint num_instances; + GLuint base_instance; tnl_draw_func draw; const struct split_limits *limits; @@ -93,6 +95,8 @@ flush_vertex( struct split_context *split) !split->ib, split->min_index, split->max_index, + split->num_instances, + split->base_instance, NULL, 0); split->dstprim_nr = 0; @@ -190,8 +194,6 @@ split_prims(struct split_context *split) outprim->end = (nr == remaining && prim->end); outprim->start = prim->start + j; outprim->count = nr; - outprim->num_instances = prim->num_instances; - outprim->base_instance = prim->base_instance; update_index_bounds(split, outprim); @@ -232,8 +234,6 @@ split_prims(struct split_context *split) tmpprim = *prim; tmpprim.start = 0; tmpprim.count = count; - tmpprim.num_instances = 1; - tmpprim.base_instance = 0; flush_vertex(split); @@ -270,6 +270,8 @@ _tnl_split_inplace(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw, const struct split_limits *limits) { @@ -286,6 +288,8 @@ _tnl_split_inplace(struct gl_context *ctx, /* Empty interval, makes calculations simpler. */ split.min_index = ~0; split.max_index = 0; + split.num_instances = num_instances; + split.base_instance = base_instance; split.draw = draw; split.limits = limits; diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h index c3927536b8b..4bf8ee20f68 100644 --- a/src/mesa/tnl/tnl.h +++ b/src/mesa/tnl/tnl.h @@ -107,6 +107,8 @@ _tnl_draw_prims(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream); @@ -115,6 +117,7 @@ _tnl_draw(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned stream); extern void @@ -172,6 +175,8 @@ typedef void (*tnl_draw_func)(struct gl_context *ctx, GLboolean index_bounds_valid, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, struct gl_transform_feedback_object *tfb_vertcount, unsigned tfb_stream); @@ -198,6 +203,8 @@ _tnl_split_prims(struct gl_context *ctx, const struct _mesa_index_buffer *ib, GLuint min_index, GLuint max_index, + GLuint num_instances, + GLuint base_instance, tnl_draw_func draw, const struct split_limits *limits); diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index a03a4cec70b..688e8fd83eb 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -97,6 +97,7 @@ vbo_sw_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib, + GLuint num_instances, GLuint base_instance, struct gl_buffer_object *indirect, GLsizeiptr indirect_offset); diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c index f1b1f8bff95..66ad8888bcd 100644 --- a/src/mesa/vbo/vbo_exec.c +++ b/src/mesa/vbo/vbo_exec.c @@ -191,9 +191,7 @@ vbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1) if (p0->start + p0->count != p1->start) return false; - assert(p0->basevertex == p1->basevertex && - p0->num_instances == p1->num_instances && - p0->base_instance == p1->base_instance); + assert(p0->basevertex == p1->basevertex); /* can always merge subsequent GL_POINTS primitives */ if (p0->mode == GL_POINTS) diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index d724f4efe11..2f049ccd450 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -812,8 +812,6 @@ vbo_exec_Begin(GLenum mode) exec->vtx.prim[i].end = 0; exec->vtx.prim[i].start = exec->vtx.vert_count; exec->vtx.prim[i].count = 0; - exec->vtx.prim[i].num_instances = 1; - exec->vtx.prim[i].base_instance = 0; ctx->Driver.CurrentExecPrimitive = mode; diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index 10e330eb816..87e7db18d67 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -413,7 +413,7 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec) exec->vtx.vert_count); ctx->Driver.Draw(ctx, exec->vtx.prim, exec->vtx.prim_count, - NULL, GL_TRUE, 0, exec->vtx.vert_count - 1, + NULL, GL_TRUE, 0, exec->vtx.vert_count - 1, 1, 0, NULL, 0); /* Get new storage -- unless asked not to. */ diff --git a/src/mesa/vbo/vbo_primitive_restart.c b/src/mesa/vbo/vbo_primitive_restart.c index b4b3cdf8d4c..2b6bcd46e3e 100644 --- a/src/mesa/vbo/vbo_primitive_restart.c +++ b/src/mesa/vbo/vbo_primitive_restart.c @@ -164,6 +164,7 @@ vbo_sw_primitive_restart(struct gl_context *ctx, const struct _mesa_prim *prims, GLuint nr_prims, const struct _mesa_index_buffer *ib, + GLuint num_instances, GLuint base_instance, struct gl_buffer_object *indirect, GLsizeiptr indirect_offset) { @@ -200,10 +201,11 @@ vbo_sw_primitive_restart(struct gl_context *ctx, indirect_offset); new_prim.count = indirect_params[0]; - new_prim.num_instances = indirect_params[1]; new_prim.start = indirect_params[2]; new_prim.basevertex = indirect_params[3]; - new_prim.base_instance = indirect_params[4]; + + num_instances = indirect_params[1]; + base_instance = indirect_params[4]; new_ib = *ib; new_ib.count = new_prim.count; @@ -249,10 +251,12 @@ vbo_sw_primitive_restart(struct gl_context *ctx, (temp_prim.count == sub_prim->count)) { ctx->Driver.Draw(ctx, &temp_prim, 1, ib, GL_TRUE, sub_prim->min_index, sub_prim->max_index, + num_instances, base_instance, NULL, 0); } else { ctx->Driver.Draw(ctx, &temp_prim, 1, ib, GL_FALSE, -1, -1, + num_instances, base_instance, NULL, 0); } } diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index 8e7ab86bae1..1ef6043ad0c 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -739,8 +739,6 @@ wrap_buffers(struct gl_context *ctx) save->prims[0].end = 0; save->prims[0].start = 0; save->prims[0].count = 0; - save->prims[0].num_instances = 1; - save->prims[0].base_instance = 0; save->prim_count = 1; } @@ -1218,8 +1216,6 @@ vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode, save->prims[i].end = 0; save->prims[i].start = save->vert_count; save->prims[i].count = 0; - save->prims[i].num_instances = 1; - save->prims[i].base_instance = 0; save->no_current_update = no_current_update; diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index f6298ee2c9b..e193a5a32af 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -213,7 +213,7 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data) GLuint min_index = _vbo_save_get_min_index(node); GLuint max_index = _vbo_save_get_max_index(node); ctx->Driver.Draw(ctx, node->prims, node->prim_count, NULL, GL_TRUE, - min_index, max_index, NULL, 0); + min_index, max_index, 1, 0, NULL, 0); } } -- 2.30.2