gallium: remove unbind_trailing_count from set_vertex_buffers

It should implicitly unbind all bound buffers after "count".
This also slightly simplies u_vbuf.

This is a cleanup suggested by:
    https://gitlab.freedesktop.org/mesa/mesa/-/issues/8142

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> (asahi & panfrost)
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26309>
This commit is contained in:
Marek Olšák 2023-11-20 13:48:09 -05:00 committed by Marge Bot
parent 2725b095ea
commit eb20ef9277
79 changed files with 321 additions and 455 deletions

View file

@ -1287,25 +1287,19 @@ cso_restore_vertex_elements(struct cso_context_priv *ctx)
void void
cso_set_vertex_buffers(struct cso_context *cso, cso_set_vertex_buffers(struct cso_context *cso,
unsigned count, unsigned count,
unsigned unbind_trailing_count,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct cso_context_priv *ctx = (struct cso_context_priv *)cso; struct cso_context_priv *ctx = (struct cso_context_priv *)cso;
struct u_vbuf *vbuf = ctx->vbuf_current; struct u_vbuf *vbuf = ctx->vbuf_current;
if (!count && !unbind_trailing_count)
return;
if (vbuf) { if (vbuf) {
u_vbuf_set_vertex_buffers(vbuf, count, unbind_trailing_count, u_vbuf_set_vertex_buffers(vbuf, count, take_ownership, buffers);
take_ownership, buffers);
return; return;
} }
struct pipe_context *pipe = ctx->base.pipe; struct pipe_context *pipe = ctx->base.pipe;
pipe->set_vertex_buffers(pipe, count, unbind_trailing_count, pipe->set_vertex_buffers(pipe, count, take_ownership, buffers);
take_ownership, buffers);
} }
@ -1325,7 +1319,6 @@ void
cso_set_vertex_buffers_and_elements(struct cso_context *cso, cso_set_vertex_buffers_and_elements(struct cso_context *cso,
const struct cso_velems_state *velems, const struct cso_velems_state *velems,
unsigned vb_count, unsigned vb_count,
unsigned unbind_trailing_vb_count,
bool take_ownership, bool take_ownership,
bool uses_user_vertex_buffers, bool uses_user_vertex_buffers,
const struct pipe_vertex_buffer *vbuffers) const struct pipe_vertex_buffer *vbuffers)
@ -1337,45 +1330,32 @@ cso_set_vertex_buffers_and_elements(struct cso_context *cso,
if (vbuf && (ctx->always_use_vbuf || uses_user_vertex_buffers)) { if (vbuf && (ctx->always_use_vbuf || uses_user_vertex_buffers)) {
if (!ctx->vbuf_current) { if (!ctx->vbuf_current) {
/* Unbind all buffers in cso_context, because we'll use u_vbuf. */ /* Unbind all buffers in cso_context, because we'll use u_vbuf. */
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count; pipe->set_vertex_buffers(pipe, 0, false, NULL);
if (unbind_vb_count)
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. */ /* Unset this to make sure the CSO is re-bound on the next use. */
ctx->velements = NULL; ctx->velements = NULL;
ctx->vbuf_current = pipe->vbuf = vbuf; ctx->vbuf_current = pipe->vbuf = vbuf;
if (pipe->draw_vbo == tc_draw_vbo) if (pipe->draw_vbo == tc_draw_vbo)
ctx->base.draw_vbo = u_vbuf_draw_vbo; ctx->base.draw_vbo = u_vbuf_draw_vbo;
unbind_trailing_vb_count = 0;
} }
if (vb_count || unbind_trailing_vb_count) { u_vbuf_set_vertex_buffers(vbuf, vb_count, take_ownership, vbuffers);
u_vbuf_set_vertex_buffers(vbuf, vb_count,
unbind_trailing_vb_count,
take_ownership, vbuffers);
}
u_vbuf_set_vertex_elements(vbuf, velems); u_vbuf_set_vertex_elements(vbuf, velems);
return; return;
} }
if (ctx->vbuf_current) { if (ctx->vbuf_current) {
/* Unbind all buffers in u_vbuf, because we'll use cso_context. */ /* Unbind all buffers in u_vbuf, because we'll use cso_context. */
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count; u_vbuf_set_vertex_buffers(vbuf, 0, false, NULL);
if (unbind_vb_count)
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. */ /* Unset this to make sure the CSO is re-bound on the next use. */
u_vbuf_unset_vertex_elements(vbuf); u_vbuf_unset_vertex_elements(vbuf);
ctx->vbuf_current = pipe->vbuf = NULL; ctx->vbuf_current = pipe->vbuf = NULL;
if (pipe->draw_vbo == tc_draw_vbo) if (pipe->draw_vbo == tc_draw_vbo)
ctx->base.draw_vbo = pipe->draw_vbo; ctx->base.draw_vbo = pipe->draw_vbo;
unbind_trailing_vb_count = 0;
} }
if (vb_count || unbind_trailing_vb_count) { pipe->set_vertex_buffers(pipe, vb_count, take_ownership, vbuffers);
pipe->set_vertex_buffers(pipe, vb_count, unbind_trailing_vb_count,
take_ownership, vbuffers);
}
cso_set_vertex_elements_direct(ctx, velems); cso_set_vertex_elements_direct(ctx, velems);
} }
@ -1766,7 +1746,7 @@ cso_restore_state(struct cso_context *ctx, unsigned unbind)
if (state_mask & CSO_BIT_VERTEX_ELEMENTS) if (state_mask & CSO_BIT_VERTEX_ELEMENTS)
cso_restore_vertex_elements(cso); cso_restore_vertex_elements(cso);
if (unbind & CSO_UNBIND_VERTEX_BUFFER0) if (unbind & CSO_UNBIND_VERTEX_BUFFER0)
cso->base.pipe->set_vertex_buffers(cso->base.pipe, 0, 1, false, NULL); cso->base.pipe->set_vertex_buffers(cso->base.pipe, 0, false, NULL);
if (state_mask & CSO_BIT_STREAM_OUTPUTS) if (state_mask & CSO_BIT_STREAM_OUTPUTS)
cso_restore_stream_outputs(cso); cso_restore_stream_outputs(cso);
if (state_mask & CSO_BIT_PAUSE_QUERIES) if (state_mask & CSO_BIT_PAUSE_QUERIES)

View file

@ -95,7 +95,6 @@ cso_set_vertex_elements(struct cso_context *ctx,
void cso_set_vertex_buffers(struct cso_context *ctx, void cso_set_vertex_buffers(struct cso_context *ctx,
unsigned count, unsigned count,
unsigned unbind_trailing_count,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers); const struct pipe_vertex_buffer *buffers);
@ -205,7 +204,6 @@ void
cso_set_vertex_buffers_and_elements(struct cso_context *ctx, cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
const struct cso_velems_state *velems, const struct cso_velems_state *velems,
unsigned vb_count, unsigned vb_count,
unsigned unbind_trailing_vb_count,
bool take_ownership, bool take_ownership,
bool uses_user_vertex_buffers, bool uses_user_vertex_buffers,
const struct pipe_vertex_buffer *vbuffers); const struct pipe_vertex_buffer *vbuffers);

View file

@ -405,15 +405,13 @@ draw_set_viewport_states(struct draw_context *draw,
void void
draw_set_vertex_buffers(struct draw_context *draw, draw_set_vertex_buffers(struct draw_context *draw,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
assert(count <= PIPE_MAX_ATTRIBS); assert(count <= PIPE_MAX_ATTRIBS);
util_set_vertex_buffers_count(draw->pt.vertex_buffer, util_set_vertex_buffers_count(draw->pt.vertex_buffer,
&draw->pt.nr_vertex_buffers, &draw->pt.nr_vertex_buffers,
buffers, count, buffers, count, false);
unbind_num_trailing_slots, false);
} }

View file

@ -321,7 +321,6 @@ void draw_delete_mesh_shader(struct draw_context *draw,
void draw_set_vertex_buffers(struct draw_context *draw, void draw_set_vertex_buffers(struct draw_context *draw,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers); const struct pipe_vertex_buffer *buffers);
void draw_set_vertex_elements(struct draw_context *draw, void draw_set_vertex_elements(struct draw_context *draw,

View file

@ -571,7 +571,6 @@ dd_context_set_shader_buffers(struct pipe_context *_pipe,
static void static void
dd_context_set_vertex_buffers(struct pipe_context *_pipe, dd_context_set_vertex_buffers(struct pipe_context *_pipe,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -580,11 +579,12 @@ dd_context_set_vertex_buffers(struct pipe_context *_pipe,
safe_memcpy(&dctx->draw_state.vertex_buffers[0], buffers, safe_memcpy(&dctx->draw_state.vertex_buffers[0], buffers,
sizeof(buffers[0]) * num_buffers); sizeof(buffers[0]) * num_buffers);
safe_memcpy(&dctx->draw_state.vertex_buffers[num_buffers], NULL, if (dctx->num_vertex_buffers > num_buffers) {
sizeof(buffers[0]) * unbind_num_trailing_slots); safe_memcpy(&dctx->draw_state.vertex_buffers[num_buffers], NULL,
pipe->set_vertex_buffers(pipe, num_buffers, sizeof(buffers[0]) * (dctx->num_vertex_buffers - num_buffers));
unbind_num_trailing_slots, take_ownership, }
buffers); pipe->set_vertex_buffers(pipe, num_buffers, take_ownership, buffers);
dctx->num_vertex_buffers = num_buffers;
} }
static void static void

View file

@ -302,6 +302,7 @@ struct dd_context
struct dd_draw_state draw_state; struct dd_draw_state draw_state;
unsigned num_draw_calls; unsigned num_draw_calls;
unsigned num_vertex_buffers;
struct u_log_context log; struct u_log_context log;

View file

@ -215,7 +215,6 @@ static void noop_delete_state(struct pipe_context *ctx, void *state)
static void noop_set_vertex_buffers(struct pipe_context *ctx, static void noop_set_vertex_buffers(struct pipe_context *ctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {

View file

@ -1238,7 +1238,6 @@ trace_context_set_sampler_views(struct pipe_context *_pipe,
static void static void
trace_context_set_vertex_buffers(struct pipe_context *_pipe, trace_context_set_vertex_buffers(struct pipe_context *_pipe,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -1249,16 +1248,13 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe,
trace_dump_arg(ptr, pipe); trace_dump_arg(ptr, pipe);
trace_dump_arg(uint, num_buffers); trace_dump_arg(uint, num_buffers);
trace_dump_arg(uint, unbind_num_trailing_slots);
trace_dump_arg(bool, take_ownership); trace_dump_arg(bool, take_ownership);
trace_dump_arg_begin("buffers"); trace_dump_arg_begin("buffers");
trace_dump_struct_array(vertex_buffer, buffers, num_buffers); trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
trace_dump_arg_end(); trace_dump_arg_end();
pipe->set_vertex_buffers(pipe, num_buffers, pipe->set_vertex_buffers(pipe, num_buffers, take_ownership, buffers);
unbind_num_trailing_slots, take_ownership,
buffers);
trace_dump_call_end(); trace_dump_call_end();
} }

View file

@ -112,7 +112,7 @@ hud_draw_colored_prims(struct hud_context *hud, unsigned prim,
&vbuffer.buffer_offset, &vbuffer.buffer.resource); &vbuffer.buffer_offset, &vbuffer.buffer.resource);
u_upload_unmap(hud->pipe->stream_uploader); u_upload_unmap(hud->pipe->stream_uploader);
cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_set_vertex_buffers(cso, 1, false, &vbuffer);
pipe_resource_reference(&vbuffer.buffer.resource, NULL); pipe_resource_reference(&vbuffer.buffer.resource, NULL);
cso_set_fragment_shader_handle(hud->cso, hud->fs_color); cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
cso_draw_arrays(cso, prim, 0, num_vertices); cso_draw_arrays(cso, prim, 0, num_vertices);
@ -601,7 +601,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex)
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, &hud->constbuf); pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, &hud->constbuf);
cso_set_vertex_buffers(cso, 1, 0, false, &hud->bg.vbuf); cso_set_vertex_buffers(cso, 1, false, &hud->bg.vbuf);
cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->bg.num_vertices); cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->bg.num_vertices);
} }
pipe_resource_reference(&hud->bg.vbuf.buffer.resource, NULL); pipe_resource_reference(&hud->bg.vbuf.buffer.resource, NULL);
@ -610,7 +610,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex)
if (hud->text.num_vertices) { if (hud->text.num_vertices) {
cso_set_vertex_shader_handle(cso, hud->vs_text); cso_set_vertex_shader_handle(cso, hud->vs_text);
cso_set_vertex_elements(cso, &hud->text_velems); cso_set_vertex_elements(cso, &hud->text_velems);
cso_set_vertex_buffers(cso, 1, 0, false, &hud->text.vbuf); cso_set_vertex_buffers(cso, 1, false, &hud->text.vbuf);
cso_set_fragment_shader_handle(hud->cso, hud->fs_text); cso_set_fragment_shader_handle(hud->cso, hud->fs_text);
cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->text.num_vertices); cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->text.num_vertices);
cso_set_vertex_elements(cso, &hud->velems); cso_set_vertex_elements(cso, &hud->velems);
@ -635,7 +635,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex)
if (hud->whitelines.num_vertices) { if (hud->whitelines.num_vertices) {
cso_set_vertex_shader_handle(cso, hud->vs_color); cso_set_vertex_shader_handle(cso, hud->vs_color);
cso_set_vertex_buffers(cso, 1, 0, false, &hud->whitelines.vbuf); cso_set_vertex_buffers(cso, 1, false, &hud->whitelines.vbuf);
cso_set_fragment_shader_handle(hud->cso, hud->fs_color); cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
cso_draw_arrays(cso, MESA_PRIM_LINES, 0, hud->whitelines.num_vertices); cso_draw_arrays(cso, MESA_PRIM_LINES, 0, hud->whitelines.num_vertices);
} }

View file

@ -643,10 +643,12 @@ void util_blitter_restore_vertex_states(struct blitter_context *blitter)
unsigned i; unsigned i;
/* Vertex buffer. */ /* Vertex buffer. */
if (ctx->base.saved_vertex_buffer.buffer.resource) { if (ctx->base.saved_num_vb) {
pipe->set_vertex_buffers(pipe, 1, 0, true, pipe->set_vertex_buffers(pipe, ctx->base.saved_num_vb, true,
&ctx->base.saved_vertex_buffer); ctx->base.saved_vertex_buffers);
ctx->base.saved_vertex_buffer.buffer.resource = NULL; memset(ctx->base.saved_vertex_buffers, 0,
sizeof(ctx->base.saved_vertex_buffers[0]) * ctx->base.saved_num_vb);
ctx->base.saved_num_vb = 0;
} }
/* Vertex elements. */ /* Vertex elements. */
@ -1409,7 +1411,7 @@ static void blitter_draw(struct blitter_context_priv *ctx,
return; return;
u_upload_unmap(pipe->stream_uploader); u_upload_unmap(pipe->stream_uploader);
pipe->set_vertex_buffers(pipe, 1, 0, false, &vb); pipe->set_vertex_buffers(pipe, 1, false, &vb);
pipe->bind_vertex_elements_state(pipe, vertex_elements_cso); pipe->bind_vertex_elements_state(pipe, vertex_elements_cso);
pipe->bind_vs_state(pipe, get_vs(&ctx->base)); pipe->bind_vs_state(pipe, get_vs(&ctx->base));
@ -2631,7 +2633,7 @@ void util_blitter_clear_buffer(struct blitter_context *blitter,
blitter_check_saved_vertex_states(ctx); blitter_check_saved_vertex_states(ctx);
blitter_disable_render_cond(ctx); blitter_disable_render_cond(ctx);
pipe->set_vertex_buffers(pipe, 1, 0, false, &vb); pipe->set_vertex_buffers(pipe, 1, false, &vb);
pipe->bind_vertex_elements_state(pipe, pipe->bind_vertex_elements_state(pipe,
ctx->velem_state_readbuf[num_channels-1]); ctx->velem_state_readbuf[num_channels-1]);
bind_vs_pos_only(ctx, num_channels); bind_vs_pos_only(ctx, num_channels);

View file

@ -129,7 +129,8 @@ struct blitter_context
unsigned cb_slot; unsigned cb_slot;
struct pipe_constant_buffer saved_fs_constant_buffer; struct pipe_constant_buffer saved_fs_constant_buffer;
struct pipe_vertex_buffer saved_vertex_buffer; unsigned saved_num_vb;
struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
unsigned saved_num_so_targets; unsigned saved_num_so_targets;
struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS]; struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
@ -532,11 +533,15 @@ util_blitter_save_fragment_constant_buffer_slot(
} }
static inline void static inline void
util_blitter_save_vertex_buffer_slot(struct blitter_context *blitter, util_blitter_save_vertex_buffers(struct blitter_context *blitter,
struct pipe_vertex_buffer *vertex_buffers) struct pipe_vertex_buffer *vertex_buffers,
unsigned count)
{ {
pipe_vertex_buffer_reference(&blitter->saved_vertex_buffer, for (unsigned i = 0; i < count; i++) {
&vertex_buffers[0]); pipe_vertex_buffer_reference(&blitter->saved_vertex_buffers[i],
&vertex_buffers[i]);
}
blitter->saved_num_vb = count;
} }
static inline void static inline void

View file

@ -59,10 +59,10 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
/* note: vertex elements already set by caller */ /* note: vertex elements already set by caller */
if (cso) { if (cso) {
cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_set_vertex_buffers(cso, 1, false, &vbuffer);
cso_draw_arrays(cso, prim_type, 0, num_verts); cso_draw_arrays(cso, prim_type, 0, num_verts);
} else { } else {
pipe->set_vertex_buffers(pipe, 1, 0, false, &vbuffer); pipe->set_vertex_buffers(pipe, 1, false, &vbuffer);
util_draw_arrays(pipe, prim_type, 0, num_verts); util_draw_arrays(pipe, prim_type, 0, num_verts);
} }
} }
@ -86,7 +86,7 @@ util_draw_user_vertex_buffer(struct cso_context *cso, void *buffer,
/* note: vertex elements already set by caller */ /* note: vertex elements already set by caller */
cso_set_vertex_buffers(cso, 1, 0, false, &vbuffer); cso_set_vertex_buffers(cso, 1, false, &vbuffer);
cso_draw_arrays(cso, prim_type, 0, num_verts); cso_draw_arrays(cso, prim_type, 0, num_verts);
} }
@ -104,6 +104,6 @@ util_draw_user_vertices(struct cso_context *cso, struct cso_velems_state *ve,
vbuffer.is_user_buffer = true; vbuffer.is_user_buffer = true;
vbuffer.buffer.user = buffer; vbuffer.buffer.user = buffer;
cso_set_vertex_buffers_and_elements(cso, ve, 1, 0, false, true, &vbuffer); cso_set_vertex_buffers_and_elements(cso, ve, 1, false, true, &vbuffer);
cso_draw_arrays(cso, prim_type, 0, num_verts); cso_draw_arrays(cso, prim_type, 0, num_verts);
} }

View file

@ -48,16 +48,16 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
uint32_t *enabled_buffers, uint32_t *enabled_buffers,
const struct pipe_vertex_buffer *src, const struct pipe_vertex_buffer *src,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership) bool take_ownership)
{ {
unsigned i; unsigned last_count = util_last_bit(*enabled_buffers);
uint32_t bitmask = 0; uint32_t bitmask = 0;
unsigned i = 0;
*enabled_buffers &= ~BITFIELD_MASK(count); assert(!count || src);
if (src) { if (src) {
for (i = 0; i < count; i++) { for (; i < count; i++) {
if (src[i].buffer.resource) if (src[i].buffer.resource)
bitmask |= 1 << i; bitmask |= 1 << i;
@ -69,17 +69,12 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
/* Copy over the other members of pipe_vertex_buffer. */ /* Copy over the other members of pipe_vertex_buffer. */
memcpy(dst, src, count * sizeof(struct pipe_vertex_buffer)); memcpy(dst, src, count * sizeof(struct pipe_vertex_buffer));
*enabled_buffers |= bitmask;
}
else {
/* Unreference the buffers. */
for (i = 0; i < count; i++)
pipe_vertex_buffer_unreference(&dst[i]);
} }
for (i = 0; i < unbind_num_trailing_slots; i++) *enabled_buffers = bitmask;
pipe_vertex_buffer_unreference(&dst[count + i]);
for (; i < last_count; i++)
pipe_vertex_buffer_unreference(&dst[i]);
} }
/** /**
@ -90,19 +85,16 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
unsigned *dst_count, unsigned *dst_count,
const struct pipe_vertex_buffer *src, const struct pipe_vertex_buffer *src,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership) bool take_ownership)
{ {
unsigned i;
uint32_t enabled_buffers = 0; uint32_t enabled_buffers = 0;
for (i = 0; i < *dst_count; i++) { for (unsigned i = 0; i < *dst_count; i++) {
if (dst[i].buffer.resource) if (dst[i].buffer.resource)
enabled_buffers |= (1ull << i); enabled_buffers |= (1ull << i);
} }
util_set_vertex_buffers_mask(dst, &enabled_buffers, src, util_set_vertex_buffers_mask(dst, &enabled_buffers, src, count,
count, unbind_num_trailing_slots,
take_ownership); take_ownership);
*dst_count = util_last_bit(enabled_buffers); *dst_count = util_last_bit(enabled_buffers);

View file

@ -41,14 +41,12 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
uint32_t *enabled_buffers, uint32_t *enabled_buffers,
const struct pipe_vertex_buffer *src, const struct pipe_vertex_buffer *src,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership); bool take_ownership);
void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
unsigned *dst_count, unsigned *dst_count,
const struct pipe_vertex_buffer *src, const struct pipe_vertex_buffer *src,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership); bool take_ownership);
void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst, void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst,

View file

@ -945,7 +945,7 @@ tc_add_all_gfx_bindings_to_buffer_list(struct threaded_context *tc)
{ {
BITSET_WORD *buffer_list = tc->buffer_lists[tc->next_buf_list].buffer_list; BITSET_WORD *buffer_list = tc->buffer_lists[tc->next_buf_list].buffer_list;
tc_add_bindings_to_buffer_list(buffer_list, tc->vertex_buffers, tc->max_vertex_buffers); tc_add_bindings_to_buffer_list(buffer_list, tc->vertex_buffers, tc->num_vertex_buffers);
if (tc->seen_streamout_buffers) if (tc->seen_streamout_buffers)
tc_add_bindings_to_buffer_list(buffer_list, tc->streamout_buffers, PIPE_MAX_SO_BUFFERS); tc_add_bindings_to_buffer_list(buffer_list, tc->streamout_buffers, PIPE_MAX_SO_BUFFERS);
@ -981,7 +981,7 @@ tc_rebind_buffer(struct threaded_context *tc, uint32_t old_id, uint32_t new_id,
unsigned vbo = 0, so = 0; unsigned vbo = 0, so = 0;
vbo = tc_rebind_bindings(old_id, new_id, tc->vertex_buffers, vbo = tc_rebind_bindings(old_id, new_id, tc->vertex_buffers,
tc->max_vertex_buffers); tc->num_vertex_buffers);
if (vbo) if (vbo)
*rebind_mask |= BITFIELD_BIT(TC_BINDING_VERTEX_BUFFER); *rebind_mask |= BITFIELD_BIT(TC_BINDING_VERTEX_BUFFER);
@ -2153,7 +2153,6 @@ tc_set_shader_buffers(struct pipe_context *_pipe,
struct tc_vertex_buffers { struct tc_vertex_buffers {
struct tc_call_base base; struct tc_call_base base;
uint8_t count; uint8_t count;
uint8_t unbind_num_trailing_slots;
struct pipe_vertex_buffer slot[0]; /* more will be allocated if needed */ struct pipe_vertex_buffer slot[0]; /* more will be allocated if needed */
}; };
@ -2164,34 +2163,31 @@ tc_call_set_vertex_buffers(struct pipe_context *pipe, void *call)
unsigned count = p->count; unsigned count = p->count;
if (!count) { if (!count) {
pipe->set_vertex_buffers(pipe, 0, p->unbind_num_trailing_slots, false, NULL); pipe->set_vertex_buffers(pipe, 0, false, NULL);
return call_size(tc_vertex_buffers); return call_size(tc_vertex_buffers);
} }
for (unsigned i = 0; i < count; i++) for (unsigned i = 0; i < count; i++)
tc_assert(!p->slot[i].is_user_buffer); tc_assert(!p->slot[i].is_user_buffer);
pipe->set_vertex_buffers(pipe, count, p->unbind_num_trailing_slots, true, p->slot); pipe->set_vertex_buffers(pipe, count, true, p->slot);
return p->base.num_slots; return p->base.num_slots;
} }
static void static void
tc_set_vertex_buffers(struct pipe_context *_pipe, tc_set_vertex_buffers(struct pipe_context *_pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct threaded_context *tc = threaded_context(_pipe); struct threaded_context *tc = threaded_context(_pipe);
if (!count && !unbind_num_trailing_slots) assert(!count || buffers);
return;
if (count && buffers) { if (count) {
struct tc_vertex_buffers *p = struct tc_vertex_buffers *p =
tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, count); tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, count);
p->count = count; p->count = count;
p->unbind_num_trailing_slots = unbind_num_trailing_slots;
struct tc_buffer_list *next = &tc->buffer_lists[tc->next_buf_list]; struct tc_buffer_list *next = &tc->buffer_lists[tc->next_buf_list];
@ -2225,18 +2221,16 @@ tc_set_vertex_buffers(struct pipe_context *_pipe,
} }
} }
} }
tc_unbind_buffers(&tc->vertex_buffers[count],
unbind_num_trailing_slots);
} else { } else {
struct tc_vertex_buffers *p = struct tc_vertex_buffers *p =
tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, 0); tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, 0);
p->count = 0; p->count = 0;
p->unbind_num_trailing_slots = count + unbind_num_trailing_slots;
tc_unbind_buffers(&tc->vertex_buffers[0],
count + unbind_num_trailing_slots);
} }
/* We don't need to unbind trailing buffers because we never touch bindings
* after num_vertex_buffers.
*/
tc->num_vertex_buffers = count;
} }
struct tc_stream_outputs { struct tc_stream_outputs {
@ -5285,8 +5279,6 @@ threaded_context_create(struct pipe_context *pipe,
/* If you have different limits in each shader stage, set the maximum. */ /* If you have different limits in each shader stage, set the maximum. */
struct pipe_screen *screen = pipe->screen;; struct pipe_screen *screen = pipe->screen;;
tc->max_vertex_buffers =
screen->get_param(screen, PIPE_CAP_MAX_VERTEX_BUFFERS);
tc->max_const_buffers = tc->max_const_buffers =
screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
PIPE_SHADER_CAP_MAX_CONST_BUFFERS); PIPE_SHADER_CAP_MAX_CONST_BUFFERS);

View file

@ -616,7 +616,7 @@ struct threaded_context {
int8_t last_completed; int8_t last_completed;
unsigned max_vertex_buffers; uint8_t num_vertex_buffers;
unsigned max_const_buffers; unsigned max_const_buffers;
unsigned max_shader_buffers; unsigned max_shader_buffers;
unsigned max_images; unsigned max_images;

View file

@ -171,6 +171,9 @@ struct u_vbuf {
/* This is what was set in set_vertex_buffers. /* This is what was set in set_vertex_buffers.
* May contain user buffers. */ * May contain user buffers. */
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
uint8_t num_vertex_buffers;
uint8_t num_real_vertex_buffers;
bool vertex_buffers_dirty;
uint32_t enabled_vb_mask; uint32_t enabled_vb_mask;
uint32_t unaligned_vb_mask[2]; //16/32bit uint32_t unaligned_vb_mask[2]; //16/32bit
@ -178,8 +181,6 @@ struct u_vbuf {
/* Vertex buffers for the driver. /* Vertex buffers for the driver.
* There are usually no user buffers. */ * There are usually no user buffers. */
struct pipe_vertex_buffer real_vertex_buffer[PIPE_MAX_ATTRIBS]; struct pipe_vertex_buffer real_vertex_buffer[PIPE_MAX_ATTRIBS];
uint32_t dirty_real_vb_mask; /* which buffers are dirty since the last
call of set_vertex_buffers */
/* Vertex elements. */ /* Vertex elements. */
struct u_vbuf_elements *ve, *ve_saved; struct u_vbuf_elements *ve, *ve_saved;
@ -441,12 +442,9 @@ void u_vbuf_unset_vertex_elements(struct u_vbuf *mgr)
void u_vbuf_destroy(struct u_vbuf *mgr) void u_vbuf_destroy(struct u_vbuf *mgr)
{ {
struct pipe_screen *screen = mgr->pipe->screen;
unsigned i; unsigned i;
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, num_vb, false, NULL); mgr->pipe->set_vertex_buffers(mgr->pipe, 0, false, NULL);
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) for (i = 0; i < PIPE_MAX_ATTRIBS; i++)
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]); pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]);
@ -672,7 +670,9 @@ u_vbuf_translate_find_free_vb_slots(struct u_vbuf *mgr,
for (type = 0; type < VB_NUM; type++) { for (type = 0; type < VB_NUM; type++) {
if (mask[type]) { if (mask[type]) {
mgr->dirty_real_vb_mask |= 1 << fallback_vbs[type]; mgr->num_real_vertex_buffers =
MAX2(mgr->num_real_vertex_buffers, fallback_vbs[type] + 1);
mgr->vertex_buffers_dirty = true;
} }
} }
@ -863,8 +863,11 @@ static void u_vbuf_translate_end(struct u_vbuf *mgr)
mgr->fallback_vbs[i] = ~0; mgr->fallback_vbs[i] = ~0;
} }
} }
/* This will cause the buffer to be unbound in the driver later. */ /* This will cause the fallback buffers above num_vertex_buffers to be
mgr->dirty_real_vb_mask |= mgr->fallback_vbs_mask; * unbound.
*/
mgr->num_real_vertex_buffers = mgr->num_vertex_buffers;
mgr->vertex_buffers_dirty = true;
mgr->fallback_vbs_mask = 0; mgr->fallback_vbs_mask = 0;
} }
@ -993,10 +996,34 @@ static void u_vbuf_delete_vertex_elements(void *ctx, void *state,
void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *bufs) const struct pipe_vertex_buffer *bufs)
{ {
if (!count) {
struct pipe_context *pipe = mgr->pipe;
unsigned last_count = mgr->num_vertex_buffers;
/* Unbind. */
mgr->num_vertex_buffers = 0;
mgr->num_real_vertex_buffers = 0;
mgr->user_vb_mask = 0;
mgr->incompatible_vb_mask = 0;
mgr->enabled_vb_mask = 0;
mgr->unaligned_vb_mask[0] = 0;
mgr->unaligned_vb_mask[1] = 0;
mgr->vertex_buffers_dirty = false;
for (unsigned i = 0; i < last_count; i++) {
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]);
pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[i]);
}
pipe->set_vertex_buffers(pipe, 0, false, NULL);
return;
}
assert(bufs);
unsigned i; unsigned i;
/* which buffers are enabled */ /* which buffers are enabled */
uint32_t enabled_vb_mask = 0; uint32_t enabled_vb_mask = 0;
@ -1006,29 +1033,7 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
uint32_t incompatible_vb_mask = 0; uint32_t incompatible_vb_mask = 0;
/* which buffers are unaligned to 2/4 bytes */ /* which buffers are unaligned to 2/4 bytes */
uint32_t unaligned_vb_mask[2] = {0}; uint32_t unaligned_vb_mask[2] = {0};
uint32_t mask = ~BITFIELD64_MASK(count + unbind_num_trailing_slots); unsigned num_identical = 0;
if (!bufs) {
struct pipe_context *pipe = mgr->pipe;
/* Unbind. */
unsigned total_count = count + unbind_num_trailing_slots;
mgr->dirty_real_vb_mask &= mask;
/* Zero out the bits we are going to rewrite completely. */
mgr->user_vb_mask &= mask;
mgr->incompatible_vb_mask &= mask;
mgr->enabled_vb_mask &= mask;
mgr->unaligned_vb_mask[0] &= mask;
mgr->unaligned_vb_mask[1] &= mask;
for (i = 0; i < total_count; i++) {
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]);
pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[i]);
}
pipe->set_vertex_buffers(pipe, count, unbind_num_trailing_slots, false, NULL);
return;
}
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
const struct pipe_vertex_buffer *vb = &bufs[i]; const struct pipe_vertex_buffer *vb = &bufs[i];
@ -1041,20 +1046,11 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
continue; continue;
} }
bool not_user = !vb->is_user_buffer && vb->is_user_buffer == orig_vb->is_user_buffer; /* The structure has holes: do not use memcmp. */
/* struct isn't tightly packed: do not use memcmp */ if (orig_vb->is_user_buffer == vb->is_user_buffer &&
if (not_user && orig_vb->buffer_offset == vb->buffer_offset &&
orig_vb->buffer_offset == vb->buffer_offset && orig_vb->buffer.resource == vb->buffer.resource) { orig_vb->buffer.resource == vb->buffer.resource)
mask |= BITFIELD_BIT(i); num_identical++;
if (take_ownership) {
pipe_vertex_buffer_unreference(orig_vb);
/* the pointer was unset in the line above, so copy it back */
orig_vb->buffer.resource = vb->buffer.resource;
}
if (mask == UINT32_MAX)
return;
continue;
}
if (take_ownership) { if (take_ownership) {
pipe_vertex_buffer_unreference(orig_vb); pipe_vertex_buffer_unreference(orig_vb);
@ -1091,30 +1087,24 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
pipe_vertex_buffer_reference(real_vb, vb); pipe_vertex_buffer_reference(real_vb, vb);
} }
for (i = 0; i < unbind_num_trailing_slots; i++) { unsigned last_count = mgr->num_vertex_buffers;
unsigned dst_index = count + i;
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[dst_index]); if (num_identical == count && count == last_count)
pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[dst_index]); return;
for (; i < last_count; i++) {
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]);
pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[i]);
} }
mgr->num_vertex_buffers = count;
/* Zero out the bits we are going to rewrite completely. */ mgr->num_real_vertex_buffers = count;
mgr->user_vb_mask &= mask; mgr->user_vb_mask = user_vb_mask;
mgr->incompatible_vb_mask &= mask; mgr->incompatible_vb_mask = incompatible_vb_mask;
mgr->enabled_vb_mask &= mask; mgr->enabled_vb_mask = enabled_vb_mask;
mgr->unaligned_vb_mask[0] &= mask; mgr->unaligned_vb_mask[0] = unaligned_vb_mask[0];
mgr->unaligned_vb_mask[1] &= mask; mgr->unaligned_vb_mask[1] = unaligned_vb_mask[1];
mgr->vertex_buffers_dirty = true;
mgr->user_vb_mask |= user_vb_mask;
mgr->incompatible_vb_mask |= incompatible_vb_mask;
mgr->enabled_vb_mask |= enabled_vb_mask;
mgr->unaligned_vb_mask[0] |= unaligned_vb_mask[0];
mgr->unaligned_vb_mask[1] |= unaligned_vb_mask[1];
/* All changed buffers are marked as dirty, even the NULL ones,
* which will cause the NULL buffers to be unbound in the driver later. */
mgr->dirty_real_vb_mask |= ~mask;
} }
static ALWAYS_INLINE bool static ALWAYS_INLINE bool
@ -1403,15 +1393,16 @@ void u_vbuf_get_minmax_index(struct pipe_context *pipe,
static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr) static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr)
{ {
struct pipe_context *pipe = mgr->pipe; struct pipe_context *pipe = mgr->pipe;
unsigned count = util_last_bit(mgr->dirty_real_vb_mask); unsigned count = mgr->num_real_vertex_buffers;
if (mgr->dirty_real_vb_mask == mgr->enabled_vb_mask && assert(mgr->vertex_buffers_dirty);
mgr->dirty_real_vb_mask == mgr->user_vb_mask) {
if (mgr->user_vb_mask == BITFIELD_MASK(count)) {
/* Fast path that allows us to transfer the VBO references to the driver /* Fast path that allows us to transfer the VBO references to the driver
* to skip atomic reference counting there. These are freshly uploaded * to skip atomic reference counting there. These are freshly uploaded
* user buffers that can be discarded after this call. * user buffers that can be discarded after this call.
*/ */
pipe->set_vertex_buffers(pipe, count, 0, true, mgr->real_vertex_buffer); pipe->set_vertex_buffers(pipe, count, true, mgr->real_vertex_buffer);
/* We don't own the VBO references now. Set them to NULL. */ /* We don't own the VBO references now. Set them to NULL. */
for (unsigned i = 0; i < count; i++) { for (unsigned i = 0; i < count; i++) {
@ -1420,9 +1411,9 @@ static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr)
} }
} else { } else {
/* Slow path where we have to keep VBO references. */ /* Slow path where we have to keep VBO references. */
pipe->set_vertex_buffers(pipe, count, 0, false, mgr->real_vertex_buffer); pipe->set_vertex_buffers(pipe, count, false, mgr->real_vertex_buffer);
} }
mgr->dirty_real_vb_mask = 0; mgr->vertex_buffers_dirty = false;
} }
static void static void
@ -1489,7 +1480,7 @@ void u_vbuf_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *inf
mgr->caps.supported_prim_modes & BITFIELD_BIT(info->mode)) { mgr->caps.supported_prim_modes & BITFIELD_BIT(info->mode)) {
/* Set vertex buffers if needed. */ /* Set vertex buffers if needed. */
if (mgr->dirty_real_vb_mask & used_vb_mask) { if (mgr->vertex_buffers_dirty) {
u_vbuf_set_driver_vertex_buffers(mgr); u_vbuf_set_driver_vertex_buffers(mgr);
} }
@ -1740,6 +1731,7 @@ void u_vbuf_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *inf
user_vb_mask &= ~(incompatible_vb_mask | user_vb_mask &= ~(incompatible_vb_mask |
mgr->ve->incompatible_vb_mask_all); mgr->ve->incompatible_vb_mask_all);
mgr->vertex_buffers_dirty = true;
} }
/* Upload user buffers. */ /* Upload user buffers. */
@ -1751,7 +1743,7 @@ void u_vbuf_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *inf
goto cleanup; goto cleanup;
} }
mgr->dirty_real_vb_mask |= user_vb_mask; mgr->vertex_buffers_dirty = true;
} }
/* /*
@ -1776,7 +1768,7 @@ void u_vbuf_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *inf
*/ */
u_upload_unmap(pipe->stream_uploader); u_upload_unmap(pipe->stream_uploader);
if (mgr->dirty_real_vb_mask) if (mgr->vertex_buffers_dirty)
u_vbuf_set_driver_vertex_buffers(mgr); u_vbuf_set_driver_vertex_buffers(mgr);
if ((new_info.index_size == 1 && mgr->caps.rewrite_ubyte_ibs) || if ((new_info.index_size == 1 && mgr->caps.rewrite_ubyte_ibs) ||

View file

@ -82,7 +82,6 @@ void u_vbuf_set_vertex_elements(struct u_vbuf *mgr,
void u_vbuf_unset_vertex_elements(struct u_vbuf *mgr); void u_vbuf_unset_vertex_elements(struct u_vbuf *mgr);
void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *bufs); const struct pipe_vertex_buffer *bufs);
void u_vbuf_draw_vbo(struct pipe_context *pipe, void u_vbuf_draw_vbo(struct pipe_context *pipe,

View file

@ -461,7 +461,7 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->set_vertex_buffers(filter->pipe, 1, false, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4);

View file

@ -739,7 +739,7 @@ vl_compositor_gfx_render(struct vl_compositor_state *s,
c->pipe->set_framebuffer_state(c->pipe, &c->fb_state); c->pipe->set_framebuffer_state(c->pipe, &c->fb_state);
c->pipe->bind_vs_state(c->pipe, c->vs); c->pipe->bind_vs_state(c->pipe, c->vs);
c->pipe->set_vertex_buffers(c->pipe, 1, 0, false, &c->vertex_buf); c->pipe->set_vertex_buffers(c->pipe, 1, false, &c->vertex_buf);
c->pipe->bind_vertex_elements_state(c->pipe, c->vertex_elems_state); 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); pipe_set_constant_buffer(c->pipe, PIPE_SHADER_FRAGMENT, 0, s->shader_params);
c->pipe->bind_rasterizer_state(c->pipe, c->rast); c->pipe->bind_rasterizer_state(c->pipe, c->rast);

View file

@ -479,7 +479,7 @@ vl_deint_filter_render(struct vl_deint_filter *filter,
/* set up pipe state */ /* set up pipe state */
filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state);
filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->set_vertex_buffers(filter->pipe, 1, false, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
filter->pipe->bind_vs_state(filter->pipe, filter->vs); filter->pipe->bind_vs_state(filter->pipe, filter->vs);
filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT, filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,

View file

@ -307,7 +307,7 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter,
filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->set_vertex_buffers(filter->pipe, 1, false, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4);

View file

@ -426,7 +426,7 @@ vl_median_filter_render(struct vl_median_filter *filter,
filter->pipe->bind_fs_state(filter->pipe, filter->fs); filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
filter->pipe->set_vertex_buffers(filter->pipe, 1, 0, false, &filter->quad); filter->pipe->set_vertex_buffers(filter->pipe, 1, false, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves); filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4);

View file

@ -794,7 +794,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder,
if (!ref_frames[j] || !ref_frames[j][i]) continue; if (!ref_frames[j] || !ref_frames[j][i]) continue;
vb[2] = vl_vb_get_mv(&buf->vertex_stream, j); vb[2] = vl_vb_get_mv(&buf->vertex_stream, j);
dec->context->set_vertex_buffers(dec->context, 3, 0, false, vb); dec->context->set_vertex_buffers(dec->context, 3, false, vb);
vl_mc_render_ref(i ? &dec->mc_c : &dec->mc_y, &buf->mc[i], ref_frames[j][i]); 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; if (!buf->num_ycbcr_blocks[i]) continue;
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, i); vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, i);
dec->context->set_vertex_buffers(dec->context, 2, 0, false, vb); dec->context->set_vertex_buffers(dec->context, 2, false, vb);
vl_zscan_render(i ? &dec->zscan_c : & dec->zscan_y, &buf->zscan[i] , buf->num_ycbcr_blocks[i]); 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; if (!buf->num_ycbcr_blocks[plane]) continue;
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, plane); vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, plane);
dec->context->set_vertex_buffers(dec->context, 2, 0, false, vb); dec->context->set_vertex_buffers(dec->context, 2, false, vb);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_prepare_stage2(i ? &dec->idct_c : &dec->idct_y, &buf->idct[plane]); vl_idct_prepare_stage2(i ? &dec->idct_c : &dec->idct_y, &buf->idct[plane]);

View file

@ -318,7 +318,8 @@ void
agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter, agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter,
bool render_cond) bool render_cond)
{ {
util_blitter_save_vertex_buffer_slot(blitter, ctx->vertex_buffers); util_blitter_save_vertex_buffers(blitter, ctx->vertex_buffers,
util_last_bit(ctx->vb_mask));
util_blitter_save_vertex_elements(blitter, ctx->attributes); util_blitter_save_vertex_elements(blitter, ctx->attributes);
util_blitter_save_vertex_shader(blitter, util_blitter_save_vertex_shader(blitter,
ctx->stage[PIPE_SHADER_VERTEX].shader); ctx->stage[PIPE_SHADER_VERTEX].shader);

View file

@ -1419,14 +1419,13 @@ agx_delete_state(struct pipe_context *ctx, void *state)
static void static void
agx_set_vertex_buffers(struct pipe_context *pctx, unsigned count, agx_set_vertex_buffers(struct pipe_context *pctx, unsigned count,
unsigned unbind_num_trailing_slots, bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct agx_context *ctx = agx_context(pctx); struct agx_context *ctx = agx_context(pctx);
util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers, util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers,
count, unbind_num_trailing_slots, count, take_ownership);
take_ownership);
ctx->dirty |= AGX_DIRTY_VERTEX; ctx->dirty |= AGX_DIRTY_VERTEX;
} }

View file

@ -42,7 +42,8 @@ void crocus_blitter_begin(struct crocus_context *ice, enum crocus_blitter_op op,
util_blitter_save_geometry_shader(ice->blitter, ice->shaders.uncompiled[MESA_SHADER_GEOMETRY]); util_blitter_save_geometry_shader(ice->blitter, ice->shaders.uncompiled[MESA_SHADER_GEOMETRY]);
util_blitter_save_so_targets(ice->blitter, ice->state.so_targets, util_blitter_save_so_targets(ice->blitter, ice->state.so_targets,
(struct pipe_stream_output_target**)ice->state.so_target); (struct pipe_stream_output_target**)ice->state.so_target);
util_blitter_save_vertex_buffer_slot(ice->blitter, ice->state.vertex_buffers); util_blitter_save_vertex_buffers(ice->blitter, ice->state.vertex_buffers,
util_last_bit(ice->state.bound_vertex_buffers));
util_blitter_save_vertex_elements(ice->blitter, (void *)ice->state.cso_vertex_elements); util_blitter_save_vertex_elements(ice->blitter, (void *)ice->state.cso_vertex_elements);
if (op & CROCUS_SAVE_FRAGMENT_STATE) { if (op & CROCUS_SAVE_FRAGMENT_STATE) {
util_blitter_save_blend(ice->blitter, ice->state.cso_blend); util_blitter_save_blend(ice->blitter, ice->state.cso_blend);

View file

@ -3659,7 +3659,6 @@ crocus_delete_state(struct pipe_context *ctx, void *state)
static void static void
crocus_set_vertex_buffers(struct pipe_context *ctx, crocus_set_vertex_buffers(struct pipe_context *ctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -3667,12 +3666,9 @@ crocus_set_vertex_buffers(struct pipe_context *ctx,
struct crocus_screen *screen = (struct crocus_screen *) ctx->screen; struct crocus_screen *screen = (struct crocus_screen *) ctx->screen;
const unsigned padding = const unsigned padding =
(GFX_VERx10 < 75 && screen->devinfo.platform != INTEL_PLATFORM_BYT) * 2; (GFX_VERx10 < 75 && screen->devinfo.platform != INTEL_PLATFORM_BYT) * 2;
ice->state.bound_vertex_buffers &=
~u_bit_consecutive64(0, count + unbind_num_trailing_slots);
util_set_vertex_buffers_mask(ice->state.vertex_buffers, &ice->state.bound_vertex_buffers, util_set_vertex_buffers_mask(ice->state.vertex_buffers, &ice->state.bound_vertex_buffers,
buffers, count, unbind_num_trailing_slots, buffers, count, take_ownership);
take_ownership);
for (unsigned i = 0; i < count; i++) { for (unsigned i = 0; i < count; i++) {
struct pipe_vertex_buffer *state = struct pipe_vertex_buffer *state =

View file

@ -557,7 +557,7 @@ util_blit_save_state(struct d3d12_context *ctx)
ctx->num_sampler_views[PIPE_SHADER_FRAGMENT], ctx->num_sampler_views[PIPE_SHADER_FRAGMENT],
ctx->sampler_views[PIPE_SHADER_FRAGMENT]); ctx->sampler_views[PIPE_SHADER_FRAGMENT]);
util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->cbufs[PIPE_SHADER_FRAGMENT]); util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->cbufs[PIPE_SHADER_FRAGMENT]);
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vbs); util_blitter_save_vertex_buffers(ctx->blitter, ctx->vbs, ctx->num_vbs);
util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0); util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0);
util_blitter_save_so_targets(ctx->blitter, ctx->gfx_pipeline_state.num_so_targets, ctx->so_targets); util_blitter_save_so_targets(ctx->blitter, ctx->gfx_pipeline_state.num_so_targets, ctx->so_targets);
} }

View file

@ -1334,15 +1334,11 @@ d3d12_set_polygon_stipple(struct pipe_context *pctx,
static void static void
d3d12_set_vertex_buffers(struct pipe_context *pctx, d3d12_set_vertex_buffers(struct pipe_context *pctx,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct d3d12_context *ctx = d3d12_context(pctx); struct d3d12_context *ctx = d3d12_context(pctx);
util_set_vertex_buffers_count(ctx->vbs, &ctx->num_vbs, util_set_vertex_buffers_count(ctx->vbs, &ctx->num_vbs, buffers, num_buffers, take_ownership);
buffers, num_buffers,
unbind_num_trailing_slots,
take_ownership);
for (unsigned i = 0; i < ctx->num_vbs; ++i) { for (unsigned i = 0; i < ctx->num_vbs; ++i) {
const struct pipe_vertex_buffer* buf = ctx->vbs + i; const struct pipe_vertex_buffer* buf = ctx->vbs + i;
@ -2097,7 +2093,7 @@ d3d12_clear_render_target(struct pipe_context *pctx,
ctx->num_sampler_views[PIPE_SHADER_FRAGMENT], ctx->num_sampler_views[PIPE_SHADER_FRAGMENT],
ctx->sampler_views[PIPE_SHADER_FRAGMENT]); ctx->sampler_views[PIPE_SHADER_FRAGMENT]);
util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->cbufs[PIPE_SHADER_FRAGMENT]); util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->cbufs[PIPE_SHADER_FRAGMENT]);
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vbs); util_blitter_save_vertex_buffers(ctx->blitter, ctx->vbs, ctx->num_vbs);
util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0); util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask, 0);
util_blitter_save_so_targets(ctx->blitter, ctx->gfx_pipeline_state.num_so_targets, ctx->so_targets); util_blitter_save_so_targets(ctx->blitter, ctx->gfx_pipeline_state.num_so_targets, ctx->so_targets);

View file

@ -51,7 +51,8 @@ etna_blit_save_state(struct etna_context *ctx, bool render_cond)
{ {
util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, util_blitter_save_fragment_constant_buffer_slot(ctx->blitter,
ctx->constant_buffer[PIPE_SHADER_FRAGMENT].cb); ctx->constant_buffer[PIPE_SHADER_FRAGMENT].cb);
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vertex_buffer.vb); util_blitter_save_vertex_buffers(ctx->blitter, ctx->vertex_buffer.vb,
ctx->vertex_buffer.count);
util_blitter_save_vertex_elements(ctx->blitter, ctx->vertex_elements); util_blitter_save_vertex_elements(ctx->blitter, ctx->vertex_elements);
util_blitter_save_vertex_shader(ctx->blitter, ctx->shader.bind_vs); util_blitter_save_vertex_shader(ctx->blitter, ctx->shader.bind_vs);
util_blitter_save_rasterizer(ctx->blitter, ctx->rasterizer); util_blitter_save_rasterizer(ctx->blitter, ctx->rasterizer);

View file

@ -451,14 +451,12 @@ etna_set_viewport_states(struct pipe_context *pctx, unsigned start_slot,
static void static void
etna_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers, etna_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers,
unsigned unbind_num_trailing_slots, bool take_ownership, bool take_ownership, const struct pipe_vertex_buffer *vb)
const struct pipe_vertex_buffer *vb)
{ {
struct etna_context *ctx = etna_context(pctx); struct etna_context *ctx = etna_context(pctx);
struct etna_vertexbuf_state *so = &ctx->vertex_buffer; struct etna_vertexbuf_state *so = &ctx->vertex_buffer;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, num_buffers,
num_buffers, unbind_num_trailing_slots,
take_ownership); take_ownership);
so->count = util_last_bit(so->enabled_mask); so->count = util_last_bit(so->enabled_mask);

View file

@ -79,7 +79,9 @@ default_src_texture(struct pipe_sampler_view *src_templ,
static void static void
fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond) assert_dt
{ {
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vtx.vertexbuf.vb); util_blitter_save_vertex_buffers(
ctx->blitter, ctx->vtx.vertexbuf.vb,
util_last_bit(ctx->vtx.vertexbuf.enabled_mask));
util_blitter_save_vertex_elements(ctx->blitter, ctx->vtx.vtx); util_blitter_save_vertex_elements(ctx->blitter, ctx->vtx.vtx);
util_blitter_save_vertex_shader(ctx->blitter, ctx->prog.vs); util_blitter_save_vertex_shader(ctx->blitter, ctx->prog.vs);
util_blitter_save_tessctrl_shader(ctx->blitter, ctx->prog.hs); util_blitter_save_tessctrl_shader(ctx->blitter, ctx->prog.hs);
@ -235,7 +237,7 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
pctx->set_viewport_states(pctx, 0, 1, &vp); pctx->set_viewport_states(pctx, 0, 1, &vp);
pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx); pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx);
pctx->set_vertex_buffers(pctx, 1, 0, false, pctx->set_vertex_buffers(pctx, 1, false,
&ctx->solid_vbuf_state.vertexbuf.vb[0]); &ctx->solid_vbuf_state.vertexbuf.vb[0]);
pctx->set_stream_output_targets(pctx, 0, NULL, NULL); pctx->set_stream_output_targets(pctx, 0, NULL, NULL);

View file

@ -468,8 +468,7 @@ fd_set_viewport_states(struct pipe_context *pctx, unsigned start_slot,
} }
static void static void
fd_set_vertex_buffers(struct pipe_context *pctx, fd_set_vertex_buffers(struct pipe_context *pctx, unsigned count,
unsigned count, unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) in_dt const struct pipe_vertex_buffer *vb) in_dt
{ {
@ -492,8 +491,7 @@ fd_set_vertex_buffers(struct pipe_context *pctx,
} }
} }
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, count,
count, unbind_num_trailing_slots,
take_ownership); take_ownership);
so->count = util_last_bit(so->enabled_mask); so->count = util_last_bit(so->enabled_mask);

View file

@ -992,18 +992,17 @@ i915_delete_rasterizer_state(struct pipe_context *pipe, void *raster)
static void static void
i915_set_vertex_buffers(struct pipe_context *pipe, unsigned count, i915_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
unsigned unbind_num_trailing_slots, bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct i915_context *i915 = i915_context(pipe); struct i915_context *i915 = i915_context(pipe);
struct draw_context *draw = i915->draw; struct draw_context *draw = i915->draw;
util_set_vertex_buffers_count(i915->vertex_buffers, &i915->nr_vertex_buffers, util_set_vertex_buffers_count(i915->vertex_buffers, &i915->nr_vertex_buffers,
buffers, count, unbind_num_trailing_slots, buffers, count, take_ownership);
take_ownership);
/* pass-through to draw module */ /* pass-through to draw module */
draw_set_vertex_buffers(draw, count, unbind_num_trailing_slots, buffers); draw_set_vertex_buffers(draw, count, buffers);
} }
static void * static void *

View file

@ -60,7 +60,8 @@ i915_util_blitter_save_states(struct i915_context *i915)
util_blitter_save_viewport(i915->blitter, &i915->viewport); util_blitter_save_viewport(i915->blitter, &i915->viewport);
util_blitter_save_scissor(i915->blitter, &i915->scissor); util_blitter_save_scissor(i915->blitter, &i915->scissor);
util_blitter_save_vertex_elements(i915->blitter, i915->velems); util_blitter_save_vertex_elements(i915->blitter, i915->velems);
util_blitter_save_vertex_buffer_slot(i915->blitter, i915->vertex_buffers); util_blitter_save_vertex_buffers(i915->blitter, i915->vertex_buffers,
i915->nr_vertex_buffers);
util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer); util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer);

View file

@ -4008,7 +4008,6 @@ iris_delete_state(struct pipe_context *ctx, void *state)
static void static void
iris_set_vertex_buffers(struct pipe_context *ctx, iris_set_vertex_buffers(struct pipe_context *ctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -4016,8 +4015,8 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
struct iris_screen *screen = (struct iris_screen *)ctx->screen; struct iris_screen *screen = (struct iris_screen *)ctx->screen;
struct iris_genx_state *genx = ice->state.genx; struct iris_genx_state *genx = ice->state.genx;
ice->state.bound_vertex_buffers &= unsigned last_count = util_last_bit64(ice->state.bound_vertex_buffers);
~u_bit_consecutive64(0, count + unbind_num_trailing_slots); ice->state.bound_vertex_buffers = 0;
for (unsigned i = 0; i < count; i++) { for (unsigned i = 0; i < count; i++) {
const struct pipe_vertex_buffer *buffer = buffers ? &buffers[i] : NULL; const struct pipe_vertex_buffer *buffer = buffers ? &buffers[i] : NULL;
@ -4072,9 +4071,9 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
} }
} }
for (unsigned i = 0; i < unbind_num_trailing_slots; i++) { for (unsigned i = count; i < last_count; i++) {
struct iris_vertex_buffer_state *state = struct iris_vertex_buffer_state *state =
&genx->vertex_buffers[count + i]; &genx->vertex_buffers[i];
pipe_resource_reference(&state->resource, NULL); pipe_resource_reference(&state->resource, NULL);
} }

View file

@ -837,8 +837,8 @@ lima_util_blitter_save_states(struct lima_context *ctx)
util_blitter_save_scissor(ctx->blitter, &ctx->scissor); util_blitter_save_scissor(ctx->blitter, &ctx->scissor);
util_blitter_save_vertex_elements(ctx->blitter, util_blitter_save_vertex_elements(ctx->blitter,
ctx->vertex_elements); ctx->vertex_elements);
util_blitter_save_vertex_buffer_slot(ctx->blitter, util_blitter_save_vertex_buffers(ctx->blitter,
ctx->vertex_buffers.vb); ctx->vertex_buffers.vb, ctx->vertex_buffers.count);
util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer.base); util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer.base);

View file

@ -187,7 +187,6 @@ lima_delete_vertex_elements_state(struct pipe_context *pctx, void *hwcso)
static void static void
lima_set_vertex_buffers(struct pipe_context *pctx, lima_set_vertex_buffers(struct pipe_context *pctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -195,9 +194,7 @@ lima_set_vertex_buffers(struct pipe_context *pctx,
struct lima_context_vertex_buffer *so = &ctx->vertex_buffers; struct lima_context_vertex_buffer *so = &ctx->vertex_buffers;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask,
vb, count, vb, count, take_ownership);
unbind_num_trailing_slots,
take_ownership);
so->count = util_last_bit(so->enabled_mask); so->count = util_last_bit(so->enabled_mask);
ctx->dirty |= LIMA_CONTEXT_DIRTY_VERTEX_BUFF; ctx->dirty |= LIMA_CONTEXT_DIRTY_VERTEX_BUFF;
@ -472,5 +469,5 @@ lima_state_fini(struct lima_context *ctx)
struct lima_context_vertex_buffer *so = &ctx->vertex_buffers; struct lima_context_vertex_buffer *so = &ctx->vertex_buffers;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, NULL, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, NULL,
0, ARRAY_SIZE(so->vb), false); 0, false);
} }

View file

@ -81,7 +81,6 @@ llvmpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
static void static void
llvmpipe_set_vertex_buffers(struct pipe_context *pipe, llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -92,13 +91,11 @@ llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
util_set_vertex_buffers_count(llvmpipe->vertex_buffer, util_set_vertex_buffers_count(llvmpipe->vertex_buffer,
&llvmpipe->num_vertex_buffers, &llvmpipe->num_vertex_buffers,
buffers, count, buffers, count,
unbind_num_trailing_slots,
take_ownership); take_ownership);
llvmpipe->dirty |= LP_NEW_VERTEX; llvmpipe->dirty |= LP_NEW_VERTEX;
draw_set_vertex_buffers(llvmpipe->draw, count, draw_set_vertex_buffers(llvmpipe->draw, count, buffers);
unbind_num_trailing_slots, buffers);
} }

View file

@ -162,7 +162,8 @@ lp_blit(struct pipe_context *pipe,
info.mask = PIPE_MASK_R; info.mask = PIPE_MASK_R;
} }
util_blitter_save_vertex_buffer_slot(lp->blitter, lp->vertex_buffer); util_blitter_save_vertex_buffers(lp->blitter, lp->vertex_buffer,
lp->num_vertex_buffers);
util_blitter_save_vertex_elements(lp->blitter, (void*)lp->velems); util_blitter_save_vertex_elements(lp->blitter, (void*)lp->velems);
util_blitter_save_vertex_shader(lp->blitter, (void*)lp->vs); util_blitter_save_vertex_shader(lp->blitter, (void*)lp->vs);
util_blitter_save_geometry_shader(lp->blitter, (void*)lp->gs); util_blitter_save_geometry_shader(lp->blitter, (void*)lp->gs);

View file

@ -396,7 +396,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
if (nv30->draw_dirty & NV30_NEW_CLIP) if (nv30->draw_dirty & NV30_NEW_CLIP)
draw_set_clip_state(draw, &nv30->clip); draw_set_clip_state(draw, &nv30->clip);
if (nv30->draw_dirty & NV30_NEW_ARRAYS) { if (nv30->draw_dirty & NV30_NEW_ARRAYS) {
draw_set_vertex_buffers(draw, nv30->num_vtxbufs, 0, nv30->vtxbuf); draw_set_vertex_buffers(draw, nv30->num_vtxbufs, nv30->vtxbuf);
draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe); draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe);
} }
if (nv30->draw_dirty & NV30_NEW_FRAGPROG) { if (nv30->draw_dirty & NV30_NEW_FRAGPROG) {

View file

@ -248,7 +248,7 @@ nv30_blit(struct pipe_context *pipe,
/* XXX turn off occlusion queries */ /* XXX turn off occlusion queries */
util_blitter_save_vertex_buffer_slot(nv30->blitter, nv30->vtxbuf); util_blitter_save_vertex_buffers(nv30->blitter, nv30->vtxbuf, nv30->num_vtxbufs);
util_blitter_save_vertex_elements(nv30->blitter, nv30->vertex); util_blitter_save_vertex_elements(nv30->blitter, nv30->vertex);
util_blitter_save_vertex_shader(nv30->blitter, nv30->vertprog.program); util_blitter_save_vertex_shader(nv30->blitter, nv30->vertprog.program);
util_blitter_save_rasterizer(nv30->blitter, nv30->rast); util_blitter_save_rasterizer(nv30->blitter, nv30->rast);

View file

@ -437,7 +437,6 @@ nv30_set_viewport_states(struct pipe_context *pipe,
static void static void
nv30_set_vertex_buffers(struct pipe_context *pipe, nv30_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -446,9 +445,7 @@ nv30_set_vertex_buffers(struct pipe_context *pipe,
nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VTXBUF); nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VTXBUF);
util_set_vertex_buffers_count(nv30->vtxbuf, &nv30->num_vtxbufs, util_set_vertex_buffers_count(nv30->vtxbuf, &nv30->num_vtxbufs,
vb, count, vb, count, take_ownership);
unbind_num_trailing_slots,
take_ownership);
nv30->dirty |= NV30_NEW_ARRAYS; nv30->dirty |= NV30_NEW_ARRAYS;
} }

View file

@ -1085,7 +1085,6 @@ nv50_set_window_rectangles(struct pipe_context *pipe,
static void static void
nv50_set_vertex_buffers(struct pipe_context *pipe, nv50_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -1095,11 +1094,12 @@ nv50_set_vertex_buffers(struct pipe_context *pipe,
nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_VERTEX); nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_VERTEX);
nv50->dirty_3d |= NV50_NEW_3D_ARRAYS; nv50->dirty_3d |= NV50_NEW_3D_ARRAYS;
unsigned last_count = nv50->num_vtxbufs;
util_set_vertex_buffers_count(nv50->vtxbuf, &nv50->num_vtxbufs, vb, util_set_vertex_buffers_count(nv50->vtxbuf, &nv50->num_vtxbufs, vb,
count, unbind_num_trailing_slots, count, take_ownership);
take_ownership);
unsigned clear_mask = ~u_bit_consecutive(count, unbind_num_trailing_slots); unsigned clear_mask =
last_count > count ? BITFIELD_RANGE(count, last_count - count) : 0;
nv50->vbo_user &= clear_mask; nv50->vbo_user &= clear_mask;
nv50->vbo_constant &= clear_mask; nv50->vbo_constant &= clear_mask;
nv50->vtxbufs_coherent &= clear_mask; nv50->vtxbufs_coherent &= clear_mask;

View file

@ -1038,7 +1038,6 @@ nvc0_set_patch_vertices(struct pipe_context *pipe, uint8_t patch_vertices)
static void static void
nvc0_set_vertex_buffers(struct pipe_context *pipe, nvc0_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -1048,11 +1047,12 @@ nvc0_set_vertex_buffers(struct pipe_context *pipe,
nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_VTX); nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_VTX);
nvc0->dirty_3d |= NVC0_NEW_3D_ARRAYS; nvc0->dirty_3d |= NVC0_NEW_3D_ARRAYS;
unsigned last_count = nvc0->num_vtxbufs;
util_set_vertex_buffers_count(nvc0->vtxbuf, &nvc0->num_vtxbufs, vb, util_set_vertex_buffers_count(nvc0->vtxbuf, &nvc0->num_vtxbufs, vb,
count, unbind_num_trailing_slots, count, take_ownership);
take_ownership);
unsigned clear_mask = ~u_bit_consecutive(count, unbind_num_trailing_slots); unsigned clear_mask =
last_count > count ? BITFIELD_RANGE(count, last_count - count) : 0;
nvc0->vbo_user &= clear_mask; nvc0->vbo_user &= clear_mask;
nvc0->constant_vbos &= clear_mask; nvc0->constant_vbos &= clear_mask;
nvc0->vtxbufs_coherent &= clear_mask; nvc0->vtxbufs_coherent &= clear_mask;

View file

@ -38,7 +38,8 @@ panfrost_blitter_save(struct panfrost_context *ctx,
{ {
struct blitter_context *blitter = ctx->blitter; struct blitter_context *blitter = ctx->blitter;
util_blitter_save_vertex_buffer_slot(blitter, ctx->vertex_buffers); util_blitter_save_vertex_buffers(blitter, ctx->vertex_buffers,
util_last_bit(ctx->vb_mask));
util_blitter_save_vertex_elements(blitter, ctx->vertex); util_blitter_save_vertex_elements(blitter, ctx->vertex);
util_blitter_save_vertex_shader(blitter, util_blitter_save_vertex_shader(blitter,
ctx->uncompiled[PIPE_SHADER_VERTEX]); ctx->uncompiled[PIPE_SHADER_VERTEX]);

View file

@ -327,15 +327,13 @@ panfrost_bind_sampler_states(struct pipe_context *pctx,
static void static void
panfrost_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers, panfrost_set_vertex_buffers(struct pipe_context *pctx, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct panfrost_context *ctx = pan_context(pctx); struct panfrost_context *ctx = pan_context(pctx);
util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers, util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers,
num_buffers, unbind_num_trailing_slots, num_buffers, take_ownership);
take_ownership);
ctx->dirty |= PAN_DIRTY_VERTEX; ctx->dirty |= PAN_DIRTY_VERTEX;
} }

View file

@ -69,7 +69,8 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o
util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_viewport(r300->blitter, &r300->viewport);
util_blitter_save_scissor(r300->blitter, r300->scissor_state.state); util_blitter_save_scissor(r300->blitter, r300->scissor_state.state);
util_blitter_save_sample_mask(r300->blitter, *(unsigned*)r300->sample_mask.state, 0); util_blitter_save_sample_mask(r300->blitter, *(unsigned*)r300->sample_mask.state, 0);
util_blitter_save_vertex_buffer_slot(r300->blitter, r300->vertex_buffer); util_blitter_save_vertex_buffers(r300->blitter, r300->vertex_buffer,
r300->nr_vertex_buffers);
util_blitter_save_vertex_elements(r300->blitter, r300->velems); util_blitter_save_vertex_elements(r300->blitter, r300->velems);
struct pipe_constant_buffer cb = { struct pipe_constant_buffer cb = {

View file

@ -474,7 +474,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
vb.depth0 = 1; vb.depth0 = 1;
r300->dummy_vb.buffer.resource = screen->resource_create(screen, &vb); r300->dummy_vb.buffer.resource = screen->resource_create(screen, &vb);
r300->context.set_vertex_buffers(&r300->context, 1, 0, false, &r300->dummy_vb); r300->context.set_vertex_buffers(&r300->context, 1, false, &r300->dummy_vb);
} }
{ {

View file

@ -1771,23 +1771,20 @@ static void r300_set_viewport_states(struct pipe_context* pipe,
} }
static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe, static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe,
unsigned count, unsigned count, bool take_ownership,
unsigned unbind_num_trailing_slots,
bool take_ownership,
const struct pipe_vertex_buffer* buffers) const struct pipe_vertex_buffer* buffers)
{ {
struct r300_context* r300 = r300_context(pipe); struct r300_context* r300 = r300_context(pipe);
util_set_vertex_buffers_count(r300->vertex_buffer, util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers, &r300->nr_vertex_buffers, buffers, count,
buffers, count, take_ownership);
unbind_num_trailing_slots, take_ownership);
/* There must be at least one vertex buffer set, otherwise it locks up. */ /* There must be at least one vertex buffer set, otherwise it locks up. */
if (!r300->nr_vertex_buffers) { if (!r300->nr_vertex_buffers) {
util_set_vertex_buffers_count(r300->vertex_buffer, util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers, &r300->nr_vertex_buffers,
&r300->dummy_vb, 1, 0, false); &r300->dummy_vb, 1, false);
} }
r300->vertex_arrays_dirty = true; r300->vertex_arrays_dirty = true;
@ -1795,7 +1792,6 @@ static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe,
static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe, static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer* buffers) const struct pipe_vertex_buffer* buffers)
{ {
@ -1803,11 +1799,9 @@ static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe,
unsigned i; unsigned i;
util_set_vertex_buffers_count(r300->vertex_buffer, util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers, &r300->nr_vertex_buffers, buffers, count,
buffers, count, take_ownership);
unbind_num_trailing_slots, take_ownership); draw_set_vertex_buffers(r300->draw, count, buffers);
draw_set_vertex_buffers(r300->draw, count,
unbind_num_trailing_slots, buffers);
if (!buffers) if (!buffers)
return; return;

View file

@ -59,7 +59,8 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
rctx->cmd_buf_is_compute = false; rctx->cmd_buf_is_compute = false;
} }
util_blitter_save_vertex_buffer_slot(rctx->blitter, rctx->vertex_buffer_state.vb); util_blitter_save_vertex_buffers(rctx->blitter, rctx->vertex_buffer_state.vb,
util_last_bit(rctx->vertex_buffer_state.enabled_mask));
util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_fetch_shader.cso); util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_fetch_shader.cso);
util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader); util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader);
util_blitter_save_geometry_shader(rctx->blitter, rctx->gs_shader); util_blitter_save_geometry_shader(rctx->blitter, rctx->gs_shader);

View file

@ -208,7 +208,7 @@ void r600_draw_rectangle(struct blitter_context *blitter,
vbuffer.buffer.resource = buf; vbuffer.buffer.resource = buf;
vbuffer.buffer_offset = offset; vbuffer.buffer_offset = offset;
rctx->b.set_vertex_buffers(&rctx->b, 1, 0, false, &vbuffer); rctx->b.set_vertex_buffers(&rctx->b, 1, false, &vbuffer);
util_draw_arrays_instanced(&rctx->b, R600_PRIM_RECTANGLE_LIST, 0, 3, util_draw_arrays_instanced(&rctx->b, R600_PRIM_RECTANGLE_LIST, 0, 3,
0, num_instances); 0, num_instances);
pipe_resource_reference(&buf, NULL); pipe_resource_reference(&buf, NULL);

View file

@ -577,9 +577,7 @@ static void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
} }
static void r600_set_vertex_buffers(struct pipe_context *ctx, static void r600_set_vertex_buffers(struct pipe_context *ctx,
unsigned count, unsigned count, bool take_ownership,
unsigned unbind_num_trailing_slots,
bool take_ownership,
const struct pipe_vertex_buffer *input) const struct pipe_vertex_buffer *input)
{ {
struct r600_context *rctx = (struct r600_context *)ctx; struct r600_context *rctx = (struct r600_context *)ctx;
@ -591,27 +589,12 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx,
uint32_t new_buffer_mask = 0; uint32_t new_buffer_mask = 0;
/* Set vertex buffers. */ /* Set vertex buffers. */
if (input) { for (i = 0; i < count; i++) {
for (i = 0; i < count; i++) { if (likely((input[i].buffer.resource != vb[i].buffer.resource) ||
if (likely((input[i].buffer.resource != vb[i].buffer.resource) || (vb[i].buffer_offset != input[i].buffer_offset) ||
(vb[i].buffer_offset != input[i].buffer_offset) || (vb[i].is_user_buffer != input[i].is_user_buffer))) {
(vb[i].is_user_buffer != input[i].is_user_buffer))) { if (input[i].buffer.resource) {
if (input[i].buffer.resource) { vb[i].buffer_offset = input[i].buffer_offset;
vb[i].buffer_offset = input[i].buffer_offset;
if (take_ownership) {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
vb[i].buffer.resource = input[i].buffer.resource;
} else {
pipe_resource_reference(&vb[i].buffer.resource,
input[i].buffer.resource);
}
new_buffer_mask |= 1 << i;
r600_context_add_resource_size(ctx, input[i].buffer.resource);
} else {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
disable_mask |= 1 << i;
}
} else if (input[i].buffer.resource) {
if (take_ownership) { if (take_ownership) {
pipe_resource_reference(&vb[i].buffer.resource, NULL); pipe_resource_reference(&vb[i].buffer.resource, NULL);
vb[i].buffer.resource = input[i].buffer.resource; vb[i].buffer.resource = input[i].buffer.resource;
@ -619,19 +602,29 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx,
pipe_resource_reference(&vb[i].buffer.resource, pipe_resource_reference(&vb[i].buffer.resource,
input[i].buffer.resource); input[i].buffer.resource);
} }
new_buffer_mask |= 1 << i;
r600_context_add_resource_size(ctx, input[i].buffer.resource);
} else {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
disable_mask |= 1 << i;
}
} else if (input[i].buffer.resource) {
if (take_ownership) {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
vb[i].buffer.resource = input[i].buffer.resource;
} else {
pipe_resource_reference(&vb[i].buffer.resource,
input[i].buffer.resource);
} }
} }
} else {
for (i = 0; i < count; i++) {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
}
disable_mask = ((1ull << count) - 1);
} }
for (i = 0; i < unbind_num_trailing_slots; i++) { unsigned last_count = util_last_bit(rctx->vertex_buffer_state.enabled_mask);
pipe_resource_reference(&vb[count + i].buffer.resource, NULL); for (; i < last_count; i++)
} pipe_resource_reference(&vb[i].buffer.resource, NULL);
disable_mask |= ((1ull << unbind_num_trailing_slots) - 1) << count;
if (last_count > count)
disable_mask |= BITFIELD_RANGE(count, last_count - count);
rctx->vertex_buffer_state.enabled_mask &= ~disable_mask; rctx->vertex_buffer_state.enabled_mask &= ~disable_mask;
rctx->vertex_buffer_state.dirty_mask &= rctx->vertex_buffer_state.enabled_mask; rctx->vertex_buffer_state.dirty_mask &= rctx->vertex_buffer_state.enabled_mask;

View file

@ -1160,6 +1160,7 @@ struct si_context {
/* Vertex buffers. */ /* Vertex buffers. */
bool vertex_buffers_dirty; bool vertex_buffers_dirty;
uint8_t num_vertex_buffers;
uint16_t vertex_buffer_unaligned; /* bitmask of not dword-aligned buffers */ uint16_t vertex_buffer_unaligned; /* bitmask of not dword-aligned buffers */
struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS]; struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS];

View file

@ -5546,70 +5546,48 @@ static void si_delete_vertex_element(struct pipe_context *ctx, void *state)
FREE(state); FREE(state);
} }
static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count, bool take_ownership,
unsigned unbind_num_trailing_slots, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
struct si_context *sctx = (struct si_context *)ctx; struct si_context *sctx = (struct si_context *)ctx;
unsigned updated_mask = u_bit_consecutive(0, count + unbind_num_trailing_slots);
uint32_t orig_unaligned = sctx->vertex_buffer_unaligned;
uint32_t unaligned = 0; uint32_t unaligned = 0;
int i; unsigned i;
assert(count + unbind_num_trailing_slots <= ARRAY_SIZE(sctx->vertex_buffer)); assert(count <= ARRAY_SIZE(sctx->vertex_buffer));
assert(!count || buffers);
if (buffers) { for (i = 0; i < count; i++) {
const struct pipe_vertex_buffer *src = buffers + i;
struct pipe_vertex_buffer *dst = sctx->vertex_buffer + i;
struct pipe_resource *buf = src->buffer.resource;
dst->buffer_offset = src->buffer_offset;
/* Only unreference bound vertex buffers. (take_ownership) */
if (take_ownership) { if (take_ownership) {
for (i = 0; i < count; i++) { pipe_resource_reference(&dst->buffer.resource, NULL);
const struct pipe_vertex_buffer *src = buffers + i; dst->buffer.resource = src->buffer.resource;
struct pipe_vertex_buffer *dst = sctx->vertex_buffer + i;
struct pipe_resource *buf = src->buffer.resource;
unsigned slot_bit = 1 << i;
/* Only unreference bound vertex buffers. (take_ownership) */
pipe_resource_reference(&dst->buffer.resource, NULL);
if (src->buffer_offset & 3)
unaligned |= slot_bit;
if (buf) {
si_resource(buf)->bind_history |= SI_BIND_VERTEX_BUFFER;
radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, si_resource(buf),
RADEON_USAGE_READ | RADEON_PRIO_VERTEX_BUFFER);
}
}
/* take_ownership allows us to copy pipe_resource pointers without refcounting. */
memcpy(sctx->vertex_buffer, buffers, count * sizeof(struct pipe_vertex_buffer));
} else { } else {
for (i = 0; i < count; i++) { pipe_resource_reference(&dst->buffer.resource, src->buffer.resource);
const struct pipe_vertex_buffer *src = buffers + i; }
struct pipe_vertex_buffer *dst = sctx->vertex_buffer + i;
struct pipe_resource *buf = src->buffer.resource; if (src->buffer_offset & 3)
unsigned slot_bit = 1 << i; unaligned |= BITFIELD_BIT(i);
pipe_resource_reference(&dst->buffer.resource, buf); if (buf) {
dst->buffer_offset = src->buffer_offset; si_resource(buf)->bind_history |= SI_BIND_VERTEX_BUFFER;
radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, si_resource(buf),
if (dst->buffer_offset & 3) RADEON_USAGE_READ | RADEON_PRIO_VERTEX_BUFFER);
unaligned |= slot_bit;
if (buf) {
si_resource(buf)->bind_history |= SI_BIND_VERTEX_BUFFER;
radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, si_resource(buf),
RADEON_USAGE_READ | RADEON_PRIO_VERTEX_BUFFER);
}
}
} }
} else {
for (i = 0; i < count; i++)
pipe_resource_reference(&sctx->vertex_buffer[i].buffer.resource, NULL);
} }
for (i = 0; i < unbind_num_trailing_slots; i++) unsigned last_count = sctx->num_vertex_buffers;
pipe_resource_reference(&sctx->vertex_buffer[count + i].buffer.resource, NULL); for (; i < last_count; i++)
pipe_resource_reference(&sctx->vertex_buffer[i].buffer.resource, NULL);
sctx->num_vertex_buffers = count;
sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0; sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0;
sctx->vertex_buffer_unaligned = (orig_unaligned & ~updated_mask) | unaligned; sctx->vertex_buffer_unaligned = unaligned;
/* Check whether alignment may have changed in a way that requires /* Check whether alignment may have changed in a way that requires
* shader changes. This check is conservative: a vertex buffer can only * shader changes. This check is conservative: a vertex buffer can only
@ -5618,8 +5596,7 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
* whether buffers are at least dword-aligned, since that should always * whether buffers are at least dword-aligned, since that should always
* be the case in well-behaved applications anyway. * be the case in well-behaved applications anyway.
*/ */
if ((sctx->vertex_elements->vb_alignment_check_mask & if (sctx->vertex_elements->vb_alignment_check_mask & unaligned) {
(unaligned | orig_unaligned) & updated_mask)) {
si_vs_key_update_inputs(sctx); si_vs_key_update_inputs(sctx);
sctx->do_update_shaders = true; sctx->do_update_shaders = true;
} }

View file

@ -81,7 +81,6 @@ softpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
static void static void
softpipe_set_vertex_buffers(struct pipe_context *pipe, softpipe_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -92,12 +91,11 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe,
util_set_vertex_buffers_count(softpipe->vertex_buffer, util_set_vertex_buffers_count(softpipe->vertex_buffer,
&softpipe->num_vertex_buffers, &softpipe->num_vertex_buffers,
buffers, count, buffers, count,
unbind_num_trailing_slots,
take_ownership); take_ownership);
softpipe->dirty |= SP_NEW_VERTEX; softpipe->dirty |= SP_NEW_VERTEX;
draw_set_vertex_buffers(softpipe->draw, count, unbind_num_trailing_slots, buffers); draw_set_vertex_buffers(softpipe->draw, count, buffers);
} }

View file

@ -60,7 +60,8 @@ static void sp_blit(struct pipe_context *pipe,
/* XXX turn off occlusion and streamout queries */ /* XXX turn off occlusion and streamout queries */
util_blitter_save_vertex_buffer_slot(sp->blitter, sp->vertex_buffer); util_blitter_save_vertex_buffers(sp->blitter, sp->vertex_buffer,
sp->num_vertex_buffers);
util_blitter_save_vertex_elements(sp->blitter, sp->velems); util_blitter_save_vertex_elements(sp->blitter, sp->velems);
util_blitter_save_vertex_shader(sp->blitter, sp->vs); util_blitter_save_vertex_shader(sp->blitter, sp->vs);
util_blitter_save_geometry_shader(sp->blitter, sp->gs); util_blitter_save_geometry_shader(sp->blitter, sp->gs);

View file

@ -619,7 +619,8 @@ try_blit(struct svga_context *svga, const struct pipe_blit_info *blit_info)
/* XXX turn off occlusion and streamout queries */ /* XXX turn off occlusion and streamout queries */
util_blitter_save_vertex_buffer_slot(svga->blitter, svga->curr.vb); util_blitter_save_vertex_buffers(svga->blitter, svga->curr.vb,
svga->curr.num_vertex_buffers);
util_blitter_save_vertex_elements(svga->blitter, (void*)svga->curr.velems); util_blitter_save_vertex_elements(svga->blitter, (void*)svga->curr.velems);
util_blitter_save_vertex_shader(svga->blitter, svga->curr.vs); util_blitter_save_vertex_shader(svga->blitter, svga->curr.vs);
util_blitter_save_geometry_shader(svga->blitter, svga->curr.user_gs); util_blitter_save_geometry_shader(svga->blitter, svga->curr.user_gs);

View file

@ -41,7 +41,8 @@
static void static void
begin_blit(struct svga_context *svga) begin_blit(struct svga_context *svga)
{ {
util_blitter_save_vertex_buffer_slot(svga->blitter, svga->curr.vb); util_blitter_save_vertex_buffers(svga->blitter, svga->curr.vb,
svga->curr.num_vertex_buffers);
util_blitter_save_vertex_elements(svga->blitter, (void*)svga->curr.velems); util_blitter_save_vertex_elements(svga->blitter, (void*)svga->curr.velems);
util_blitter_save_vertex_shader(svga->blitter, svga->curr.vs); util_blitter_save_vertex_shader(svga->blitter, svga->curr.vs);
util_blitter_save_geometry_shader(svga->blitter, svga->curr.gs); util_blitter_save_geometry_shader(svga->blitter, svga->curr.gs);

View file

@ -42,7 +42,6 @@
static void static void
svga_set_vertex_buffers(struct pipe_context *pipe, svga_set_vertex_buffers(struct pipe_context *pipe,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -50,9 +49,7 @@ svga_set_vertex_buffers(struct pipe_context *pipe,
util_set_vertex_buffers_count(svga->curr.vb, util_set_vertex_buffers_count(svga->curr.vb,
&svga->curr.num_vertex_buffers, &svga->curr.num_vertex_buffers,
buffers, count, buffers, count, take_ownership);
unbind_num_trailing_slots,
take_ownership);
svga->dirty |= SVGA_NEW_VBUFFER; svga->dirty |= SVGA_NEW_VBUFFER;
} }

View file

@ -114,7 +114,7 @@ update_swtnl_draw(struct svga_context *svga, uint64_t dirty)
if (dirty & SVGA_NEW_VBUFFER) if (dirty & SVGA_NEW_VBUFFER)
draw_set_vertex_buffers(svga->swtnl.draw, draw_set_vertex_buffers(svga->swtnl.draw,
svga->curr.num_vertex_buffers, 0, svga->curr.num_vertex_buffers,
svga->curr.vb); svga->curr.vb);
if (dirty & SVGA_NEW_VELEMENT) if (dirty & SVGA_NEW_VELEMENT)

View file

@ -635,7 +635,7 @@ tegra_set_shader_images(struct pipe_context *pcontext, enum pipe_shader_type sha
static void static void
tegra_set_vertex_buffers(struct pipe_context *pcontext, tegra_set_vertex_buffers(struct pipe_context *pcontext,
unsigned num_buffers, unsigned unbind_num_trailing_slots, unsigned num_buffers,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -655,7 +655,6 @@ tegra_set_vertex_buffers(struct pipe_context *pcontext,
} }
context->gpu->set_vertex_buffers(context->gpu, num_buffers, context->gpu->set_vertex_buffers(context->gpu, num_buffers,
unbind_num_trailing_slots,
take_ownership, buffers); take_ownership, buffers);
} }

View file

@ -42,7 +42,7 @@ v3d_blitter_save(struct v3d_context *v3d, bool op_blit, bool render_cond)
{ {
util_blitter_save_fragment_constant_buffer_slot(v3d->blitter, util_blitter_save_fragment_constant_buffer_slot(v3d->blitter,
v3d->constbuf[PIPE_SHADER_FRAGMENT].cb); v3d->constbuf[PIPE_SHADER_FRAGMENT].cb);
util_blitter_save_vertex_buffer_slot(v3d->blitter, v3d->vertexbuf.vb); util_blitter_save_vertex_buffers(v3d->blitter, v3d->vertexbuf.vb, v3d->vertexbuf.count);
util_blitter_save_vertex_elements(v3d->blitter, v3d->vtx); util_blitter_save_vertex_elements(v3d->blitter, v3d->vtx);
util_blitter_save_vertex_shader(v3d->blitter, v3d->prog.bind_vs); util_blitter_save_vertex_shader(v3d->blitter, v3d->prog.bind_vs);
util_blitter_save_geometry_shader(v3d->blitter, v3d->prog.bind_gs); util_blitter_save_geometry_shader(v3d->blitter, v3d->prog.bind_gs);

View file

@ -292,7 +292,6 @@ v3d_set_viewport_states(struct pipe_context *pctx,
static void static void
v3d_set_vertex_buffers(struct pipe_context *pctx, v3d_set_vertex_buffers(struct pipe_context *pctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -300,8 +299,7 @@ v3d_set_vertex_buffers(struct pipe_context *pctx,
struct v3d_vertexbuf_stateobj *so = &v3d->vertexbuf; struct v3d_vertexbuf_stateobj *so = &v3d->vertexbuf;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb,
count, unbind_num_trailing_slots, count, take_ownership);
take_ownership);
so->count = util_last_bit(so->enabled_mask); so->count = util_last_bit(so->enabled_mask);
v3d->dirty |= V3D_DIRTY_VTXBUF; v3d->dirty |= V3D_DIRTY_VTXBUF;

View file

@ -195,7 +195,8 @@ vc4_blitter_save(struct vc4_context *vc4)
{ {
util_blitter_save_fragment_constant_buffer_slot(vc4->blitter, util_blitter_save_fragment_constant_buffer_slot(vc4->blitter,
vc4->constbuf[PIPE_SHADER_FRAGMENT].cb); vc4->constbuf[PIPE_SHADER_FRAGMENT].cb);
util_blitter_save_vertex_buffer_slot(vc4->blitter, vc4->vertexbuf.vb); util_blitter_save_vertex_buffers(vc4->blitter, vc4->vertexbuf.vb,
vc4->vertexbuf.count);
util_blitter_save_vertex_elements(vc4->blitter, vc4->vtx); util_blitter_save_vertex_elements(vc4->blitter, vc4->vtx);
util_blitter_save_vertex_shader(vc4->blitter, vc4->prog.bind_vs); util_blitter_save_vertex_shader(vc4->blitter, vc4->prog.bind_vs);
util_blitter_save_rasterizer(vc4->blitter, vc4->rasterizer); util_blitter_save_rasterizer(vc4->blitter, vc4->rasterizer);

View file

@ -313,7 +313,6 @@ vc4_set_viewport_states(struct pipe_context *pctx,
static void static void
vc4_set_vertex_buffers(struct pipe_context *pctx, vc4_set_vertex_buffers(struct pipe_context *pctx,
unsigned count, unsigned count,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *vb) const struct pipe_vertex_buffer *vb)
{ {
@ -321,8 +320,7 @@ vc4_set_vertex_buffers(struct pipe_context *pctx,
struct vc4_vertexbuf_stateobj *so = &vc4->vertexbuf; struct vc4_vertexbuf_stateobj *so = &vc4->vertexbuf;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb,
count, unbind_num_trailing_slots, count, take_ownership);
take_ownership);
so->count = util_last_bit(so->enabled_mask); so->count = util_last_bit(so->enabled_mask);
vc4->dirty |= VC4_DIRTY_VTXBUF; vc4->dirty |= VC4_DIRTY_VTXBUF;

View file

@ -565,7 +565,6 @@ static void virgl_bind_vertex_elements_state(struct pipe_context *ctx,
static void virgl_set_vertex_buffers(struct pipe_context *ctx, static void virgl_set_vertex_buffers(struct pipe_context *ctx,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -574,7 +573,6 @@ static void virgl_set_vertex_buffers(struct pipe_context *ctx,
util_set_vertex_buffers_count(vctx->vertex_buffer, util_set_vertex_buffers_count(vctx->vertex_buffer,
&vctx->num_vertex_buffers, &vctx->num_vertex_buffers,
buffers, num_buffers, buffers, num_buffers,
unbind_num_trailing_slots,
take_ownership); take_ownership);
if (buffers) { if (buffers) {

View file

@ -501,7 +501,8 @@ zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags)
util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state); util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state);
util_blitter_save_viewport(ctx->blitter, ctx->vp_state.viewport_states); util_blitter_save_viewport(ctx->blitter, ctx->vp_state.viewport_states);
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->vertex_buffers); util_blitter_save_vertex_buffers(ctx->blitter, ctx->vertex_buffers,
util_last_bit(ctx->gfx_pipeline_state.vertex_buffers_enabled_mask));
util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_VERTEX]); util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_VERTEX]);
util_blitter_save_tessctrl_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_TESS_CTRL]); util_blitter_save_tessctrl_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_TESS_CTRL]);
util_blitter_save_tesseval_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_TESS_EVAL]); util_blitter_save_tesseval_shader(ctx->blitter, ctx->gfx_stages[MESA_SHADER_TESS_EVAL]);

View file

@ -1339,7 +1339,6 @@ update_existing_vbo(struct zink_context *ctx, unsigned slot)
static void static void
zink_set_vertex_buffers(struct pipe_context *pctx, zink_set_vertex_buffers(struct pipe_context *pctx,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *buffers) const struct pipe_vertex_buffer *buffers)
{ {
@ -1348,44 +1347,39 @@ zink_set_vertex_buffers(struct pipe_context *pctx,
const bool need_state_change = !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state && const bool need_state_change = !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state &&
!have_input_state; !have_input_state;
uint32_t enabled_buffers = ctx->gfx_pipeline_state.vertex_buffers_enabled_mask; uint32_t enabled_buffers = ctx->gfx_pipeline_state.vertex_buffers_enabled_mask;
enabled_buffers |= u_bit_consecutive(0, num_buffers); unsigned last_count = util_last_bit(enabled_buffers);
enabled_buffers &= ~u_bit_consecutive(num_buffers, unbind_num_trailing_slots); enabled_buffers = u_bit_consecutive(0, num_buffers);
if (buffers) { assert(!num_buffers || buffers);
for (unsigned i = 0; i < num_buffers; ++i) {
const struct pipe_vertex_buffer *vb = buffers + i; for (unsigned i = 0; i < num_buffers; ++i) {
struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[i]; const struct pipe_vertex_buffer *vb = buffers + i;
update_existing_vbo(ctx, i); struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[i];
if (!take_ownership) update_existing_vbo(ctx, i);
pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource); if (!take_ownership)
else { pipe_resource_reference(&ctx_vb->buffer.resource, vb->buffer.resource);
pipe_resource_reference(&ctx_vb->buffer.resource, NULL); else {
ctx_vb->buffer.resource = vb->buffer.resource; pipe_resource_reference(&ctx_vb->buffer.resource, NULL);
} ctx_vb->buffer.resource = vb->buffer.resource;
if (vb->buffer.resource) {
struct zink_resource *res = zink_resource(vb->buffer.resource);
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;
update_res_bind_count(ctx, res, false, false);
ctx_vb->buffer_offset = vb->buffer_offset;
/* always barrier before possible rebind */
zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT);
zink_batch_resource_usage_set(&ctx->batch, res, false, true);
res->obj->unordered_read = false;
} else {
enabled_buffers &= ~BITFIELD_BIT(i);
}
} }
} else { if (vb->buffer.resource) {
for (unsigned i = 0; i < num_buffers; ++i) { struct zink_resource *res = zink_resource(vb->buffer.resource);
update_existing_vbo(ctx, i); res->vbo_bind_mask |= BITFIELD_BIT(i);
pipe_resource_reference(&ctx->vertex_buffers[i].buffer.resource, NULL); res->vbo_bind_count++;
res->gfx_barrier |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
res->barrier_access[0] |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
update_res_bind_count(ctx, res, false, false);
ctx_vb->buffer_offset = vb->buffer_offset;
/* always barrier before possible rebind */
zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT);
zink_batch_resource_usage_set(&ctx->batch, res, false, true);
res->obj->unordered_read = false;
} else {
enabled_buffers &= ~BITFIELD_BIT(i);
} }
} }
for (unsigned i = 0; i < unbind_num_trailing_slots; i++) { for (unsigned i = num_buffers; i < last_count; i++) {
update_existing_vbo(ctx, i); update_existing_vbo(ctx, i);
pipe_resource_reference(&ctx->vertex_buffers[i].buffer.resource, NULL); pipe_resource_reference(&ctx->vertex_buffers[i].buffer.resource, NULL);
} }

View file

@ -504,7 +504,7 @@ static void emit_state(struct rendering_state *state)
} }
if (state->vb_dirty) { if (state->vb_dirty) {
cso_set_vertex_buffers(state->cso, state->num_vb, 0, false, state->vb); cso_set_vertex_buffers(state->cso, state->num_vb, false, state->vb);
state->vb_dirty = false; state->vb_dirty = false;
} }

View file

@ -959,7 +959,6 @@ update_vertex_buffers(struct NineDevice9 *device)
struct pipe_context *pipe = context->pipe; struct pipe_context *pipe = context->pipe;
struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS];
unsigned vtxbuf_count; unsigned vtxbuf_count;
unsigned trailing_count;
unsigned mask, i, vtxbuf_i; unsigned mask, i, vtxbuf_i;
mask = context->vtxbuf_mask | mask = context->vtxbuf_mask |
@ -978,12 +977,10 @@ update_vertex_buffers(struct NineDevice9 *device)
} }
} }
trailing_count = (context->last_vtxbuf_count <= vtxbuf_count) ? 0 :
context->last_vtxbuf_count - vtxbuf_count;
if (vtxbuf_count) if (vtxbuf_count)
pipe->set_vertex_buffers(pipe, vtxbuf_count, trailing_count, false, vbuffer); pipe->set_vertex_buffers(pipe, vtxbuf_count, false, vbuffer);
else else
pipe->set_vertex_buffers(pipe, 0, trailing_count, false, NULL); pipe->set_vertex_buffers(pipe, 0, false, NULL);
context->last_vtxbuf_count = vtxbuf_count; context->last_vtxbuf_count = vtxbuf_count;
context->changed.vtxbuf = 0; context->changed.vtxbuf = 0;
@ -2546,7 +2543,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
else else
info.index.user = user_ibuf; info.index.user = user_ibuf;
context->pipe->set_vertex_buffers(context->pipe, 1, 0, false, vbuf); context->pipe->set_vertex_buffers(context->pipe, 1, false, vbuf);
context->changed.vtxbuf |= 1; context->changed.vtxbuf |= 1;
context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1); context->pipe->draw_vbo(context->pipe, &info, 0, NULL, &draw, 1);
@ -3067,7 +3064,7 @@ nine_context_clear(struct NineDevice9 *device)
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 0, pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 0,
NINE_MAX_SAMPLERS_PS, false, NULL); NINE_MAX_SAMPLERS_PS, false, NULL);
pipe->set_vertex_buffers(pipe, 0, device->caps.MaxStreams, false, NULL); pipe->set_vertex_buffers(pipe, 0, false, NULL);
for (i = 0; i < ARRAY_SIZE(context->rt); ++i) for (i = 0; i < ARRAY_SIZE(context->rt); ++i)
nine_bind(&context->rt[i], NULL); nine_bind(&context->rt[i], NULL);
@ -3273,7 +3270,7 @@ update_vertex_buffers_sw(struct NineDevice9 *device, int dummy_vbo_stream,
} }
vtxbuf_count = j; vtxbuf_count = j;
pipe_sw->set_vertex_buffers(pipe_sw, vtxbuf_count, device->caps.MaxStreams-vtxbuf_count, true, vbuffer); pipe_sw->set_vertex_buffers(pipe_sw, vtxbuf_count, true, vbuffer);
nine_context_get_pipe_release(device); nine_context_get_pipe_release(device);
} }
@ -3412,7 +3409,7 @@ nine_state_after_draw_sw(struct NineDevice9 *device)
struct pipe_context *pipe_sw = device->pipe_sw; struct pipe_context *pipe_sw = device->pipe_sw;
int i; int i;
pipe_sw->set_vertex_buffers(pipe_sw, 0, device->caps.MaxStreams, false, NULL); pipe_sw->set_vertex_buffers(pipe_sw, 0, false, NULL);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (sw_internal->transfers_so[i]) if (sw_internal->transfers_so[i])
pipe->buffer_unmap(pipe, sw_internal->transfers_so[i]); pipe->buffer_unmap(pipe, sw_internal->transfers_so[i]);

View file

@ -608,7 +608,6 @@ struct pipe_context {
* Bind an array of vertex buffers to the specified slots. * Bind an array of vertex buffers to the specified slots.
* *
* \param count number of consecutive vertex buffers to bind. * \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 * \param take_ownership the caller holds buffer references and they
* should be taken over by the callee. This means * should be taken over by the callee. This means
* that drivers shouldn't increment reference counts. * that drivers shouldn't increment reference counts.
@ -616,7 +615,6 @@ struct pipe_context {
*/ */
void (*set_vertex_buffers)(struct pipe_context *, void (*set_vertex_buffers)(struct pipe_context *,
unsigned num_buffers, unsigned num_buffers,
unsigned unbind_num_trailing_slots,
bool take_ownership, bool take_ownership,
const struct pipe_vertex_buffer *); const struct pipe_vertex_buffer *);

View file

@ -334,30 +334,20 @@ st_update_array_templ(struct st_context *st,
enabled_attribs, enabled_attribs,
&velements, vbuffer, &num_vbuffers); &velements, vbuffer, &num_vbuffers);
unsigned unbind_trailing_vbuffers =
st->last_num_vbuffers > num_vbuffers ?
st->last_num_vbuffers - num_vbuffers : 0;
st->last_num_vbuffers = num_vbuffers;
struct cso_context *cso = st->cso_context; struct cso_context *cso = st->cso_context;
if (UPDATE == UPDATE_ALL) { if (UPDATE == UPDATE_ALL) {
velements.count = vp->num_inputs + vp_variant->key.passthrough_edgeflags; velements.count = vp->num_inputs + vp_variant->key.passthrough_edgeflags;
/* Set vertex buffers and elements. */ /* Set vertex buffers and elements. */
cso_set_vertex_buffers_and_elements(cso, &velements, cso_set_vertex_buffers_and_elements(cso, &velements, num_vbuffers, true,
num_vbuffers, uses_user_vertex_buffers, vbuffer);
unbind_trailing_vbuffers,
true,
uses_user_vertex_buffers,
vbuffer);
/* The driver should clear this after it has processed the update. */ /* The driver should clear this after it has processed the update. */
ctx->Array.NewVertexElements = false; ctx->Array.NewVertexElements = false;
st->uses_user_vertex_buffers = uses_user_vertex_buffers; st->uses_user_vertex_buffers = uses_user_vertex_buffers;
} else { } else {
/* Only vertex buffers. */ /* Only vertex buffers. */
cso_set_vertex_buffers(cso, num_vbuffers, unbind_trailing_vbuffers, cso_set_vertex_buffers(cso, num_vbuffers, true, vbuffer);
true, vbuffer);
/* This can change only when we update vertex elements. */ /* This can change only when we update vertex elements. */
assert(st->uses_user_vertex_buffers == uses_user_vertex_buffers); assert(st->uses_user_vertex_buffers == uses_user_vertex_buffers);
} }

View file

@ -301,7 +301,6 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
MESA_PRIM_TRIANGLE_FAN, MESA_PRIM_TRIANGLE_FAN,
4, /* verts */ 4, /* verts */
numAttribs); /* attribs/vert */ numAttribs); /* attribs/vert */
st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
pipe_resource_reference(&vbuffer, NULL); pipe_resource_reference(&vbuffer, NULL);

View file

@ -357,8 +357,6 @@ struct st_context
void *winsys_drawable_handle; void *winsys_drawable_handle;
/* The number of vertex buffers from the last call of validate_arrays. */
unsigned last_num_vbuffers;
bool uses_user_vertex_buffers; bool uses_user_vertex_buffers;
unsigned last_used_atomic_bindings[PIPE_SHADER_TYPES]; unsigned last_used_atomic_bindings[PIPE_SHADER_TYPES];

View file

@ -421,8 +421,7 @@ st_draw_quad(struct st_context *st,
u_upload_unmap(st->pipe->stream_uploader); u_upload_unmap(st->pipe->stream_uploader);
cso_set_vertex_buffers(st->cso_context, 1, 0, false, &vb); cso_set_vertex_buffers(st->cso_context, 1, false, &vb);
st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
if (num_instances > 1) { if (num_instances > 1) {
cso_draw_arrays_instanced(st->cso_context, MESA_PRIM_TRIANGLE_FAN, 0, 4, cso_draw_arrays_instanced(st->cso_context, MESA_PRIM_TRIANGLE_FAN, 0, 4,

View file

@ -157,7 +157,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
} }
} }
draw_set_vertex_buffers(draw, num_vbuffers, 0, vbuffers); draw_set_vertex_buffers(draw, num_vbuffers, vbuffers);
draw_set_vertex_elements(draw, vp->num_inputs, velements.velems); draw_set_vertex_elements(draw, vp->num_inputs, velements.velems);
if (info->index_size) { if (info->index_size) {
@ -455,7 +455,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
if (!vbuffers[buf].is_user_buffer) if (!vbuffers[buf].is_user_buffer)
pipe_resource_reference(&vbuffers[buf].buffer.resource, NULL); pipe_resource_reference(&vbuffers[buf].buffer.resource, NULL);
} }
draw_set_vertex_buffers(draw, 0, num_vbuffers, NULL); draw_set_vertex_buffers(draw, 0, NULL);
draw_bind_vertex_shader(draw, NULL); draw_bind_vertex_shader(draw, NULL);
} }

View file

@ -244,9 +244,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr,
velem.velems[0].dual_slot = false; velem.velems[0].dual_slot = false;
cso_set_vertex_elements(cso, &velem); cso_set_vertex_elements(cso, &velem);
cso_set_vertex_buffers(cso, 1, 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); pipe_resource_reference(&vbo.buffer.resource, NULL);
} }