diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 3e86def31c5..11d6e506ade 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -1259,7 +1259,7 @@ cso_restore_vertex_elements(struct cso_context *ctx) void cso_set_vertex_buffers(struct cso_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_trailing_count, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -1270,13 +1270,13 @@ cso_set_vertex_buffers(struct cso_context *ctx, return; if (vbuf) { - u_vbuf_set_vertex_buffers(vbuf, start_slot, count, unbind_trailing_count, + u_vbuf_set_vertex_buffers(vbuf, count, unbind_trailing_count, take_ownership, buffers); return; } struct pipe_context *pipe = ctx->base.pipe; - pipe->set_vertex_buffers(pipe, start_slot, count, unbind_trailing_count, + pipe->set_vertex_buffers(pipe, count, unbind_trailing_count, take_ownership, buffers); } @@ -1310,7 +1310,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx, /* Unbind all buffers in cso_context, because we'll use u_vbuf. */ unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count; if (unbind_vb_count) - pipe->set_vertex_buffers(pipe, 0, 0, unbind_vb_count, false, NULL); + pipe->set_vertex_buffers(pipe, 0, unbind_vb_count, false, NULL); /* Unset this to make sure the CSO is re-bound on the next use. */ ctx->velements = NULL; @@ -1321,7 +1321,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx, } if (vb_count || unbind_trailing_vb_count) { - u_vbuf_set_vertex_buffers(vbuf, 0, vb_count, + u_vbuf_set_vertex_buffers(vbuf, vb_count, unbind_trailing_vb_count, take_ownership, vbuffers); } @@ -1333,7 +1333,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx, /* Unbind all buffers in u_vbuf, because we'll use cso_context. */ unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count; if (unbind_vb_count) - u_vbuf_set_vertex_buffers(vbuf, 0, 0, unbind_vb_count, false, NULL); + u_vbuf_set_vertex_buffers(vbuf, 0, unbind_vb_count, false, NULL); /* Unset this to make sure the CSO is re-bound on the next use. */ u_vbuf_unset_vertex_elements(vbuf); @@ -1344,7 +1344,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx, } if (vb_count || unbind_trailing_vb_count) { - pipe->set_vertex_buffers(pipe, 0, vb_count, unbind_trailing_vb_count, + pipe->set_vertex_buffers(pipe, vb_count, unbind_trailing_vb_count, take_ownership, vbuffers); } cso_set_vertex_elements_direct(ctx, velems); @@ -1730,7 +1730,7 @@ cso_restore_state(struct cso_context *cso, unsigned unbind) if (state_mask & CSO_BIT_VERTEX_ELEMENTS) cso_restore_vertex_elements(cso); if (unbind & CSO_UNBIND_VERTEX_BUFFER0) - cso->base.pipe->set_vertex_buffers(cso->base.pipe, 0, 0, 1, false, NULL); + cso->base.pipe->set_vertex_buffers(cso->base.pipe, 0, 1, false, NULL); if (state_mask & CSO_BIT_STREAM_OUTPUTS) cso_restore_stream_outputs(cso); if (state_mask & CSO_BIT_PAUSE_QUERIES) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index 3791984a84c..56e79236057 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -102,7 +102,7 @@ cso_set_vertex_elements(struct cso_context *ctx, const struct cso_velems_state *velems); void cso_set_vertex_buffers(struct cso_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_trailing_count, bool take_ownership, const struct pipe_vertex_buffer *buffers); diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index 9ddf91b4f7c..18df562e376 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -404,15 +404,15 @@ draw_set_viewport_states(struct draw_context *draw, void draw_set_vertex_buffers(struct draw_context *draw, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, const struct pipe_vertex_buffer *buffers) { - assert(start_slot + count <= PIPE_MAX_ATTRIBS); + assert(count <= PIPE_MAX_ATTRIBS); util_set_vertex_buffers_count(draw->pt.vertex_buffer, &draw->pt.nr_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, false); } diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index 737bc340802..e4a252c86e6 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -320,7 +320,7 @@ void draw_delete_mesh_shader(struct draw_context *draw, */ void draw_set_vertex_buffers(struct draw_context *draw, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, const struct pipe_vertex_buffer *buffers); diff --git a/src/gallium/auxiliary/driver_ddebug/dd_context.c b/src/gallium/auxiliary/driver_ddebug/dd_context.c index cddea36367d..f7991708f01 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_context.c +++ b/src/gallium/auxiliary/driver_ddebug/dd_context.c @@ -570,7 +570,7 @@ dd_context_set_shader_buffers(struct pipe_context *_pipe, static void dd_context_set_vertex_buffers(struct pipe_context *_pipe, - unsigned start, unsigned num_buffers, + unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -578,11 +578,11 @@ dd_context_set_vertex_buffers(struct pipe_context *_pipe, struct dd_context *dctx = dd_context(_pipe); struct pipe_context *pipe = dctx->pipe; - safe_memcpy(&dctx->draw_state.vertex_buffers[start], buffers, + safe_memcpy(&dctx->draw_state.vertex_buffers[0], buffers, sizeof(buffers[0]) * num_buffers); - safe_memcpy(&dctx->draw_state.vertex_buffers[start + num_buffers], NULL, + safe_memcpy(&dctx->draw_state.vertex_buffers[num_buffers], NULL, sizeof(buffers[0]) * unbind_num_trailing_slots); - pipe->set_vertex_buffers(pipe, start, num_buffers, + pipe->set_vertex_buffers(pipe, num_buffers, unbind_num_trailing_slots, take_ownership, buffers); } diff --git a/src/gallium/auxiliary/driver_noop/noop_state.c b/src/gallium/auxiliary/driver_noop/noop_state.c index 74069401b85..f93039b1d2c 100644 --- a/src/gallium/auxiliary/driver_noop/noop_state.c +++ b/src/gallium/auxiliary/driver_noop/noop_state.c @@ -214,7 +214,7 @@ static void noop_delete_state(struct pipe_context *ctx, void *state) } static void noop_set_vertex_buffers(struct pipe_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c index 74f228b5d15..5902a81d003 100644 --- a/src/gallium/auxiliary/driver_trace/tr_context.c +++ b/src/gallium/auxiliary/driver_trace/tr_context.c @@ -1260,7 +1260,7 @@ trace_context_set_sampler_views(struct pipe_context *_pipe, static void trace_context_set_vertex_buffers(struct pipe_context *_pipe, - unsigned start_slot, unsigned num_buffers, + unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -1271,7 +1271,6 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe, trace_dump_call_begin("pipe_context", "set_vertex_buffers"); trace_dump_arg(ptr, pipe); - trace_dump_arg(uint, start_slot); trace_dump_arg(uint, num_buffers); trace_dump_arg(uint, unbind_num_trailing_slots); trace_dump_arg(bool, take_ownership); @@ -1280,7 +1279,7 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe, trace_dump_struct_array(vertex_buffer, buffers, num_buffers); trace_dump_arg_end(); - pipe->set_vertex_buffers(pipe, start_slot, num_buffers, + pipe->set_vertex_buffers(pipe, num_buffers, unbind_num_trailing_slots, take_ownership, buffers); diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index 20154bd02a6..68118eadf36 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -113,7 +113,7 @@ hud_draw_colored_prims(struct hud_context *hud, unsigned prim, u_upload_unmap(hud->pipe->stream_uploader); vbuffer.stride = 2 * sizeof(float); - cso_set_vertex_buffers(cso, 0, 1, 0, false, &vbuffer); + cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); pipe_resource_reference(&vbuffer.buffer.resource, NULL); cso_set_fragment_shader_handle(hud->cso, hud->fs_color); cso_draw_arrays(cso, prim, 0, num_vertices); @@ -603,7 +603,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, &hud->constbuf); - cso_set_vertex_buffers(cso, 0, 1, 0, false, &hud->bg.vbuf); + cso_set_vertex_buffers(cso, 1, 0, false, &hud->bg.vbuf); cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->bg.num_vertices); } pipe_resource_reference(&hud->bg.vbuf.buffer.resource, NULL); @@ -611,7 +611,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) /* draw accumulated vertices for text */ if (hud->text.num_vertices) { cso_set_vertex_shader_handle(cso, hud->vs_text); - cso_set_vertex_buffers(cso, 0, 1, 0, false, &hud->text.vbuf); + cso_set_vertex_buffers(cso, 1, 0, false, &hud->text.vbuf); cso_set_fragment_shader_handle(hud->cso, hud->fs_text); cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->text.num_vertices); } @@ -635,7 +635,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) if (hud->whitelines.num_vertices) { cso_set_vertex_shader_handle(cso, hud->vs_color); - cso_set_vertex_buffers(cso, 0, 1, 0, false, &hud->whitelines.vbuf); + cso_set_vertex_buffers(cso, 1, 0, false, &hud->whitelines.vbuf); cso_set_fragment_shader_handle(hud->cso, hud->fs_color); cso_draw_arrays(cso, MESA_PRIM_LINES, 0, hud->whitelines.num_vertices); } diff --git a/src/gallium/auxiliary/postprocess/pp_run.c b/src/gallium/auxiliary/postprocess/pp_run.c index 0d1a801ba93..565aab720a4 100644 --- a/src/gallium/auxiliary/postprocess/pp_run.c +++ b/src/gallium/auxiliary/postprocess/pp_run.c @@ -293,7 +293,7 @@ pp_filter_misc_state(struct pp_program *p) void pp_filter_draw(struct pp_program *p) { - util_draw_vertex_buffer(p->pipe, p->cso, p->vbuf, 0, 0, + util_draw_vertex_buffer(p->pipe, p->cso, p->vbuf, 0, MESA_PRIM_QUADS, 4, 2); } diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index da66556baaa..860e6ce0a3f 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -315,14 +315,13 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe) } ctx->base.cb_slot = 0; /* 0 for now */ - ctx->base.vb_slot = 0; /* 0 for now */ /* vertex elements states */ memset(&velem[0], 0, sizeof(velem[0]) * 2); for (i = 0; i < 2; i++) { velem[i].src_offset = i * 4 * sizeof(float); velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; - velem[i].vertex_buffer_index = ctx->base.vb_slot; + velem[i].vertex_buffer_index = 0; } ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); @@ -336,7 +335,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe) for (i = 0; i < 4; i++) { velem[0].src_format = formats[i]; - velem[0].vertex_buffer_index = ctx->base.vb_slot; + velem[0].vertex_buffer_index = 0; ctx->velem_state_readbuf[i] = pipe->create_vertex_elements_state(pipe, 1, &velem[0]); } @@ -643,7 +642,7 @@ void util_blitter_restore_vertex_states(struct blitter_context *blitter) /* Vertex buffer. */ if (ctx->base.saved_vertex_buffer.buffer.resource) { - pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, true, + pipe->set_vertex_buffers(pipe, 1, 0, true, &ctx->base.saved_vertex_buffer); ctx->base.saved_vertex_buffer.buffer.resource = NULL; } @@ -1410,7 +1409,7 @@ static void blitter_draw(struct blitter_context_priv *ctx, return; u_upload_unmap(pipe->stream_uploader); - pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, false, &vb); + pipe->set_vertex_buffers(pipe, 1, 0, false, &vb); pipe->bind_vertex_elements_state(pipe, vertex_elements_cso); pipe->bind_vs_state(pipe, get_vs(&ctx->base)); @@ -2634,7 +2633,7 @@ void util_blitter_clear_buffer(struct blitter_context *blitter, blitter_check_saved_vertex_states(ctx); blitter_disable_render_cond(ctx); - pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, false, &vb); + pipe->set_vertex_buffers(pipe, 1, 0, false, &vb); pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf[num_channels-1]); bind_vs_pos_only(ctx, num_channels); diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h index 664a3060df9..bd4cfdc52ae 100644 --- a/src/gallium/auxiliary/util/u_blitter.h +++ b/src/gallium/auxiliary/util/u_blitter.h @@ -129,7 +129,6 @@ struct blitter_context unsigned cb_slot; struct pipe_constant_buffer saved_fs_constant_buffer; - unsigned vb_slot; struct pipe_vertex_buffer saved_vertex_buffer; unsigned saved_num_so_targets; @@ -537,7 +536,7 @@ util_blitter_save_vertex_buffer_slot(struct blitter_context *blitter, struct pipe_vertex_buffer *vertex_buffers) { pipe_vertex_buffer_reference(&blitter->saved_vertex_buffer, - &vertex_buffers[blitter->vb_slot]); + &vertex_buffers[0]); } static inline void diff --git a/src/gallium/auxiliary/util/u_draw_quad.c b/src/gallium/auxiliary/util/u_draw_quad.c index b30b5f95fae..72c4fa2f757 100644 --- a/src/gallium/auxiliary/util/u_draw_quad.c +++ b/src/gallium/auxiliary/util/u_draw_quad.c @@ -42,7 +42,6 @@ void util_draw_vertex_buffer(struct pipe_context *pipe, struct cso_context *cso, struct pipe_resource *vbuf, - unsigned vbuf_slot, unsigned offset, enum mesa_prim prim_type, unsigned num_verts, @@ -61,10 +60,10 @@ util_draw_vertex_buffer(struct pipe_context *pipe, /* note: vertex elements already set by caller */ if (cso) { - cso_set_vertex_buffers(cso, vbuf_slot, 1, 0, false, &vbuffer); + cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_draw_arrays(cso, prim_type, 0, num_verts); } else { - pipe->set_vertex_buffers(pipe, vbuf_slot, 1, 0, false, &vbuffer); + pipe->set_vertex_buffers(pipe, 1, 0, false, &vbuffer); util_draw_arrays(pipe, prim_type, 0, num_verts); } } @@ -89,6 +88,6 @@ util_draw_user_vertex_buffer(struct cso_context *cso, void *buffer, /* note: vertex elements already set by caller */ - cso_set_vertex_buffers(cso, 0, 1, 0, false, &vbuffer); + cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_draw_arrays(cso, prim_type, 0, num_verts); } diff --git a/src/gallium/auxiliary/util/u_draw_quad.h b/src/gallium/auxiliary/util/u_draw_quad.h index edbc318e8b8..bb814d68b2a 100644 --- a/src/gallium/auxiliary/util/u_draw_quad.h +++ b/src/gallium/auxiliary/util/u_draw_quad.h @@ -41,11 +41,11 @@ extern "C" { struct pipe_resource; struct cso_context; -extern void +extern void util_draw_vertex_buffer(struct pipe_context *pipe, struct cso_context *cso, - struct pipe_resource *vbuf, unsigned vbuf_slot, - unsigned offset, enum mesa_prim prim_type, - unsigned num_attribs, unsigned num_verts); + struct pipe_resource *vbuf, unsigned offset, + enum mesa_prim prim_type, unsigned num_attribs, + unsigned num_verts); void util_draw_user_vertex_buffer(struct cso_context *cso, void *buffer, diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c index d0d610ee324..0dc28d0896b 100644 --- a/src/gallium/auxiliary/util/u_helpers.c +++ b/src/gallium/auxiliary/util/u_helpers.c @@ -47,16 +47,14 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst, uint32_t *enabled_buffers, const struct pipe_vertex_buffer *src, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership) { unsigned i; uint32_t bitmask = 0; - dst += start_slot; - - *enabled_buffers &= ~u_bit_consecutive(start_slot, count); + *enabled_buffers &= ~BITFIELD_MASK(count); if (src) { for (i = 0; i < count; i++) { @@ -72,7 +70,7 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst, /* Copy over the other members of pipe_vertex_buffer. */ memcpy(dst, src, count * sizeof(struct pipe_vertex_buffer)); - *enabled_buffers |= bitmask << start_slot; + *enabled_buffers |= bitmask; } else { /* Unreference the buffers. */ @@ -91,7 +89,7 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst, void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, unsigned *dst_count, const struct pipe_vertex_buffer *src, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership) { @@ -103,7 +101,7 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, enabled_buffers |= (1ull << i); } - util_set_vertex_buffers_mask(dst, &enabled_buffers, src, start_slot, + util_set_vertex_buffers_mask(dst, &enabled_buffers, src, count, unbind_num_trailing_slots, take_ownership); diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h index f19a07be361..4299e595535 100644 --- a/src/gallium/auxiliary/util/u_helpers.h +++ b/src/gallium/auxiliary/util/u_helpers.h @@ -40,14 +40,14 @@ extern "C" { void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst, uint32_t *enabled_buffers, const struct pipe_vertex_buffer *src, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership); void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, unsigned *dst_count, const struct pipe_vertex_buffer *src, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership); diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index c37ae251258..19b4fea0b2c 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -2039,7 +2039,7 @@ tc_set_shader_buffers(struct pipe_context *_pipe, struct tc_vertex_buffers { struct tc_call_base base; - uint8_t start, count; + uint8_t count; uint8_t unbind_num_trailing_slots; struct pipe_vertex_buffer slot[0]; /* more will be allocated if needed */ }; @@ -2051,22 +2051,20 @@ tc_call_set_vertex_buffers(struct pipe_context *pipe, void *call, uint64_t *last unsigned count = p->count; if (!count) { - pipe->set_vertex_buffers(pipe, p->start, 0, - p->unbind_num_trailing_slots, false, NULL); + pipe->set_vertex_buffers(pipe, 0, p->unbind_num_trailing_slots, false, NULL); return call_size(tc_vertex_buffers); } for (unsigned i = 0; i < count; i++) tc_assert(!p->slot[i].is_user_buffer); - pipe->set_vertex_buffers(pipe, p->start, count, - p->unbind_num_trailing_slots, true, p->slot); + pipe->set_vertex_buffers(pipe, count, p->unbind_num_trailing_slots, true, p->slot); return p->base.num_slots; } static void tc_set_vertex_buffers(struct pipe_context *_pipe, - unsigned start, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -2079,7 +2077,6 @@ tc_set_vertex_buffers(struct pipe_context *_pipe, if (count && buffers) { struct tc_vertex_buffers *p = tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, count); - p->start = start; p->count = count; p->unbind_num_trailing_slots = unbind_num_trailing_slots; @@ -2092,9 +2089,9 @@ tc_set_vertex_buffers(struct pipe_context *_pipe, struct pipe_resource *buf = buffers[i].buffer.resource; if (buf) { - tc_bind_buffer(tc, &tc->vertex_buffers[start + i], next, buf); + tc_bind_buffer(tc, &tc->vertex_buffers[i], next, buf); } else { - tc_unbind_buffer(&tc->vertex_buffers[start + i]); + tc_unbind_buffer(&tc->vertex_buffers[i]); } } } else { @@ -2110,23 +2107,22 @@ tc_set_vertex_buffers(struct pipe_context *_pipe, dst->buffer_offset = src->buffer_offset; if (buf) { - tc_bind_buffer(tc, &tc->vertex_buffers[start + i], next, buf); + tc_bind_buffer(tc, &tc->vertex_buffers[i], next, buf); } else { - tc_unbind_buffer(&tc->vertex_buffers[start + i]); + tc_unbind_buffer(&tc->vertex_buffers[i]); } } } - tc_unbind_buffers(&tc->vertex_buffers[start + count], + tc_unbind_buffers(&tc->vertex_buffers[count], unbind_num_trailing_slots); } else { struct tc_vertex_buffers *p = tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, 0); - p->start = start; p->count = 0; p->unbind_num_trailing_slots = count + unbind_num_trailing_slots; - tc_unbind_buffers(&tc->vertex_buffers[start], + tc_unbind_buffers(&tc->vertex_buffers[0], count + unbind_num_trailing_slots); } } diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index 269a94bacb3..9f0e77f446d 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -440,7 +440,7 @@ void u_vbuf_destroy(struct u_vbuf *mgr) const unsigned num_vb = screen->get_shader_param(screen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_MAX_INPUTS); - mgr->pipe->set_vertex_buffers(mgr->pipe, 0, 0, num_vb, false, NULL); + mgr->pipe->set_vertex_buffers(mgr->pipe, 0, num_vb, false, NULL); for (i = 0; i < PIPE_MAX_ATTRIBS; i++) pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]); @@ -973,7 +973,7 @@ static void u_vbuf_delete_vertex_elements(void *ctx, void *state, } void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *bufs) @@ -989,8 +989,7 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, uint32_t nonzero_stride_vb_mask = 0; /* which buffers are unaligned to 2/4 bytes */ uint32_t unaligned_vb_mask[2] = {0}; - uint32_t mask = - ~(((1ull << (count + unbind_num_trailing_slots)) - 1) << start_slot); + uint32_t mask = ~BITFIELD64_MASK(count + unbind_num_trailing_slots); if (!bufs) { struct pipe_context *pipe = mgr->pipe; @@ -1007,19 +1006,18 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, mgr->unaligned_vb_mask[1] &= mask; for (i = 0; i < total_count; i++) { - unsigned dst_index = start_slot + i; + unsigned dst_index = i; pipe_vertex_buffer_unreference(&mgr->vertex_buffer[dst_index]); pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[dst_index]); } - pipe->set_vertex_buffers(pipe, start_slot, count, - unbind_num_trailing_slots, false, NULL); + pipe->set_vertex_buffers(pipe, count, unbind_num_trailing_slots, false, NULL); return; } for (i = 0; i < count; i++) { - unsigned dst_index = start_slot + i; + unsigned dst_index = i; const struct pipe_vertex_buffer *vb = &bufs[i]; struct pipe_vertex_buffer *orig_vb = &mgr->vertex_buffer[dst_index]; struct pipe_vertex_buffer *real_vb = &mgr->real_vertex_buffer[dst_index]; @@ -1087,7 +1085,7 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, } for (i = 0; i < unbind_num_trailing_slots; i++) { - unsigned dst_index = start_slot + count + i; + unsigned dst_index = count + i; pipe_vertex_buffer_unreference(&mgr->vertex_buffer[dst_index]); pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[dst_index]); @@ -1399,10 +1397,7 @@ void u_vbuf_get_minmax_index(struct pipe_context *pipe, static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr) { struct pipe_context *pipe = mgr->pipe; - unsigned start_slot, count; - - start_slot = ffs(mgr->dirty_real_vb_mask) - 1; - count = util_last_bit(mgr->dirty_real_vb_mask >> start_slot); + unsigned count = util_last_bit(mgr->dirty_real_vb_mask); if (mgr->dirty_real_vb_mask == mgr->enabled_vb_mask && mgr->dirty_real_vb_mask == mgr->user_vb_mask) { @@ -1410,18 +1405,16 @@ static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr) * to skip atomic reference counting there. These are freshly uploaded * user buffers that can be discarded after this call. */ - pipe->set_vertex_buffers(pipe, start_slot, count, 0, true, - mgr->real_vertex_buffer + start_slot); + pipe->set_vertex_buffers(pipe, count, 0, true, mgr->real_vertex_buffer); /* We don't own the VBO references now. Set them to NULL. */ for (unsigned i = 0; i < count; i++) { - assert(!mgr->real_vertex_buffer[start_slot + i].is_user_buffer); - mgr->real_vertex_buffer[start_slot + i].buffer.resource = NULL; + assert(!mgr->real_vertex_buffer[i].is_user_buffer); + mgr->real_vertex_buffer[i].buffer.resource = NULL; } } else { /* Slow path where we have to keep VBO references. */ - pipe->set_vertex_buffers(pipe, start_slot, count, 0, false, - mgr->real_vertex_buffer + start_slot); + pipe->set_vertex_buffers(pipe, count, 0, false, mgr->real_vertex_buffer); } mgr->dirty_real_vb_mask = 0; } diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h index bb3568fb3dc..c8cefa7a4a0 100644 --- a/src/gallium/auxiliary/util/u_vbuf.h +++ b/src/gallium/auxiliary/util/u_vbuf.h @@ -81,7 +81,7 @@ void u_vbuf_set_vertex_elements(struct u_vbuf *mgr, const struct cso_velems_state *velems); void u_vbuf_unset_vertex_elements(struct u_vbuf *mgr); void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *bufs); diff --git a/src/gallium/auxiliary/vl/vl_bicubic_filter.c b/src/gallium/auxiliary/vl/vl_bicubic_filter.c index f092fcaeff3..3281290be36 100644 --- a/src/gallium/auxiliary/vl/vl_bicubic_filter.c +++ b/src/gallium/auxiliary/vl/vl_bicubic_filter.c @@ -460,7 +460,7 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter, filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); - filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, false, &filter->quad); + filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); diff --git a/src/gallium/auxiliary/vl/vl_compositor_gfx.c b/src/gallium/auxiliary/vl/vl_compositor_gfx.c index b7080c344d9..5a0b7b15f4b 100644 --- a/src/gallium/auxiliary/vl/vl_compositor_gfx.c +++ b/src/gallium/auxiliary/vl/vl_compositor_gfx.c @@ -717,7 +717,7 @@ vl_compositor_gfx_render(struct vl_compositor_state *s, c->pipe->set_framebuffer_state(c->pipe, &c->fb_state); c->pipe->bind_vs_state(c->pipe, c->vs); - c->pipe->set_vertex_buffers(c->pipe, 0, 1, 0, false, &c->vertex_buf); + c->pipe->set_vertex_buffers(c->pipe, 1, 0, false, &c->vertex_buf); c->pipe->bind_vertex_elements_state(c->pipe, c->vertex_elems_state); pipe_set_constant_buffer(c->pipe, PIPE_SHADER_FRAGMENT, 0, s->shader_params); c->pipe->bind_rasterizer_state(c->pipe, c->rast); diff --git a/src/gallium/auxiliary/vl/vl_deint_filter.c b/src/gallium/auxiliary/vl/vl_deint_filter.c index 91ffa839614..26d6852a80c 100644 --- a/src/gallium/auxiliary/vl/vl_deint_filter.c +++ b/src/gallium/auxiliary/vl/vl_deint_filter.c @@ -462,7 +462,7 @@ vl_deint_filter_render(struct vl_deint_filter *filter, /* set up pipe state */ filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); - filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, false, &filter->quad); + filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); filter->pipe->bind_vs_state(filter->pipe, filter->vs); filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT, diff --git a/src/gallium/auxiliary/vl/vl_matrix_filter.c b/src/gallium/auxiliary/vl/vl_matrix_filter.c index 4ef1be7f6e1..db360f67d76 100644 --- a/src/gallium/auxiliary/vl/vl_matrix_filter.c +++ b/src/gallium/auxiliary/vl/vl_matrix_filter.c @@ -306,7 +306,7 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter, filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); - filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, false, &filter->quad); + filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); diff --git a/src/gallium/auxiliary/vl/vl_median_filter.c b/src/gallium/auxiliary/vl/vl_median_filter.c index a3aad7b5a8d..f2968ed881f 100644 --- a/src/gallium/auxiliary/vl/vl_median_filter.c +++ b/src/gallium/auxiliary/vl/vl_median_filter.c @@ -425,7 +425,7 @@ vl_median_filter_render(struct vl_median_filter *filter, filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); - filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, false, &filter->quad); + filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index 26681c53251..68f8f19752f 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -794,7 +794,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder, if (!ref_frames[j] || !ref_frames[j][i]) continue; vb[2] = vl_vb_get_mv(&buf->vertex_stream, j); - dec->context->set_vertex_buffers(dec->context, 0, 3, 0, false, vb); + dec->context->set_vertex_buffers(dec->context, 3, 0, false, vb); vl_mc_render_ref(i ? &dec->mc_c : &dec->mc_y, &buf->mc[i], ref_frames[j][i]); } @@ -805,7 +805,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder, if (!buf->num_ycbcr_blocks[i]) continue; vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, i); - dec->context->set_vertex_buffers(dec->context, 0, 2, 0, false, vb); + dec->context->set_vertex_buffers(dec->context, 2, 0, false, vb); vl_zscan_render(i ? &dec->zscan_c : & dec->zscan_y, &buf->zscan[i] , buf->num_ycbcr_blocks[i]); @@ -824,7 +824,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder, if (!buf->num_ycbcr_blocks[plane]) continue; vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, plane); - dec->context->set_vertex_buffers(dec->context, 0, 2, 0, false, vb); + dec->context->set_vertex_buffers(dec->context, 2, 0, false, vb); if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) vl_idct_prepare_stage2(i ? &dec->idct_c : &dec->idct_y, &buf->idct[plane]); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 06598080743..da24d59cae2 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -1334,15 +1334,14 @@ agx_delete_state(struct pipe_context *ctx, void *state) /* BOs added to the batch in the uniform upload path */ static void -agx_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, - unsigned count, unsigned unbind_num_trailing_slots, - bool take_ownership, +agx_set_vertex_buffers(struct pipe_context *pctx, unsigned count, + unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) { struct agx_context *ctx = agx_context(pctx); util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers, - start_slot, count, unbind_num_trailing_slots, + count, unbind_num_trailing_slots, take_ownership); ctx->dirty |= AGX_DIRTY_VERTEX; diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c index 90f114d00b6..29a695dfd24 100644 --- a/src/gallium/drivers/crocus/crocus_state.c +++ b/src/gallium/drivers/crocus/crocus_state.c @@ -3658,7 +3658,7 @@ crocus_delete_state(struct pipe_context *ctx, void *state) */ static void crocus_set_vertex_buffers(struct pipe_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -3668,15 +3668,15 @@ crocus_set_vertex_buffers(struct pipe_context *ctx, const unsigned padding = (GFX_VERx10 < 75 && screen->devinfo.platform != INTEL_PLATFORM_BYT) * 2; ice->state.bound_vertex_buffers &= - ~u_bit_consecutive64(start_slot, count + unbind_num_trailing_slots); + ~u_bit_consecutive64(0, count + unbind_num_trailing_slots); util_set_vertex_buffers_mask(ice->state.vertex_buffers, &ice->state.bound_vertex_buffers, - buffers, start_slot, count, unbind_num_trailing_slots, + buffers, count, unbind_num_trailing_slots, take_ownership); for (unsigned i = 0; i < count; i++) { struct pipe_vertex_buffer *state = - &ice->state.vertex_buffers[start_slot + i]; + &ice->state.vertex_buffers[i]; if (!state->is_user_buffer && state->buffer.resource) { struct crocus_resource *res = (void *)state->buffer.resource; @@ -3686,7 +3686,7 @@ crocus_set_vertex_buffers(struct pipe_context *ctx, uint32_t end = 0; if (state->buffer.resource) end = state->buffer.resource->width0 + padding; - ice->state.vb_end[start_slot + i] = end; + ice->state.vb_end[i] = end; } ice->state.dirty |= CROCUS_DIRTY_VERTEX_BUFFERS; } diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index b90a870bbf4..17b180858e3 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -1309,7 +1309,6 @@ d3d12_set_polygon_stipple(struct pipe_context *pctx, static void d3d12_set_vertex_buffers(struct pipe_context *pctx, - unsigned start_slot, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, @@ -1317,7 +1316,7 @@ d3d12_set_vertex_buffers(struct pipe_context *pctx, { struct d3d12_context *ctx = d3d12_context(pctx); util_set_vertex_buffers_count(ctx->vbs, &ctx->num_vbs, - buffers, start_slot, num_buffers, + buffers, num_buffers, unbind_num_trailing_slots, take_ownership); diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index 3f06808250b..f38b7112d2d 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -450,19 +450,19 @@ etna_set_viewport_states(struct pipe_context *pctx, unsigned start_slot, } static void -etna_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, - unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, +etna_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers, + unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) { struct etna_context *ctx = etna_context(pctx); struct etna_vertexbuf_state *so = &ctx->vertex_buffer; - util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot, + util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, num_buffers, unbind_num_trailing_slots, take_ownership); so->count = util_last_bit(so->enabled_mask); - for (unsigned idx = start_slot; idx < start_slot + num_buffers; ++idx) { + for (unsigned idx = 0; idx < num_buffers; ++idx) { struct compiled_set_vertex_buffer *cs = &so->cvb[idx]; struct pipe_vertex_buffer *vbi = &so->vb[idx]; diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.c b/src/gallium/drivers/freedreno/freedreno_blitter.c index b947b9f1e97..a0c402d41e2 100644 --- a/src/gallium/drivers/freedreno/freedreno_blitter.c +++ b/src/gallium/drivers/freedreno/freedreno_blitter.c @@ -235,7 +235,7 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers, pctx->set_viewport_states(pctx, 0, 1, &vp); pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx); - pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1, 0, false, + pctx->set_vertex_buffers(pctx, 1, 0, false, &ctx->solid_vbuf_state.vertexbuf.vb[0]); pctx->set_stream_output_targets(pctx, 0, NULL, NULL); diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index 5e36730ef69..87068812a28 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -451,7 +451,7 @@ fd_set_viewport_states(struct pipe_context *pctx, unsigned start_slot, } static void -fd_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, +fd_set_vertex_buffers(struct pipe_context *pctx, unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) in_dt @@ -467,9 +467,9 @@ fd_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, if (ctx->screen->gen < 3) { for (i = 0; i < count; i++) { bool new_enabled = vb && vb[i].buffer.resource; - bool old_enabled = so->vb[start_slot + i].buffer.resource != NULL; + bool old_enabled = so->vb[i].buffer.resource != NULL; uint32_t new_stride = vb ? vb[i].stride : 0; - uint32_t old_stride = so->vb[start_slot + i].stride; + uint32_t old_stride = so->vb[i].stride; if ((new_enabled != old_enabled) || (new_stride != old_stride)) { fd_context_dirty(ctx, FD_DIRTY_VTXSTATE); break; @@ -477,7 +477,7 @@ fd_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, } } - util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot, + util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, count, unbind_num_trailing_slots, take_ownership); so->count = util_last_bit(so->enabled_mask); @@ -497,7 +497,7 @@ fd_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, */ if (vb[i].buffer.resource && unlikely(vb[i].buffer_offset >= vb[i].buffer.resource->width0)) { - so->vb[start_slot + i].buffer_offset = 0; + so->vb[i].buffer_offset = 0; } } } diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index df17e05e4b5..fd53daa1a27 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -956,7 +956,7 @@ i915_delete_rasterizer_state(struct pipe_context *pipe, void *raster) } static void -i915_set_vertex_buffers(struct pipe_context *pipe, unsigned start_slot, +i915_set_vertex_buffers(struct pipe_context *pipe, unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -965,11 +965,11 @@ i915_set_vertex_buffers(struct pipe_context *pipe, unsigned start_slot, struct draw_context *draw = i915->draw; util_set_vertex_buffers_count(i915->vertex_buffers, &i915->nr_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); /* pass-through to draw module */ - draw_set_vertex_buffers(draw, start_slot, count, unbind_num_trailing_slots, + draw_set_vertex_buffers(draw, count, unbind_num_trailing_slots, buffers); } diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 45b2e2b41ac..a00fc6da9f6 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -3894,7 +3894,7 @@ iris_delete_state(struct pipe_context *ctx, void *state) */ static void iris_set_vertex_buffers(struct pipe_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -3904,12 +3904,12 @@ iris_set_vertex_buffers(struct pipe_context *ctx, struct iris_genx_state *genx = ice->state.genx; ice->state.bound_vertex_buffers &= - ~u_bit_consecutive64(start_slot, count + unbind_num_trailing_slots); + ~u_bit_consecutive64(0, count + unbind_num_trailing_slots); for (unsigned i = 0; i < count; i++) { const struct pipe_vertex_buffer *buffer = buffers ? &buffers[i] : NULL; struct iris_vertex_buffer_state *state = - &genx->vertex_buffers[start_slot + i]; + &genx->vertex_buffers[i]; if (!buffer) { pipe_resource_reference(&state->resource, NULL); @@ -3934,12 +3934,12 @@ iris_set_vertex_buffers(struct pipe_context *ctx, state->offset = (int) buffer->buffer_offset; if (res) { - ice->state.bound_vertex_buffers |= 1ull << (start_slot + i); + ice->state.bound_vertex_buffers |= 1ull << i; res->bind_history |= PIPE_BIND_VERTEX_BUFFER; } iris_pack_state(GENX(VERTEX_BUFFER_STATE), state->state, vb) { - vb.VertexBufferIndex = start_slot + i; + vb.VertexBufferIndex = i; vb.AddressModifyEnable = true; vb.BufferPitch = buffer->stride; if (res) { @@ -3961,7 +3961,7 @@ iris_set_vertex_buffers(struct pipe_context *ctx, for (unsigned i = 0; i < unbind_num_trailing_slots; i++) { struct iris_vertex_buffer_state *state = - &genx->vertex_buffers[start_slot + count + i]; + &genx->vertex_buffers[count + i]; pipe_resource_reference(&state->resource, NULL); } diff --git a/src/gallium/drivers/lima/lima_state.c b/src/gallium/drivers/lima/lima_state.c index a7dc87747fb..65a046afb59 100644 --- a/src/gallium/drivers/lima/lima_state.c +++ b/src/gallium/drivers/lima/lima_state.c @@ -186,7 +186,7 @@ lima_delete_vertex_elements_state(struct pipe_context *pctx, void *hwcso) static void lima_set_vertex_buffers(struct pipe_context *pctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -195,7 +195,7 @@ lima_set_vertex_buffers(struct pipe_context *pctx, struct lima_context_vertex_buffer *so = &ctx->vertex_buffers; util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, - vb, start_slot, count, + vb, count, unbind_num_trailing_slots, take_ownership); so->count = util_last_bit(so->enabled_mask); @@ -472,5 +472,5 @@ lima_state_fini(struct lima_context *ctx) struct lima_context_vertex_buffer *so = &ctx->vertex_buffers; util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, NULL, - 0, 0, ARRAY_SIZE(so->vb), false); + 0, ARRAY_SIZE(so->vb), false); } diff --git a/src/gallium/drivers/llvmpipe/lp_state_vertex.c b/src/gallium/drivers/llvmpipe/lp_state_vertex.c index 4056f560367..b5998d0d7a6 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_vertex.c +++ b/src/gallium/drivers/llvmpipe/lp_state_vertex.c @@ -80,7 +80,7 @@ llvmpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) static void llvmpipe_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -91,13 +91,13 @@ llvmpipe_set_vertex_buffers(struct pipe_context *pipe, util_set_vertex_buffers_count(llvmpipe->vertex_buffer, &llvmpipe->num_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); llvmpipe->dirty |= LP_NEW_VERTEX; - draw_set_vertex_buffers(llvmpipe->draw, start_slot, count, + draw_set_vertex_buffers(llvmpipe->draw, count, unbind_num_trailing_slots, buffers); } diff --git a/src/gallium/drivers/nouveau/nv30/nv30_draw.c b/src/gallium/drivers/nouveau/nv30/nv30_draw.c index fca6407fc7c..926272be55a 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_draw.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_draw.c @@ -396,7 +396,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info, if (nv30->draw_dirty & NV30_NEW_CLIP) draw_set_clip_state(draw, &nv30->clip); if (nv30->draw_dirty & NV30_NEW_ARRAYS) { - draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, 0, nv30->vtxbuf); + draw_set_vertex_buffers(draw, nv30->num_vtxbufs, 0, nv30->vtxbuf); draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe); } if (nv30->draw_dirty & NV30_NEW_FRAGPROG) { diff --git a/src/gallium/drivers/nouveau/nv30/nv30_state.c b/src/gallium/drivers/nouveau/nv30/nv30_state.c index b604fae6708..94b9c2d774d 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_state.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_state.c @@ -436,7 +436,7 @@ nv30_set_viewport_states(struct pipe_context *pipe, static void nv30_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -446,7 +446,7 @@ nv30_set_vertex_buffers(struct pipe_context *pipe, nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VTXBUF); util_set_vertex_buffers_count(nv30->vtxbuf, &nv30->num_vtxbufs, - vb, start_slot, count, + vb, count, unbind_num_trailing_slots, take_ownership); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c index 7cde8e4b283..9cef689b0e4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c @@ -1085,7 +1085,7 @@ nv50_set_window_rectangles(struct pipe_context *pipe, static void nv50_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -1097,17 +1097,16 @@ nv50_set_vertex_buffers(struct pipe_context *pipe, nv50->dirty_3d |= NV50_NEW_3D_ARRAYS; util_set_vertex_buffers_count(nv50->vtxbuf, &nv50->num_vtxbufs, vb, - start_slot, count, - unbind_num_trailing_slots, + count, unbind_num_trailing_slots, take_ownership); - unsigned clear_mask = ~u_bit_consecutive(start_slot + count, unbind_num_trailing_slots); + unsigned clear_mask = ~u_bit_consecutive(count, unbind_num_trailing_slots); nv50->vbo_user &= clear_mask; nv50->vbo_constant &= clear_mask; nv50->vtxbufs_coherent &= clear_mask; if (!vb) { - clear_mask = ~u_bit_consecutive(start_slot, count); + clear_mask = ~u_bit_consecutive(0, count); nv50->vbo_user &= clear_mask; nv50->vbo_constant &= clear_mask; nv50->vtxbufs_coherent &= clear_mask; @@ -1115,7 +1114,7 @@ nv50_set_vertex_buffers(struct pipe_context *pipe, } for (i = 0; i < count; ++i) { - unsigned dst_index = start_slot + i; + unsigned dst_index = i; if (vb[i].is_user_buffer) { nv50->vbo_user |= 1 << dst_index; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c index 8bdb81c70aa..446adb48552 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c @@ -1038,7 +1038,7 @@ nvc0_set_patch_vertices(struct pipe_context *pipe, uint8_t patch_vertices) static void nvc0_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -1050,17 +1050,16 @@ nvc0_set_vertex_buffers(struct pipe_context *pipe, nvc0->dirty_3d |= NVC0_NEW_3D_ARRAYS; util_set_vertex_buffers_count(nvc0->vtxbuf, &nvc0->num_vtxbufs, vb, - start_slot, count, - unbind_num_trailing_slots, + count, unbind_num_trailing_slots, take_ownership); - unsigned clear_mask = ~u_bit_consecutive(start_slot + count, unbind_num_trailing_slots); + unsigned clear_mask = ~u_bit_consecutive(count, unbind_num_trailing_slots); nvc0->vbo_user &= clear_mask; nvc0->constant_vbos &= clear_mask; nvc0->vtxbufs_coherent &= clear_mask; if (!vb) { - clear_mask = ~u_bit_consecutive(start_slot, count); + clear_mask = ~u_bit_consecutive(0, count); nvc0->vbo_user &= clear_mask; nvc0->constant_vbos &= clear_mask; nvc0->vtxbufs_coherent &= clear_mask; @@ -1068,7 +1067,7 @@ nvc0_set_vertex_buffers(struct pipe_context *pipe, } for (i = 0; i < count; ++i) { - unsigned dst_index = start_slot + i; + unsigned dst_index = i; if (vb[i].is_user_buffer) { nvc0->vbo_user |= 1 << dst_index; diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 6da69f1508f..15df6e945b3 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -326,8 +326,7 @@ panfrost_bind_sampler_states(struct pipe_context *pctx, } static void -panfrost_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, - unsigned num_buffers, +panfrost_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -335,8 +334,8 @@ panfrost_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot, struct panfrost_context *ctx = pan_context(pctx); util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers, - start_slot, num_buffers, - unbind_num_trailing_slots, take_ownership); + num_buffers, unbind_num_trailing_slots, + take_ownership); ctx->dirty |= PAN_DIRTY_VERTEX; } diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index 140878c41db..82344ba74cf 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -474,7 +474,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen, vb.depth0 = 1; r300->dummy_vb.buffer.resource = screen->resource_create(screen, &vb); - r300->context.set_vertex_buffers(&r300->context, 0, 1, 0, false, &r300->dummy_vb); + r300->context.set_vertex_buffers(&r300->context, 1, 0, false, &r300->dummy_vb); } { diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index d773b1fd04a..0bc86c584e5 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1771,7 +1771,7 @@ static void r300_set_viewport_states(struct pipe_context* pipe, } static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer* buffers) @@ -1780,21 +1780,21 @@ static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe, util_set_vertex_buffers_count(r300->vertex_buffer, &r300->nr_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); /* There must be at least one vertex buffer set, otherwise it locks up. */ if (!r300->nr_vertex_buffers) { util_set_vertex_buffers_count(r300->vertex_buffer, &r300->nr_vertex_buffers, - &r300->dummy_vb, 0, 1, 0, false); + &r300->dummy_vb, 1, 0, false); } r300->vertex_arrays_dirty = true; } static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer* buffers) @@ -1804,9 +1804,9 @@ static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe, util_set_vertex_buffers_count(r300->vertex_buffer, &r300->nr_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); - draw_set_vertex_buffers(r300->draw, start_slot, count, + draw_set_vertex_buffers(r300->draw, count, unbind_num_trailing_slots, buffers); if (!buffers) @@ -1814,10 +1814,10 @@ static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe, for (i = 0; i < count; i++) { if (buffers[i].is_user_buffer) { - draw_set_mapped_vertex_buffer(r300->draw, start_slot + i, + draw_set_mapped_vertex_buffer(r300->draw, i, buffers[i].buffer.user, ~0); } else if (buffers[i].buffer.resource) { - draw_set_mapped_vertex_buffer(r300->draw, start_slot + i, + draw_set_mapped_vertex_buffer(r300->draw, i, r300_resource(buffers[i].buffer.resource)->malloced_buffer, ~0); } } diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c index eddb76a49da..dfd5cd28ac3 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.c +++ b/src/gallium/drivers/r600/r600_pipe_common.c @@ -207,7 +207,7 @@ void r600_draw_rectangle(struct blitter_context *blitter, vbuffer.stride = 2 * 4 * sizeof(float); /* vertex size */ vbuffer.buffer_offset = offset; - rctx->b.set_vertex_buffers(&rctx->b, blitter->vb_slot, 1, 0, false, &vbuffer); + rctx->b.set_vertex_buffers(&rctx->b, 1, 0, false, &vbuffer); util_draw_arrays_instanced(&rctx->b, R600_PRIM_RECTANGLE_LIST, 0, 3, 0, num_instances); pipe_resource_reference(&buf, NULL); diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index db0f4a8a21f..13a5dd3ebe2 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -568,14 +568,14 @@ void r600_vertex_buffers_dirty(struct r600_context *rctx) } static void r600_set_vertex_buffers(struct pipe_context *ctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *input) { struct r600_context *rctx = (struct r600_context *)ctx; struct r600_vertexbuf_state *state = &rctx->vertex_buffer_state; - struct pipe_vertex_buffer *vb = state->vb + start_slot; + struct pipe_vertex_buffer *vb = state->vb; unsigned i; uint32_t disable_mask = 0; /* These are the new buffers set by this function. */ @@ -626,9 +626,6 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx, } disable_mask |= ((1ull << unbind_num_trailing_slots) - 1) << count; - disable_mask <<= start_slot; - new_buffer_mask <<= start_slot; - rctx->vertex_buffer_state.enabled_mask &= ~disable_mask; rctx->vertex_buffer_state.dirty_mask &= rctx->vertex_buffer_state.enabled_mask; rctx->vertex_buffer_state.enabled_mask |= new_buffer_mask; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index b0285b51bf0..f21128e2d72 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -5157,29 +5157,28 @@ static void si_delete_vertex_element(struct pipe_context *ctx, void *state) FREE(state); } -static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned start_slot, unsigned count, +static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) { struct si_context *sctx = (struct si_context *)ctx; - struct pipe_vertex_buffer *dst = sctx->vertex_buffer + start_slot; - unsigned updated_mask = u_bit_consecutive(start_slot, count + unbind_num_trailing_slots); + unsigned updated_mask = u_bit_consecutive(0, count + unbind_num_trailing_slots); uint32_t orig_unaligned = sctx->vertex_buffer_unaligned; uint32_t unaligned = 0; int i; - assert(start_slot + count + unbind_num_trailing_slots <= ARRAY_SIZE(sctx->vertex_buffer)); + assert(count + unbind_num_trailing_slots <= ARRAY_SIZE(sctx->vertex_buffer)); if (buffers) { if (take_ownership) { for (i = 0; i < count; i++) { const struct pipe_vertex_buffer *src = buffers + i; - struct pipe_vertex_buffer *dsti = dst + i; + struct pipe_vertex_buffer *dst = sctx->vertex_buffer + i; struct pipe_resource *buf = src->buffer.resource; - unsigned slot_bit = 1 << (start_slot + i); + unsigned slot_bit = 1 << i; /* Only unreference bound vertex buffers. (take_ownership) */ - pipe_resource_reference(&dsti->buffer.resource, NULL); + pipe_resource_reference(&dst->buffer.resource, NULL); if (src->buffer_offset & 3 || src->stride & 3) unaligned |= slot_bit; @@ -5191,19 +5190,19 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned start_slot, } } /* take_ownership allows us to copy pipe_resource pointers without refcounting. */ - memcpy(dst, buffers, count * sizeof(struct pipe_vertex_buffer)); + memcpy(sctx->vertex_buffer, buffers, count * sizeof(struct pipe_vertex_buffer)); } else { for (i = 0; i < count; i++) { const struct pipe_vertex_buffer *src = buffers + i; - struct pipe_vertex_buffer *dsti = dst + i; + struct pipe_vertex_buffer *dst = sctx->vertex_buffer + i; struct pipe_resource *buf = src->buffer.resource; - unsigned slot_bit = 1 << (start_slot + i); + unsigned slot_bit = 1 << i; - pipe_resource_reference(&dsti->buffer.resource, buf); - dsti->buffer_offset = src->buffer_offset; - dsti->stride = src->stride; + pipe_resource_reference(&dst->buffer.resource, buf); + dst->buffer_offset = src->buffer_offset; + dst->stride = src->stride; - if (dsti->buffer_offset & 3 || dsti->stride & 3) + if (dst->buffer_offset & 3 || dst->stride & 3) unaligned |= slot_bit; if (buf) { @@ -5215,11 +5214,11 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned start_slot, } } else { for (i = 0; i < count; i++) - pipe_resource_reference(&dst[i].buffer.resource, NULL); + pipe_resource_reference(&sctx->vertex_buffer[i].buffer.resource, NULL); } for (i = 0; i < unbind_num_trailing_slots; i++) - pipe_resource_reference(&dst[count + i].buffer.resource, NULL); + pipe_resource_reference(&sctx->vertex_buffer[count + i].buffer.resource, NULL); sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; sctx->vertex_buffer_unaligned = (orig_unaligned & ~updated_mask) | unaligned; diff --git a/src/gallium/drivers/softpipe/sp_state_vertex.c b/src/gallium/drivers/softpipe/sp_state_vertex.c index d46ee6b23c0..8f8aa47d454 100644 --- a/src/gallium/drivers/softpipe/sp_state_vertex.c +++ b/src/gallium/drivers/softpipe/sp_state_vertex.c @@ -80,7 +80,7 @@ softpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) static void softpipe_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -91,14 +91,13 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe, util_set_vertex_buffers_count(softpipe->vertex_buffer, &softpipe->num_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); softpipe->dirty |= SP_NEW_VERTEX; - draw_set_vertex_buffers(softpipe->draw, start_slot, count, - unbind_num_trailing_slots, buffers); + draw_set_vertex_buffers(softpipe->draw, count, unbind_num_trailing_slots, buffers); } diff --git a/src/gallium/drivers/svga/svga_pipe_vertex.c b/src/gallium/drivers/svga/svga_pipe_vertex.c index 1105faa2ebf..2002f39437c 100644 --- a/src/gallium/drivers/svga/svga_pipe_vertex.c +++ b/src/gallium/drivers/svga/svga_pipe_vertex.c @@ -41,7 +41,7 @@ static void svga_set_vertex_buffers(struct pipe_context *pipe, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -50,7 +50,7 @@ svga_set_vertex_buffers(struct pipe_context *pipe, util_set_vertex_buffers_count(svga->curr.vb, &svga->curr.num_vertex_buffers, - buffers, start_slot, count, + buffers, count, unbind_num_trailing_slots, take_ownership); diff --git a/src/gallium/drivers/svga/svga_swtnl_state.c b/src/gallium/drivers/svga/svga_swtnl_state.c index 674ff9f29ac..b64acdd0a78 100644 --- a/src/gallium/drivers/svga/svga_swtnl_state.c +++ b/src/gallium/drivers/svga/svga_swtnl_state.c @@ -113,7 +113,7 @@ update_swtnl_draw(struct svga_context *svga, uint64_t dirty) svga->curr.fs->draw_shader); if (dirty & SVGA_NEW_VBUFFER) - draw_set_vertex_buffers(svga->swtnl.draw, 0, + draw_set_vertex_buffers(svga->swtnl.draw, svga->curr.num_vertex_buffers, 0, svga->curr.vb); diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c index 4e5ac42fa47..c98953744a3 100644 --- a/src/gallium/drivers/tegra/tegra_context.c +++ b/src/gallium/drivers/tegra/tegra_context.c @@ -634,7 +634,7 @@ tegra_set_shader_images(struct pipe_context *pcontext, enum pipe_shader_type sha } static void -tegra_set_vertex_buffers(struct pipe_context *pcontext, unsigned start_slot, +tegra_set_vertex_buffers(struct pipe_context *pcontext, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *buffers) @@ -654,7 +654,7 @@ tegra_set_vertex_buffers(struct pipe_context *pcontext, unsigned start_slot, buffers = buf; } - context->gpu->set_vertex_buffers(context->gpu, start_slot, num_buffers, + context->gpu->set_vertex_buffers(context->gpu, num_buffers, unbind_num_trailing_slots, take_ownership, buffers); } diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 0f1735fee66..5d6a6be12e4 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -296,7 +296,7 @@ v3d_set_viewport_states(struct pipe_context *pctx, static void v3d_set_vertex_buffers(struct pipe_context *pctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -305,8 +305,7 @@ v3d_set_vertex_buffers(struct pipe_context *pctx, struct v3d_vertexbuf_stateobj *so = &v3d->vertexbuf; util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, - start_slot, count, - unbind_num_trailing_slots, + count, unbind_num_trailing_slots, take_ownership); so->count = util_last_bit(so->enabled_mask); diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c index ad068494b3e..bea71c8ddc8 100644 --- a/src/gallium/drivers/vc4/vc4_state.c +++ b/src/gallium/drivers/vc4/vc4_state.c @@ -312,7 +312,7 @@ vc4_set_viewport_states(struct pipe_context *pctx, static void vc4_set_vertex_buffers(struct pipe_context *pctx, - unsigned start_slot, unsigned count, + unsigned count, unsigned unbind_num_trailing_slots, bool take_ownership, const struct pipe_vertex_buffer *vb) @@ -321,8 +321,7 @@ vc4_set_vertex_buffers(struct pipe_context *pctx, struct vc4_vertexbuf_stateobj *so = &vc4->vertexbuf; util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, - start_slot, count, - unbind_num_trailing_slots, + count, unbind_num_trailing_slots, take_ownership); so->count = util_last_bit(so->enabled_mask); diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index f40009ad37b..6113fdfc167 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -567,7 +567,6 @@ static void virgl_bind_vertex_elements_state(struct pipe_context *ctx, } static void virgl_set_vertex_buffers(struct pipe_context *ctx, - unsigned start_slot, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, @@ -577,7 +576,7 @@ static void virgl_set_vertex_buffers(struct pipe_context *ctx, util_set_vertex_buffers_count(vctx->vertex_buffer, &vctx->num_vertex_buffers, - buffers, start_slot, num_buffers, + buffers, num_buffers, unbind_num_trailing_slots, take_ownership); diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 89c73220788..0d49c169634 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1272,7 +1272,6 @@ update_existing_vbo(struct zink_context *ctx, unsigned slot) static void zink_set_vertex_buffers(struct pipe_context *pctx, - unsigned start_slot, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, @@ -1283,16 +1282,16 @@ zink_set_vertex_buffers(struct pipe_context *pctx, const bool need_state_change = !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state && !have_input_state; uint32_t enabled_buffers = ctx->gfx_pipeline_state.vertex_buffers_enabled_mask; - enabled_buffers |= u_bit_consecutive(start_slot, num_buffers); - enabled_buffers &= ~u_bit_consecutive(start_slot + num_buffers, unbind_num_trailing_slots); + enabled_buffers |= u_bit_consecutive(0, num_buffers); + enabled_buffers &= ~u_bit_consecutive(num_buffers, unbind_num_trailing_slots); bool stride_changed = false; if (buffers) { for (unsigned i = 0; i < num_buffers; ++i) { const struct pipe_vertex_buffer *vb = buffers + i; - struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[start_slot + i]; + struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[i]; stride_changed |= ctx_vb->stride != vb->stride; - update_existing_vbo(ctx, start_slot + i); + update_existing_vbo(ctx, i); if (!take_ownership) pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource); else { @@ -1301,7 +1300,7 @@ zink_set_vertex_buffers(struct pipe_context *pctx, } if (vb->buffer.resource) { struct zink_resource *res = zink_resource(vb->buffer.resource); - res->vbo_bind_mask |= BITFIELD_BIT(start_slot + i); + res->vbo_bind_mask |= BITFIELD_BIT(i); res->vbo_bind_count++; res->gfx_barrier |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; res->barrier_access[0] |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; @@ -1314,18 +1313,18 @@ zink_set_vertex_buffers(struct pipe_context *pctx, zink_batch_resource_usage_set(&ctx->batch, res, false, true); res->obj->unordered_read = false; } else { - enabled_buffers &= ~BITFIELD_BIT(start_slot + i); + enabled_buffers &= ~BITFIELD_BIT(i); } } } else { for (unsigned i = 0; i < num_buffers; ++i) { - update_existing_vbo(ctx, start_slot + i); - pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); + update_existing_vbo(ctx, i); + pipe_resource_reference(&ctx->vertex_buffers[i].buffer.resource, NULL); } } for (unsigned i = 0; i < unbind_num_trailing_slots; i++) { - update_existing_vbo(ctx, start_slot + i); - pipe_resource_reference(&ctx->vertex_buffers[start_slot + i].buffer.resource, NULL); + update_existing_vbo(ctx, i); + pipe_resource_reference(&ctx->vertex_buffers[i].buffer.resource, NULL); } if (need_state_change) ctx->vertex_state_changed = true; diff --git a/src/gallium/frontends/d3d10umd/InputAssembly.cpp b/src/gallium/frontends/d3d10umd/InputAssembly.cpp index 1b6ff69d3e2..9dc2e6452c3 100644 --- a/src/gallium/frontends/d3d10umd/InputAssembly.cpp +++ b/src/gallium/frontends/d3d10umd/InputAssembly.cpp @@ -178,7 +178,7 @@ IaSetVertexBuffers(D3D10DDI_HDEVICE hDevice, /* Resubmit old and new vertex buffers. */ - pipe->set_vertex_buffers(pipe, 0, PIPE_MAX_ATTRIBS, 0, false, pDevice->vertex_buffers); + pipe->set_vertex_buffers(pipe, PIPE_MAX_ATTRIBS, 0, false, pDevice->vertex_buffers); } diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 0bf35848f1e..4bba8c34ec2 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -148,6 +148,7 @@ struct rendering_state { unsigned start_vb; struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS]; size_t vb_sizes[PIPE_MAX_ATTRIBS]; //UINT32_MAX for unset + uint8_t vertex_buffer_index[PIPE_MAX_ATTRIBS]; /* temp storage to sort for start_vb */ struct cso_velems_state velem; bool disable_multisample; @@ -403,6 +404,12 @@ update_min_samples(struct rendering_state *state) } } +static void update_vertex_elements_buffer_index(struct rendering_state *state) +{ + for (int i = 0; i < state->velem.count; i++) + state->velem.velems[i].vertex_buffer_index = state->vertex_buffer_index[i] - state->start_vb; +} + static void emit_state(struct rendering_state *state) { if (!state->shaders[MESA_SHADER_FRAGMENT] && !state->noop_fs_bound) { @@ -483,11 +490,12 @@ static void emit_state(struct rendering_state *state) } if (state->vb_dirty) { - cso_set_vertex_buffers(state->cso, state->start_vb, state->num_vb, 0, false, state->vb); + cso_set_vertex_buffers(state->cso, state->num_vb, 0, false, state->vb); state->vb_dirty = false; } if (state->ve_dirty) { + update_vertex_elements_buffer_index(state); cso_set_vertex_elements(state->cso, &state->velem); state->ve_dirty = false; } @@ -963,7 +971,7 @@ static void handle_graphics_pipeline(struct lvp_pipeline *pipeline, u_foreach_bit(a, ps->vi->attributes_valid) { uint32_t b = ps->vi->attributes[a].binding; state->velem.velems[a].src_offset = ps->vi->attributes[a].offset; - state->velem.velems[a].vertex_buffer_index = b; + state->vertex_buffer_index[a] = b; state->velem.velems[a].src_format = lvp_vk_format_to_pipe_format(ps->vi->attributes[a].format); state->velem.velems[a].dual_slot = false; @@ -3297,7 +3305,7 @@ static void handle_set_vertex_input(struct vk_cmd_queue_entry *cmd, } assert(binding); state->velem.velems[location].src_offset = attrs[i].offset; - state->velem.velems[location].vertex_buffer_index = attrs[i].binding; + state->vertex_buffer_index[location] = attrs[i].binding; state->velem.velems[location].src_format = lvp_vk_format_to_pipe_format(attrs[i].format); state->vb[attrs[i].binding].stride = binding->stride; uint32_t d = binding->divisor; diff --git a/src/gallium/frontends/nine/device9.c b/src/gallium/frontends/nine/device9.c index c20c1fc25ac..a54beab8111 100644 --- a/src/gallium/frontends/nine/device9.c +++ b/src/gallium/frontends/nine/device9.c @@ -401,6 +401,26 @@ NineDevice9_ctor( struct NineDevice9 *This, assert(transfer); memset(data, 0, 16); This->context.pipe->buffer_unmap(This->context.pipe, transfer); + + /* initialize dummy_vbo_sw */ + if (pScreen != This->screen_sw) { + + This->dummy_vbo_sw = This->screen_sw->resource_create(This->screen_sw, &tmpl); + if (!This->dummy_vbo_sw) + return D3DERR_OUTOFVIDEOMEMORY; + + u_box_1d(0, 16, &box); + data = This->pipe_sw->buffer_map(This->pipe_sw, This->dummy_vbo_sw, 0, + PIPE_MAP_WRITE | + PIPE_MAP_DISCARD_WHOLE_RESOURCE, + &box, &transfer); + assert(data); + assert(transfer); + memset(data, 0, 16); + This->pipe_sw->buffer_unmap(This->pipe_sw, transfer); + } else { + This->dummy_vbo_sw = This->dummy_vbo; + } } This->cursor.software = false; @@ -639,6 +659,8 @@ NineDevice9_dtor( struct NineDevice9 *This ) pipe_sampler_view_reference(&This->dummy_sampler_view, NULL); pipe_resource_reference(&This->dummy_texture, NULL); pipe_resource_reference(&This->dummy_vbo, NULL); + if (This->screen != This->screen_sw) + pipe_resource_reference(&This->dummy_vbo_sw, NULL); FREE(This->state.vs_const_f); FREE(This->context.vs_const_f); FREE(This->state.ps_const_f); diff --git a/src/gallium/frontends/nine/device9.h b/src/gallium/frontends/nine/device9.h index 69a8eb71c5d..ef67c02b7d5 100644 --- a/src/gallium/frontends/nine/device9.h +++ b/src/gallium/frontends/nine/device9.h @@ -158,6 +158,7 @@ struct NineDevice9 /* dummy vbo (containing 0 0 0 0) to bind if vertex shader input * is not bound to anything by the vertex declaration */ struct pipe_resource *dummy_vbo; + struct pipe_resource *dummy_vbo_sw; BOOL device_needs_reset; int minor_version_num; long long available_texture_mem; diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 322b6153acc..cb9e5a53c38 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -869,6 +869,8 @@ update_vertex_elements(struct NineDevice9 *device) int dummy_vbo_stream = -1; BOOL need_dummy_vbo = false; struct cso_velems_state ve; + unsigned vtxbuf_mask; + unsigned vtxbuf_holes_map[PIPE_MAX_ATTRIBS]; context->stream_usage_mask = 0; memset(vdecl_index_map, -1, 16); @@ -897,18 +899,27 @@ update_vertex_elements(struct NineDevice9 *device) if (need_dummy_vbo) { u_foreach_bit(bit, BITFIELD_MASK(device->caps.MaxStreams) & ~used_streams) { - dummy_vbo_stream = bit; - break; + dummy_vbo_stream = bit; + break; } } - /* there are less vertex shader inputs than stream slots, + /* there are fewer vertex shader inputs than stream slots, * so if we need a slot for the dummy vbo, we should have found one */ assert (!need_dummy_vbo || dummy_vbo_stream != -1); + /* calculate vtxbuf_holes_map to match for update_vertex_buffers() function */ + i = 0; + vtxbuf_mask = context->vtxbuf_mask | + (need_dummy_vbo ? BITFIELD_BIT(dummy_vbo_stream) : 0); + u_foreach_bit(bit, vtxbuf_mask) + vtxbuf_holes_map[bit] = i++; + for (n = 0; n < vs->num_inputs; ++n) { index = vdecl_index_map[n]; if (index >= 0) { ve.velems[n] = vdecl->elems[index]; + ve.velems[n].vertex_buffer_index = + vtxbuf_holes_map[ve.velems[n].vertex_buffer_index]; b = ve.velems[n].vertex_buffer_index; context->stream_usage_mask |= 1 << b; /* XXX wine just uses 1 here: */ @@ -919,7 +930,7 @@ update_vertex_elements(struct NineDevice9 *device) * vertex shader needs, we bind a dummy vbo with 0 0 0 0. * This is not precised by the spec, but is the behaviour * tested on win */ - ve.velems[n].vertex_buffer_index = dummy_vbo_stream; + ve.velems[n].vertex_buffer_index = vtxbuf_holes_map[dummy_vbo_stream]; ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; ve.velems[n].src_offset = 0; ve.velems[n].instance_divisor = 0; @@ -930,10 +941,8 @@ update_vertex_elements(struct NineDevice9 *device) if (context->dummy_vbo_bound_at != dummy_vbo_stream) { if (context->dummy_vbo_bound_at >= 0) context->changed.vtxbuf |= 1 << context->dummy_vbo_bound_at; - if (dummy_vbo_stream >= 0) { + if (dummy_vbo_stream >= 0) context->changed.vtxbuf |= 1 << dummy_vbo_stream; - context->vbo_bound_done = false; - } context->dummy_vbo_bound_at = dummy_vbo_stream; } @@ -946,34 +955,36 @@ update_vertex_buffers(struct NineDevice9 *device) { struct nine_context *context = &device->context; struct pipe_context *pipe = context->pipe; - struct pipe_vertex_buffer dummy_vtxbuf; - uint32_t mask = context->changed.vtxbuf; - unsigned i; + struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; + unsigned vtxbuf_count; + unsigned trailing_count; + unsigned mask, i, vtxbuf_i; + + mask = context->vtxbuf_mask | + ((context->dummy_vbo_bound_at >= 0) ? BITFIELD_BIT(context->dummy_vbo_bound_at) : 0); + vtxbuf_count = util_bitcount(mask); DBG("mask=%x\n", mask); - - if (context->dummy_vbo_bound_at >= 0) { - if (!context->vbo_bound_done) { - dummy_vtxbuf.buffer.resource = device->dummy_vbo; - dummy_vtxbuf.stride = 0; - dummy_vtxbuf.is_user_buffer = false; - dummy_vtxbuf.buffer_offset = 0; - pipe->set_vertex_buffers(pipe, context->dummy_vbo_bound_at, - 1, 0, false, &dummy_vtxbuf); - context->vbo_bound_done = true; - } - mask &= ~(1 << context->dummy_vbo_bound_at); - } - - for (i = 0; mask; mask >>= 1, ++i) { - if (mask & 1) { - if (context->vtxbuf[i].buffer.resource) - pipe->set_vertex_buffers(pipe, i, 1, 0, false, &context->vtxbuf[i]); - else - pipe->set_vertex_buffers(pipe, i, 0, 1, false, NULL); + for (i = 0; mask; i++) { + vtxbuf_i = u_bit_scan(&mask); + if (vtxbuf_i == context->dummy_vbo_bound_at) { + vbuffer[i].buffer.resource = device->dummy_vbo; + vbuffer[i].stride = 0; + vbuffer[i].is_user_buffer = false; + vbuffer[i].buffer_offset = 0; + } else { + memcpy(&vbuffer[i], &context->vtxbuf[vtxbuf_i], sizeof(struct pipe_vertex_buffer)); } } + trailing_count = (context->last_vtxbuf_count <= vtxbuf_count) ? 0 : + context->last_vtxbuf_count - vtxbuf_count; + if (vtxbuf_count) + pipe->set_vertex_buffers(pipe, vtxbuf_count, trailing_count, false, vbuffer); + else + pipe->set_vertex_buffers(pipe, 0, trailing_count, false, NULL); + + context->last_vtxbuf_count = vtxbuf_count; context->changed.vtxbuf = 0; } @@ -1612,6 +1623,10 @@ CSMT_ITEM_NO_WAIT(nine_context_set_stream_source_apply, pipe_resource_reference(&context->vtxbuf[i].buffer.resource, res); context->changed.vtxbuf |= 1 << StreamNumber; + if (res) + context->vtxbuf_mask |= 1 << StreamNumber; + else + context->vtxbuf_mask &= ~(1 << StreamNumber); } void @@ -2518,7 +2533,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, else info.index.user = user_ibuf; - context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, false, vbuf); + context->pipe->set_vertex_buffers(context->pipe, 1, 0, false, vbuf); context->changed.vtxbuf |= 1; context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1); @@ -2980,10 +2995,8 @@ nine_state_set_defaults(struct NineDevice9 *device, const D3DCAPS9 *caps, for (s = 0; s < NINE_MAX_SAMPLERS; ++s) context->changed.sampler[s] = ~0; - if (!is_reset) { + if (!is_reset) context->dummy_vbo_bound_at = -1; - context->vbo_bound_done = false; - } } void @@ -3022,6 +3035,8 @@ nine_context_clear(struct NineDevice9 *device) if (!pipe || !cso) return; + context->vtxbuf_mask = 0; + pipe->bind_vs_state(pipe, NULL); pipe->bind_fs_state(pipe, NULL); @@ -3039,7 +3054,7 @@ nine_context_clear(struct NineDevice9 *device) pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 0, NINE_MAX_SAMPLERS_PS, false, NULL); - pipe->set_vertex_buffers(pipe, 0, 0, device->caps.MaxStreams, false, NULL); + pipe->set_vertex_buffers(pipe, 0, device->caps.MaxStreams, false, NULL); for (i = 0; i < ARRAY_SIZE(context->rt); ++i) nine_bind(&context->rt[i], NULL); @@ -3099,20 +3114,21 @@ nine_state_init_sw(struct NineDevice9 *device) /* There is duplication with update_vertex_elements. * TODO: Share the code */ -static void +static int update_vertex_elements_sw(struct NineDevice9 *device) { struct nine_state *state = &device->state; const struct NineVertexDeclaration9 *vdecl = device->state.vdecl; const struct NineVertexShader9 *vs; - unsigned n, b, i; + unsigned n, b, i, j; int index; int8_t vdecl_index_map[16]; /* vs->num_inputs <= 16 */ int8_t used_streams[device->caps.MaxStreams]; - int dummy_vbo_stream = -1; BOOL need_dummy_vbo = false; + int dummy_vbo_stream = -1; struct cso_velems_state ve; bool programmable_vs = state->vs && !(state->vdecl && state->vdecl->position_t); + unsigned vtxbuf_holes_map[PIPE_MAX_ATTRIBS]; memset(vdecl_index_map, -1, 16); memset(used_streams, 0, device->caps.MaxStreams); @@ -3140,20 +3156,32 @@ update_vertex_elements_sw(struct NineDevice9 *device) } if (need_dummy_vbo) { - for (i = 0; i < device->caps.MaxStreams; i++ ) { + for (i = 0; i < device->caps.MaxStreams; i++) { if (!used_streams[i]) { dummy_vbo_stream = i; break; } } } - /* TODO handle dummy_vbo */ - assert (!need_dummy_vbo); + /* there are less vertex shader inputs than stream slots, + * so if we need a slot for the dummy vbo, we should have found one */ + assert (!need_dummy_vbo || dummy_vbo_stream != -1); + + /* calculate vtxbuf_holes_map to match for update_vertex_buffers_sw() function */ + j = 0; + for (i = 0; i < device->caps.MaxStreams; i++) { + if (state->stream[i] || (need_dummy_vbo && dummy_vbo_stream == i)) { + vtxbuf_holes_map[i] = j; + j++; + } + } for (n = 0; n < vs->num_inputs; ++n) { index = vdecl_index_map[n]; if (index >= 0) { ve.velems[n] = vdecl->elems[index]; + ve.velems[n].vertex_buffer_index = + vtxbuf_holes_map[ve.velems[n].vertex_buffer_index]; b = ve.velems[n].vertex_buffer_index; /* XXX wine just uses 1 here: */ if (state->stream_freq[b] & D3DSTREAMSOURCE_INSTANCEDATA) @@ -3163,7 +3191,7 @@ update_vertex_elements_sw(struct NineDevice9 *device) * vertex shader needs, we bind a dummy vbo with 0 0 0 0. * This is not precised by the spec, but is the behaviour * tested on win */ - ve.velems[n].vertex_buffer_index = dummy_vbo_stream; + ve.velems[n].vertex_buffer_index = vtxbuf_holes_map[dummy_vbo_stream]; ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; ve.velems[n].src_offset = 0; ve.velems[n].instance_divisor = 0; @@ -3173,63 +3201,68 @@ update_vertex_elements_sw(struct NineDevice9 *device) ve.count = vs->num_inputs; cso_set_vertex_elements(device->cso_sw, &ve); + return dummy_vbo_stream; } static void -update_vertex_buffers_sw(struct NineDevice9 *device, int start_vertice, int num_vertices) +update_vertex_buffers_sw(struct NineDevice9 *device, int dummy_vbo_stream, + int start_vertice, int num_vertices) { struct pipe_context *pipe = nine_context_get_pipe_acquire(device); struct pipe_context *pipe_sw = device->pipe_sw; struct nine_state *state = &device->state; struct nine_state_sw_internal *sw_internal = &device->state_sw_internal; - struct pipe_vertex_buffer vtxbuf; - uint32_t mask = 0xf; - unsigned i; + struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; + unsigned vtxbuf_count = 0; + unsigned i, j = 0; - DBG("mask=%x\n", mask); + for (i = 0; i < device->caps.MaxStreams; i++) { + if (dummy_vbo_stream == i) { + vbuffer[j].buffer.resource = NULL; + pipe_resource_reference(&vbuffer[j].buffer.resource, device->dummy_vbo_sw); + vbuffer[j].stride = 0; + vbuffer[j].is_user_buffer = false; + vbuffer[j].buffer_offset = 0; + j++; + } else if (state->stream[i]) { + unsigned offset; + struct pipe_resource *buf; + struct pipe_box box; + void *userbuf; - /* TODO: handle dummy_vbo_bound_at */ + vbuffer[j] = state->vtxbuf[i]; + buf = NineVertexBuffer9_GetResource(state->stream[i], &offset); - for (i = 0; mask; mask >>= 1, ++i) { - if (mask & 1) { - if (state->stream[i]) { - unsigned offset; - struct pipe_resource *buf; - struct pipe_box box; - void *userbuf; + DBG("Locking %p (offset %d, length %d)\n", buf, + vbuffer[j].buffer_offset, num_vertices * vbuffer[j].stride); - vtxbuf = state->vtxbuf[i]; - buf = NineVertexBuffer9_GetResource(state->stream[i], &offset); + u_box_1d(vbuffer[j].buffer_offset + offset + start_vertice * + vbuffer[j].stride, num_vertices * vbuffer[j].stride, &box); - DBG("Locking %p (offset %d, length %d)\n", buf, - vtxbuf.buffer_offset, num_vertices * vtxbuf.stride); + userbuf = pipe->buffer_map(pipe, buf, 0, PIPE_MAP_READ, &box, + &(sw_internal->transfers_so[i])); + vbuffer[j].is_user_buffer = true; + vbuffer[j].buffer.user = userbuf; - u_box_1d(vtxbuf.buffer_offset + offset + start_vertice * vtxbuf.stride, - num_vertices * vtxbuf.stride, &box); - - userbuf = pipe->buffer_map(pipe, buf, 0, PIPE_MAP_READ, &box, - &(sw_internal->transfers_so[i])); - vtxbuf.is_user_buffer = true; - vtxbuf.buffer.user = userbuf; - - if (!device->driver_caps.user_sw_vbufs) { - vtxbuf.buffer.resource = NULL; - vtxbuf.is_user_buffer = false; - u_upload_data(device->pipe_sw->stream_uploader, - 0, - box.width, - 16, - userbuf, - &(vtxbuf.buffer_offset), - &(vtxbuf.buffer.resource)); - u_upload_unmap(device->pipe_sw->stream_uploader); - } - pipe_sw->set_vertex_buffers(pipe_sw, i, 1, 0, false, &vtxbuf); - pipe_vertex_buffer_unreference(&vtxbuf); - } else - pipe_sw->set_vertex_buffers(pipe_sw, i, 0, 1, false, NULL); + if (!device->driver_caps.user_sw_vbufs) { + vbuffer[j].buffer.resource = NULL; + vbuffer[j].is_user_buffer = false; + u_upload_data(device->pipe_sw->stream_uploader, + 0, + box.width, + 16, + userbuf, + &(vbuffer[j].buffer_offset), + &(vbuffer[j].buffer.resource)); + u_upload_unmap(device->pipe_sw->stream_uploader); + } + j++; } } + + vtxbuf_count = j; + pipe_sw->set_vertex_buffers(pipe_sw, vtxbuf_count, device->caps.MaxStreams-vtxbuf_count, true, vbuffer); + nine_context_get_pipe_release(device); } @@ -3346,14 +3379,15 @@ nine_state_prepare_draw_sw(struct NineDevice9 *device, struct NineVertexDeclarat struct nine_state *state = &device->state; bool programmable_vs = state->vs && !(state->vdecl && state->vdecl->position_t); struct NineVertexShader9 *vs = programmable_vs ? device->state.vs : device->ff.vs; + int dummy_vbo_stream; assert(programmable_vs); DBG("Preparing draw\n"); cso_set_vertex_shader_handle(device->cso_sw, NineVertexShader9_GetVariantProcessVertices(vs, vdecl_out, so)); - update_vertex_elements_sw(device); - update_vertex_buffers_sw(device, start_vertice, num_vertices); + dummy_vbo_stream = update_vertex_elements_sw(device); + update_vertex_buffers_sw(device, dummy_vbo_stream, start_vertice, num_vertices); update_vs_constants_sw(device); DBG("Preparation succeeded\n"); } @@ -3366,8 +3400,8 @@ nine_state_after_draw_sw(struct NineDevice9 *device) struct pipe_context *pipe_sw = device->pipe_sw; int i; + pipe_sw->set_vertex_buffers(pipe_sw, 0, device->caps.MaxStreams, false, NULL); for (i = 0; i < 4; i++) { - pipe_sw->set_vertex_buffers(pipe_sw, i, 0, 1, false, NULL); if (sw_internal->transfers_so[i]) pipe->buffer_unmap(pipe, sw_internal->transfers_so[i]); sw_internal->transfers_so[i] = NULL; diff --git a/src/gallium/frontends/nine/nine_state.h b/src/gallium/frontends/nine/nine_state.h index b1fc90ed0e4..d32e3e98a5b 100644 --- a/src/gallium/frontends/nine/nine_state.h +++ b/src/gallium/frontends/nine/nine_state.h @@ -215,7 +215,9 @@ struct nine_state struct NineIndexBuffer9 *idxbuf; struct NineVertexBuffer9 *stream[PIPE_MAX_ATTRIBS]; + uint32_t stream_mask; /* i bit set for *stream[i] not NULL */ struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; /* vtxbuf.buffer unused */ + unsigned last_vtxbuf_count; UINT stream_freq[PIPE_MAX_ATTRIBS]; struct pipe_clip_state clip; @@ -283,6 +285,8 @@ struct nine_context { struct NineVertexDeclaration9 *vdecl; struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; + uint32_t vtxbuf_mask; /* i bit set for context->vtxbuf[i].buffer.resource not NULL */ + uint32_t last_vtxbuf_count; UINT stream_freq[PIPE_MAX_ATTRIBS]; uint32_t stream_instancedata_mask; /* derived from stream_freq */ uint32_t stream_usage_mask; /* derived from VS and vdecl */ @@ -318,7 +322,6 @@ struct nine_context { uint16_t enabled_samplers_mask_ps; int dummy_vbo_bound_at; /* -1 = not bound , >= 0 = bound index */ - bool vbo_bound_done; bool inline_constants; diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 8f93d94eaef..0c8d81cdf8e 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -604,7 +604,6 @@ struct pipe_context { /** * Bind an array of vertex buffers to the specified slots. * - * \param start_slot first vertex buffer slot * \param count number of consecutive vertex buffers to bind. * \param unbind_num_trailing_slots unbind slots after the bound slots * \param take_ownership the caller holds buffer references and they @@ -613,7 +612,6 @@ struct pipe_context { * \param buffers array of the buffers to bind */ void (*set_vertex_buffers)(struct pipe_context *, - unsigned start_slot, unsigned num_buffers, unsigned unbind_num_trailing_slots, bool take_ownership, diff --git a/src/gallium/tests/trivial/quad-tex.c b/src/gallium/tests/trivial/quad-tex.c index 11bf0c8a7c9..7ce51a04225 100644 --- a/src/gallium/tests/trivial/quad-tex.c +++ b/src/gallium/tests/trivial/quad-tex.c @@ -335,7 +335,7 @@ static void draw(struct program *p) cso_set_vertex_elements(p->cso, &p->velem); util_draw_vertex_buffer(p->pipe, p->cso, - p->vbuf, 0, 0, + p->vbuf, 0, MESA_PRIM_QUADS, 4, /* verts */ 2); /* attribs/vert */ diff --git a/src/gallium/tests/trivial/tri.c b/src/gallium/tests/trivial/tri.c index 5681485c540..f8afc94feb0 100644 --- a/src/gallium/tests/trivial/tri.c +++ b/src/gallium/tests/trivial/tri.c @@ -267,7 +267,7 @@ static void draw(struct program *p) cso_set_vertex_elements(p->cso, &p->velem); util_draw_vertex_buffer(p->pipe, p->cso, - p->vbuf, 0, 0, + p->vbuf, 0, MESA_PRIM_TRIANGLES, 3, /* verts */ 2); /* attribs/vert */ diff --git a/src/gallium/tools/trace/dump_state.py b/src/gallium/tools/trace/dump_state.py index 9c439ea02f4..043b0468153 100755 --- a/src/gallium/tools/trace/dump_state.py +++ b/src/gallium/tools/trace/dump_state.py @@ -471,8 +471,8 @@ class Context(Dispatcher): # XXX: deprecated self._state.vs.sampler_views = views - def set_vertex_buffers(self, start_slot, num_buffers, unbind_num_trailing_slots, take_ownership, buffers): - self._update(self._state.vertex_buffers, start_slot, num_buffers, buffers) + def set_vertex_buffers(self, num_buffers, unbind_num_trailing_slots, take_ownership, buffers): + self._update(self._state.vertex_buffers, 0, num_buffers, buffers) def create_vertex_elements_state(self, num_elements, elements): return elements[0:num_elements] diff --git a/src/mesa/state_tracker/st_atom_array.cpp b/src/mesa/state_tracker/st_atom_array.cpp index 1398e8aa454..02a7b377573 100644 --- a/src/mesa/state_tracker/st_atom_array.cpp +++ b/src/mesa/state_tracker/st_atom_array.cpp @@ -357,7 +357,7 @@ st_update_array_templ(struct st_context *st, st->uses_user_vertex_buffers = uses_user_vertex_buffers; } else { /* Only vertex buffers. */ - cso_set_vertex_buffers(cso, 0, num_vbuffers, unbind_trailing_vbuffers, + cso_set_vertex_buffers(cso, num_vbuffers, unbind_trailing_vbuffers, true, vbuffer); /* This can change only when we update vertex elements. */ assert(st->uses_user_vertex_buffers == uses_user_vertex_buffers); diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c index 705fa83335a..419a0451996 100644 --- a/src/mesa/state_tracker/st_cb_drawtex.c +++ b/src/mesa/state_tracker/st_cb_drawtex.c @@ -295,7 +295,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, cso_set_viewport(cso, &vp); } - util_draw_vertex_buffer(pipe, cso, vbuffer, 0, + util_draw_vertex_buffer(pipe, cso, vbuffer, offset, /* offset */ MESA_PRIM_TRIANGLE_FAN, 4, /* verts */ diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 0191d7670e8..5307bf71e13 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -477,7 +477,7 @@ st_draw_quad(struct st_context *st, u_upload_unmap(st->pipe->stream_uploader); - cso_set_vertex_buffers(st->cso_context, 0, 1, 0, false, &vb); + cso_set_vertex_buffers(st->cso_context, 1, 0, false, &vb); st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); if (num_instances > 1) { diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 3544cb1213f..8faab0d3f26 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -166,7 +166,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, } } - draw_set_vertex_buffers(draw, 0, num_vbuffers, 0, vbuffers); + draw_set_vertex_buffers(draw, num_vbuffers, 0, vbuffers); draw_set_vertex_elements(draw, vp->num_inputs, velements.velems); if (info->index_size) { @@ -465,7 +465,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, if (!vbuffers[buf].is_user_buffer) pipe_resource_reference(&vbuffers[buf].buffer.resource, NULL); } - draw_set_vertex_buffers(draw, 0, 0, num_vbuffers, NULL); + draw_set_vertex_buffers(draw, 0, num_vbuffers, NULL); draw_bind_vertex_shader(draw, NULL); } diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index 0238f26c2f5..aa40f947a0e 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -246,7 +246,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr, cso_set_vertex_elements(cso, &velem); - cso_set_vertex_buffers(cso, 0, 1, 0, false, &vbo); + cso_set_vertex_buffers(cso, 1, 0, false, &vbo); st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1); pipe_resource_reference(&vbo.buffer.resource, NULL);