return;
if (vbuf) {
- u_vbuf_set_vertex_buffers(vbuf, start_slot, count, buffers);
+ u_vbuf_set_vertex_buffers(vbuf, start_slot, count, 0, buffers);
return;
}
struct pipe_context *pipe = ctx->pipe;
- pipe->set_vertex_buffers(pipe, start_slot, count, buffers);
+ pipe->set_vertex_buffers(pipe, start_slot, count, 0, buffers);
}
/**
const struct cso_velems_state *velems,
unsigned vb_count,
unsigned unbind_trailing_vb_count,
- const struct pipe_vertex_buffer *vbuffers,
- bool uses_user_vertex_buffers)
+ bool uses_user_vertex_buffers,
+ const struct pipe_vertex_buffer *vbuffers)
{
struct u_vbuf *vbuf = ctx->vbuf;
struct pipe_context *pipe = ctx->pipe;
/* Unbind all buffers in cso_context, because we'll use u_vbuf. */
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count;
if (unbind_vb_count)
- pipe->set_vertex_buffers(pipe, 0, unbind_vb_count, NULL);
+ pipe->set_vertex_buffers(pipe, 0, 0, unbind_vb_count, NULL);
/* Unset this to make sure the CSO is re-bound on the next use. */
ctx->velements = NULL;
ctx->vbuf_current = vbuf;
- } else if (unbind_trailing_vb_count) {
- u_vbuf_set_vertex_buffers(vbuf, vb_count, unbind_trailing_vb_count,
- NULL);
+ unbind_trailing_vb_count = 0;
}
- if (vb_count)
- u_vbuf_set_vertex_buffers(vbuf, 0, vb_count, vbuffers);
+ if (vb_count || unbind_trailing_vb_count) {
+ u_vbuf_set_vertex_buffers(vbuf, 0, vb_count,
+ unbind_trailing_vb_count, vbuffers);
+ }
u_vbuf_set_vertex_elements(vbuf, velems);
return;
}
/* Unbind all buffers in u_vbuf, because we'll use cso_context. */
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count;
if (unbind_vb_count)
- u_vbuf_set_vertex_buffers(vbuf, 0, unbind_vb_count, NULL);
+ u_vbuf_set_vertex_buffers(vbuf, 0, 0, unbind_vb_count, NULL);
/* Unset this to make sure the CSO is re-bound on the next use. */
u_vbuf_unset_vertex_elements(vbuf);
ctx->vbuf_current = NULL;
- } else if (unbind_trailing_vb_count) {
- pipe->set_vertex_buffers(pipe, vb_count, unbind_trailing_vb_count, NULL);
+ unbind_trailing_vb_count = 0;
}
- if (vb_count)
- pipe->set_vertex_buffers(pipe, 0, vb_count, vbuffers);
+ if (vb_count || unbind_trailing_vb_count) {
+ pipe->set_vertex_buffers(pipe, 0, vb_count, unbind_trailing_vb_count,
+ vbuffers);
+ }
cso_set_vertex_elements_direct(ctx, velems);
}
const struct cso_velems_state *velems,
unsigned vb_count,
unsigned unbind_trailing_vb_count,
- const struct pipe_vertex_buffer *vbuffers,
- bool uses_user_vertex_buffers);
+ bool uses_user_vertex_buffers,
+ const struct pipe_vertex_buffer *vbuffers);
/* drawing */
void
draw_set_vertex_buffers(struct draw_context *draw,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
assert(start_slot + count <= PIPE_MAX_ATTRIBS);
util_set_vertex_buffers_count(draw->pt.vertex_buffer,
&draw->pt.nr_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
}
void draw_set_vertex_buffers(struct draw_context *draw,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers);
void draw_set_vertex_elements(struct draw_context *draw,
static void
dd_context_set_vertex_buffers(struct pipe_context *_pipe,
unsigned start, unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct dd_context *dctx = dd_context(_pipe);
safe_memcpy(&dctx->draw_state.vertex_buffers[start], buffers,
sizeof(buffers[0]) * num_buffers);
- pipe->set_vertex_buffers(pipe, start, num_buffers, buffers);
+ safe_memcpy(&dctx->draw_state.vertex_buffers[start + num_buffers], NULL,
+ sizeof(buffers[0]) * unbind_num_trailing_slots);
+ pipe->set_vertex_buffers(pipe, start, num_buffers,
+ unbind_num_trailing_slots, buffers);
}
static void
static void noop_set_vertex_buffers(struct pipe_context *ctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
}
static void
rbug_set_vertex_buffers(struct pipe_context *_pipe,
unsigned start_slot, unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *_buffers)
{
struct rbug_context *rb_pipe = rbug_context(_pipe);
}
pipe->set_vertex_buffers(pipe, start_slot,
- num_buffers,
+ num_buffers, unbind_num_trailing_slots,
buffers);
mtx_unlock(&rb_pipe->call_mutex);
static void
trace_context_set_vertex_buffers(struct pipe_context *_pipe,
unsigned start_slot, unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct trace_context *tr_ctx = trace_context(_pipe);
trace_dump_arg(ptr, pipe);
trace_dump_arg(uint, start_slot);
trace_dump_arg(uint, num_buffers);
+ trace_dump_arg(uint, unbind_num_trailing_slots);
trace_dump_arg_begin("buffers");
trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
trace_dump_arg_end();
- pipe->set_vertex_buffers(pipe, start_slot, num_buffers, buffers);
+ pipe->set_vertex_buffers(pipe, start_slot, num_buffers,
+ unbind_num_trailing_slots, buffers);
trace_dump_call_end();
}
/* Unbind resources that we have bound. */
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, NULL);
- pipe->set_vertex_buffers(pipe, 0, 1, NULL);
+ pipe->set_vertex_buffers(pipe, 0, 0, 1, NULL);
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, NULL);
/* restore states not restored by cso */
struct pipe_context *pipe = ppq->p->pipe;
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, false, NULL);
pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, false, NULL);
- pipe->set_vertex_buffers(pipe, 0, 1, NULL);
+ pipe->set_vertex_buffers(pipe, 0, 0, 1, NULL);
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 3, NULL);
/* restore states not restored by cso */
/* Vertex buffer. */
if (ctx->base.saved_vertex_buffer.buffer.resource) {
- pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1,
+ pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0,
&ctx->base.saved_vertex_buffer);
pipe_vertex_buffer_unreference(&ctx->base.saved_vertex_buffer);
}
return;
u_upload_unmap(pipe->stream_uploader);
- pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &vb);
+ pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, &vb);
pipe->bind_vertex_elements_state(pipe, vertex_elements_cso);
pipe->bind_vs_state(pipe, get_vs(&ctx->base));
vb.buffer_offset = srcx;
vb.stride = 4;
- pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &vb);
+ pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, &vb);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state_readbuf[0]);
bind_vs_pos_only(ctx, 1);
if (ctx->has_geometry_shader)
blitter_check_saved_vertex_states(ctx);
blitter_disable_render_cond(ctx);
- pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &vb);
+ pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, 0, &vb);
pipe->bind_vertex_elements_state(pipe,
ctx->velem_state_readbuf[num_channels-1]);
bind_vs_pos_only(ctx, num_channels);
cso_set_vertex_buffers(cso, vbuf_slot, 1, &vbuffer);
cso_draw_arrays(cso, prim_type, 0, num_verts);
} else {
- pipe->set_vertex_buffers(pipe, vbuf_slot, 1, &vbuffer);
+ pipe->set_vertex_buffers(pipe, vbuf_slot, 1, 0, &vbuffer);
util_draw_arrays(pipe, prim_type, 0, num_verts);
}
}
void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
uint32_t *enabled_buffers,
const struct pipe_vertex_buffer *src,
- unsigned start_slot, unsigned count)
+ unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots)
{
unsigned i;
uint32_t bitmask = 0;
for (i = 0; i < count; i++)
pipe_vertex_buffer_unreference(&dst[i]);
}
+
+ for (i = 0; i < unbind_num_trailing_slots; i++)
+ pipe_vertex_buffer_unreference(&dst[count + i]);
}
/**
void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
unsigned *dst_count,
const struct pipe_vertex_buffer *src,
- unsigned start_slot, unsigned count)
+ unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots)
{
unsigned i;
uint32_t enabled_buffers = 0;
}
util_set_vertex_buffers_mask(dst, &enabled_buffers, src, start_slot,
- count);
+ count, unbind_num_trailing_slots);
*dst_count = util_last_bit(enabled_buffers);
}
void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
uint32_t *enabled_buffers,
const struct pipe_vertex_buffer *src,
- unsigned start_slot, unsigned count);
+ unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots);
void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
unsigned *dst_count,
const struct pipe_vertex_buffer *src,
- unsigned start_slot, unsigned count);
+ unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots);
void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst,
uint32_t *enabled_buffers,
struct tc_vertex_buffers {
ubyte start, count;
- bool unbind;
+ ubyte unbind_num_trailing_slots;
struct pipe_vertex_buffer slot[0]; /* more will be allocated if needed */
};
struct tc_vertex_buffers *p = (struct tc_vertex_buffers *)payload;
unsigned count = p->count;
- if (p->unbind) {
- pipe->set_vertex_buffers(pipe, p->start, count, NULL);
+ if (!count) {
+ pipe->set_vertex_buffers(pipe, p->start, 0,
+ p->unbind_num_trailing_slots, NULL);
return;
}
for (unsigned i = 0; i < count; i++)
tc_assert(!p->slot[i].is_user_buffer);
- pipe->set_vertex_buffers(pipe, p->start, count, p->slot);
+ pipe->set_vertex_buffers(pipe, p->start, count,
+ p->unbind_num_trailing_slots, p->slot);
for (unsigned i = 0; i < count; i++)
pipe_resource_reference(&p->slot[i].buffer.resource, NULL);
}
static void
tc_set_vertex_buffers(struct pipe_context *_pipe,
unsigned start, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct threaded_context *tc = threaded_context(_pipe);
- if (!count)
+ if (!count && !unbind_num_trailing_slots)
return;
- if (buffers) {
+ if (count && buffers) {
struct tc_vertex_buffers *p =
tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, count);
p->start = start;
p->count = count;
- p->unbind = false;
+ p->unbind_num_trailing_slots = unbind_num_trailing_slots;
for (unsigned i = 0; i < count; i++) {
struct pipe_vertex_buffer *dst = &p->slot[i];
struct tc_vertex_buffers *p =
tc_add_slot_based_call(tc, TC_CALL_set_vertex_buffers, tc_vertex_buffers, 0);
p->start = start;
- p->count = count;
- p->unbind = true;
+ p->count = 0;
+ p->unbind_num_trailing_slots = count + unbind_num_trailing_slots;
}
}
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, NULL);
+ mgr->pipe->set_vertex_buffers(mgr->pipe, 0, 0, num_vb, NULL);
for (i = 0; i < PIPE_MAX_ATTRIBS; i++)
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[i]);
void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *bufs)
{
unsigned i;
uint32_t incompatible_vb_mask = 0;
/* which buffers have a non-zero stride */
uint32_t nonzero_stride_vb_mask = 0;
- const uint32_t mask = ~(((1ull << count) - 1) << start_slot);
+ const uint32_t mask =
+ ~(((1ull << (count + unbind_num_trailing_slots)) - 1) << start_slot);
/* Zero out the bits we are going to rewrite completely. */
mgr->user_vb_mask &= mask;
if (!bufs) {
struct pipe_context *pipe = mgr->pipe;
/* Unbind. */
+ unsigned total_count = count + unbind_num_trailing_slots;
mgr->dirty_real_vb_mask &= mask;
- for (i = 0; i < count; i++) {
+ for (i = 0; i < total_count; i++) {
unsigned dst_index = start_slot + i;
pipe_vertex_buffer_unreference(&mgr->vertex_buffer[dst_index]);
pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[dst_index]);
}
- pipe->set_vertex_buffers(pipe, start_slot, count, NULL);
+ pipe->set_vertex_buffers(pipe, start_slot, count,
+ unbind_num_trailing_slots, NULL);
return;
}
pipe_vertex_buffer_reference(real_vb, vb);
}
+ for (i = 0; i < unbind_num_trailing_slots; i++) {
+ unsigned dst_index = start_slot + count + i;
+
+ pipe_vertex_buffer_unreference(&mgr->vertex_buffer[dst_index]);
+ pipe_vertex_buffer_unreference(&mgr->real_vertex_buffer[dst_index]);
+ }
+
mgr->user_vb_mask |= user_vb_mask;
mgr->incompatible_vb_mask |= incompatible_vb_mask;
mgr->nonzero_stride_vb_mask |= nonzero_stride_vb_mask;
start_slot = ffs(mgr->dirty_real_vb_mask) - 1;
count = util_last_bit(mgr->dirty_real_vb_mask >> start_slot);
- pipe->set_vertex_buffers(pipe, start_slot, count,
+ pipe->set_vertex_buffers(pipe, start_slot, count, 0,
mgr->real_vertex_buffer + start_slot);
mgr->dirty_real_vb_mask = 0;
}
void u_vbuf_unset_vertex_elements(struct u_vbuf *mgr);
void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *bufs);
void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
const struct pipe_draw_indirect_info *indirect,
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
- filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
+ filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4);
c->pipe->set_framebuffer_state(c->pipe, &c->fb_state);
c->pipe->bind_vs_state(c->pipe, c->vs);
- c->pipe->set_vertex_buffers(c->pipe, 0, 1, &c->vertex_buf);
+ c->pipe->set_vertex_buffers(c->pipe, 0, 1, 0, &c->vertex_buf);
c->pipe->bind_vertex_elements_state(c->pipe, c->vertex_elems_state);
pipe_set_constant_buffer(c->pipe, PIPE_SHADER_FRAGMENT, 0, s->shader_params);
c->pipe->bind_rasterizer_state(c->pipe, c->rast);
/* set up pipe state */
filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state);
- filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
+ filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
filter->pipe->bind_vs_state(filter->pipe, filter->vs);
filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
- filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
+ filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4);
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
- filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
+ filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, 0, &filter->quad);
filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4);
if (!ref_frames[j] || !ref_frames[j][i]) continue;
vb[2] = vl_vb_get_mv(&buf->vertex_stream, j);
- dec->context->set_vertex_buffers(dec->context, 0, 3, vb);
+ dec->context->set_vertex_buffers(dec->context, 0, 3, 0, vb);
vl_mc_render_ref(i ? &dec->mc_c : &dec->mc_y, &buf->mc[i], ref_frames[j][i]);
}
if (!buf->num_ycbcr_blocks[i]) continue;
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, i);
- dec->context->set_vertex_buffers(dec->context, 0, 2, vb);
+ dec->context->set_vertex_buffers(dec->context, 0, 2, 0, vb);
vl_zscan_render(i ? &dec->zscan_c : & dec->zscan_y, &buf->zscan[i] , buf->num_ycbcr_blocks[i]);
if (!buf->num_ycbcr_blocks[plane]) continue;
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, plane);
- dec->context->set_vertex_buffers(dec->context, 0, 2, vb);
+ dec->context->set_vertex_buffers(dec->context, 0, 2, 0, vb);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
vl_idct_prepare_stage2(i ? &dec->idct_c : &dec->idct_y, &buf->idct[plane]);
d3d12_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot,
unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct d3d12_context *ctx = d3d12_context(pctx);
util_set_vertex_buffers_count(ctx->vbs, &ctx->num_vbs,
- buffers, start_slot, num_buffers);
+ buffers, start_slot, num_buffers,
+ unbind_num_trailing_slots);
for (unsigned i = 0; i < ctx->num_vbs; ++i) {
const struct pipe_vertex_buffer* buf = ctx->vbs + i;
static void
etna_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot,
- unsigned num_buffers, const struct pipe_vertex_buffer *vb)
+ unsigned num_buffers, unsigned unbind_num_trailing_slots,
+ const struct pipe_vertex_buffer *vb)
{
struct etna_context *ctx = etna_context(pctx);
struct etna_vertexbuf_state *so = &ctx->vertex_buffer;
- util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot, num_buffers);
+ util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot,
+ num_buffers, unbind_num_trailing_slots);
so->count = util_last_bit(so->enabled_mask);
for (unsigned idx = start_slot; idx < start_slot + num_buffers; ++idx) {
pctx->set_viewport_states(pctx, 0, 1, &vp);
pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx);
- pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1,
+ pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1, 0,
&ctx->solid_vbuf_state.vertexbuf.vb[0]);
pctx->set_stream_output_targets(pctx, 0, NULL, NULL);
static void
fd_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct fd_context *ctx = fd_context(pctx);
}
}
- util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot, count);
+ util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb, start_slot,
+ count, unbind_num_trailing_slots);
so->count = util_last_bit(so->enabled_mask);
if (!vb)
static void i915_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct i915_context *i915 = i915_context(pipe);
util_set_vertex_buffers_count(i915->vertex_buffers,
&i915->nr_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
/* pass-through to draw module */
- draw_set_vertex_buffers(draw, start_slot, count, buffers);
+ draw_set_vertex_buffers(draw, start_slot, count,
+ unbind_num_trailing_slots, buffers);
}
static void *
static void
iris_set_vertex_buffers(struct pipe_context *ctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct iris_context *ice = (struct iris_context *) ctx;
}
}
+ for (unsigned i = 0; i < unbind_num_trailing_slots; i++) {
+ struct iris_vertex_buffer_state *state =
+ &genx->vertex_buffers[start_slot + count + i];
+
+ pipe_resource_reference(&state->resource, NULL);
+ }
+
ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS;
}
static void
lima_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct lima_context *ctx = lima_context(pctx);
struct lima_context_vertex_buffer *so = &ctx->vertex_buffers;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask,
- vb, start_slot, count);
+ vb, start_slot, count,
+ unbind_num_trailing_slots);
so->count = util_last_bit(so->enabled_mask);
ctx->dirty |= LIMA_CONTEXT_DIRTY_VERTEX_BUFF;
struct lima_context_vertex_buffer *so = &ctx->vertex_buffers;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, NULL,
- 0, ARRAY_SIZE(so->vb));
+ 0, 0, ARRAY_SIZE(so->vb));
pipe_surface_reference(&ctx->framebuffer.base.cbufs[0], NULL);
pipe_surface_reference(&ctx->framebuffer.base.zsbuf, NULL);
static void
llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
util_set_vertex_buffers_count(llvmpipe->vertex_buffer,
&llvmpipe->num_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
llvmpipe->dirty |= LP_NEW_VERTEX;
- draw_set_vertex_buffers(llvmpipe->draw, start_slot, count, buffers);
+ draw_set_vertex_buffers(llvmpipe->draw, start_slot, count,
+ unbind_num_trailing_slots, buffers);
}
if (nv30->draw_dirty & NV30_NEW_CLIP)
draw_set_clip_state(draw, &nv30->clip);
if (nv30->draw_dirty & NV30_NEW_ARRAYS) {
- draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, nv30->vtxbuf);
+ draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, 0, nv30->vtxbuf);
draw_set_vertex_elements(draw, nv30->vertex->num_elements, nv30->vertex->pipe);
}
if (nv30->draw_dirty & NV30_NEW_FRAGPROG) {
static void
nv30_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct nv30_context *nv30 = nv30_context(pipe);
nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VTXBUF);
util_set_vertex_buffers_count(nv30->vtxbuf, &nv30->num_vtxbufs,
- vb, start_slot, count);
+ vb, start_slot, count,
+ unbind_num_trailing_slots);
nv30->dirty |= NV30_NEW_ARRAYS;
}
static void
nv50_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct nv50_context *nv50 = nv50_context(pipe);
nv50->dirty_3d |= NV50_NEW_3D_ARRAYS;
util_set_vertex_buffers_count(nv50->vtxbuf, &nv50->num_vtxbufs, vb,
- start_slot, count);
+ start_slot, count,
+ unbind_num_trailing_slots);
if (!vb) {
nv50->vbo_user &= ~(((1ull << count) - 1) << start_slot);
static void
nvc0_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct nvc0_context *nvc0 = nvc0_context(pipe);
nvc0->dirty_3d |= NVC0_NEW_3D_ARRAYS;
util_set_vertex_buffers_count(nvc0->vtxbuf, &nvc0->num_vtxbufs, vb,
- start_slot, count);
+ start_slot, count,
+ unbind_num_trailing_slots);
if (!vb) {
nvc0->vbo_user &= ~(((1ull << count) - 1) << start_slot);
struct pipe_context *pctx,
unsigned start_slot,
unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct panfrost_context *ctx = pan_context(pctx);
- util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers, start_slot, num_buffers);
+ util_set_vertex_buffers_mask(ctx->vertex_buffers, &ctx->vb_mask, buffers,
+ start_slot, num_buffers, unbind_num_trailing_slots);
}
static void
vb.depth0 = 1;
r300->dummy_vb.buffer.resource = screen->resource_create(screen, &vb);
- r300->context.set_vertex_buffers(&r300->context, 0, 1, &r300->dummy_vb);
+ r300->context.set_vertex_buffers(&r300->context, 0, 1, 0, &r300->dummy_vb);
}
{
static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer* buffers)
{
struct r300_context* r300 = r300_context(pipe);
util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
/* There must be at least one vertex buffer set, otherwise it locks up. */
if (!r300->nr_vertex_buffers) {
util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers,
- &r300->dummy_vb, 0, 1);
+ &r300->dummy_vb, 0, 1, 0);
}
r300->vertex_arrays_dirty = TRUE;
static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer* buffers)
{
struct r300_context* r300 = r300_context(pipe);
util_set_vertex_buffers_count(r300->vertex_buffer,
&r300->nr_vertex_buffers,
- buffers, start_slot, count);
- draw_set_vertex_buffers(r300->draw, start_slot, count, buffers);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
+ draw_set_vertex_buffers(r300->draw, start_slot, count,
+ unbind_num_trailing_slots, buffers);
if (!buffers)
return;
vbuffer.stride = 2 * 4 * sizeof(float); /* vertex size */
vbuffer.buffer_offset = offset;
- rctx->b.set_vertex_buffers(&rctx->b, blitter->vb_slot, 1, &vbuffer);
+ rctx->b.set_vertex_buffers(&rctx->b, blitter->vb_slot, 1, 0, &vbuffer);
util_draw_arrays_instanced(&rctx->b, R600_PRIM_RECTANGLE_LIST, 0, 3,
0, num_instances);
pipe_resource_reference(&buf, NULL);
static void r600_set_vertex_buffers(struct pipe_context *ctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *input)
{
struct r600_context *rctx = (struct r600_context *)ctx;
disable_mask = ((1ull << count) - 1);
}
+ for (i = 0; i < unbind_num_trailing_slots; i++) {
+ pipe_resource_reference(&vb[count + i].buffer.resource, NULL);
+ }
+ disable_mask |= ((1ull << unbind_num_trailing_slots) - 1) << count;
+
disable_mask <<= start_slot;
new_buffer_mask <<= start_slot;
}
static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct si_context *sctx = (struct si_context *)ctx;
struct pipe_vertex_buffer *dst = sctx->vertex_buffer + start_slot;
- unsigned updated_mask = u_bit_consecutive(start_slot, count);
+ unsigned updated_mask = u_bit_consecutive(start_slot, count + unbind_num_trailing_slots);
uint32_t orig_unaligned = sctx->vertex_buffer_unaligned;
uint32_t unaligned = 0;
int i;
- assert(start_slot + count <= ARRAY_SIZE(sctx->vertex_buffer));
+ assert(start_slot + count + unbind_num_trailing_slots <= ARRAY_SIZE(sctx->vertex_buffer));
if (buffers) {
for (i = 0; i < count; i++) {
pipe_resource_reference(&dst[i].buffer.resource, NULL);
}
+ for (i = 0; i < unbind_num_trailing_slots; i++)
+ pipe_resource_reference(&dst[count + i].buffer.resource, NULL);
+
sctx->vertex_buffers_dirty = sctx->num_vertex_elements > 0;
sctx->vertex_buffer_unaligned = (orig_unaligned & ~updated_mask) | unaligned;
static void
softpipe_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct softpipe_context *softpipe = softpipe_context(pipe);
util_set_vertex_buffers_count(softpipe->vertex_buffer,
&softpipe->num_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
softpipe->dirty |= SP_NEW_VERTEX;
- draw_set_vertex_buffers(softpipe->draw, start_slot, count, buffers);
+ draw_set_vertex_buffers(softpipe->draw, start_slot, count,
+ unbind_num_trailing_slots, buffers);
}
static void
svga_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct svga_context *svga = svga_context(pipe);
util_set_vertex_buffers_count(svga->curr.vb,
&svga->curr.num_vertex_buffers,
- buffers, start_slot, count);
+ buffers, start_slot, count,
+ unbind_num_trailing_slots);
svga->dirty |= SVGA_NEW_VBUFFER;
}
if (dirty & SVGA_NEW_VBUFFER)
draw_set_vertex_buffers(svga->swtnl.draw, 0,
- svga->curr.num_vertex_buffers,
+ svga->curr.num_vertex_buffers, 0,
svga->curr.vb);
if (dirty & SVGA_NEW_VELEMENT)
swr_set_vertex_buffers(struct pipe_context *pipe,
unsigned start_slot,
unsigned num_elements,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct swr_context *ctx = swr_context(pipe);
&ctx->num_vertex_buffers,
buffers,
start_slot,
- num_elements);
+ num_elements,
+ unbind_num_trailing_slots);
ctx->dirty |= SWR_NEW_VERTEX;
}
static void
tegra_set_vertex_buffers(struct pipe_context *pcontext, unsigned start_slot,
- unsigned num_buffers,
+ unsigned num_buffers, unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct tegra_context *context = to_tegra_context(pcontext);
}
context->gpu->set_vertex_buffers(context->gpu, start_slot, num_buffers,
- buffers);
+ unbind_num_trailing_slots, buffers);
}
static struct pipe_stream_output_target *
static void
v3d_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct v3d_context *v3d = v3d_context(pctx);
struct v3d_vertexbuf_stateobj *so = &v3d->vertexbuf;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb,
- start_slot, count);
+ start_slot, count,
+ unbind_num_trailing_slots);
so->count = util_last_bit(so->enabled_mask);
v3d->dirty |= VC5_DIRTY_VTXBUF;
static void
vc4_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot, unsigned count,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *vb)
{
struct vc4_context *vc4 = vc4_context(pctx);
struct vc4_vertexbuf_stateobj *so = &vc4->vertexbuf;
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, vb,
- start_slot, count);
+ start_slot, count,
+ unbind_num_trailing_slots);
so->count = util_last_bit(so->enabled_mask);
vc4->dirty |= VC4_DIRTY_VTXBUF;
static void virgl_set_vertex_buffers(struct pipe_context *ctx,
unsigned start_slot,
unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct virgl_context *vctx = virgl_context(ctx);
util_set_vertex_buffers_count(vctx->vertex_buffer,
&vctx->num_vertex_buffers,
- buffers, start_slot, num_buffers);
+ buffers, start_slot, num_buffers,
+ unbind_num_trailing_slots);
if (buffers) {
for (unsigned i = 0; i < num_buffers; i++) {
zink_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot,
unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer *buffers)
{
struct zink_context *ctx = zink_context(pctx);
}
util_set_vertex_buffers_mask(ctx->buffers, &ctx->buffers_enabled_mask,
- buffers, start_slot, num_buffers);
+ buffers, start_slot, num_buffers,
+ unbind_num_trailing_slots);
}
static void
if (state->vb_dirty) {
state->pctx->set_vertex_buffers(state->pctx, state->start_vb,
- state->num_vb, state->vb);
+ state->num_vb, 0, state->vb);
state->vb_dirty = false;
}
}
state.start_vb = -1;
state.num_vb = 0;
- state.pctx->set_vertex_buffers(state.pctx, 0, PIPE_MAX_ATTRIBS, NULL);
+ state.pctx->set_vertex_buffers(state.pctx, 0, 0, PIPE_MAX_ATTRIBS, NULL);
state.pctx->bind_vertex_elements_state(state.pctx, NULL);
state.pctx->bind_vs_state(state.pctx, NULL);
state.pctx->bind_fs_state(state.pctx, NULL);
dummy_vtxbuf.is_user_buffer = false;
dummy_vtxbuf.buffer_offset = 0;
pipe->set_vertex_buffers(pipe, context->dummy_vbo_bound_at,
- 1, &dummy_vtxbuf);
+ 1, 0, &dummy_vtxbuf);
context->vbo_bound_done = TRUE;
}
mask &= ~(1 << context->dummy_vbo_bound_at);
for (i = 0; mask; mask >>= 1, ++i) {
if (mask & 1) {
if (context->vtxbuf[i].buffer.resource)
- pipe->set_vertex_buffers(pipe, i, 1, &context->vtxbuf[i]);
+ pipe->set_vertex_buffers(pipe, i, 1, 0, &context->vtxbuf[i]);
else
- pipe->set_vertex_buffers(pipe, i, 1, NULL);
+ pipe->set_vertex_buffers(pipe, i, 0, 1, NULL);
}
}
info.max_index = draw.count - 1;
info.index.resource = NULL;
- context->pipe->set_vertex_buffers(context->pipe, 0, 1, vtxbuf);
+ context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, vtxbuf);
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
}
else
info.index.user = user_ibuf;
- context->pipe->set_vertex_buffers(context->pipe, 0, 1, vbuf);
+ context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, vbuf);
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
}
pipe->set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0, NINE_MAX_SAMPLERS_VS, NULL);
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, NINE_MAX_SAMPLERS_PS, NULL);
- pipe->set_vertex_buffers(pipe, 0, device->caps.MaxStreams, NULL);
+ pipe->set_vertex_buffers(pipe, 0, 0, device->caps.MaxStreams, NULL);
for (i = 0; i < ARRAY_SIZE(context->rt); ++i)
nine_bind(&context->rt[i], NULL);
&(vtxbuf.buffer.resource));
u_upload_unmap(device->pipe_sw->stream_uploader);
}
- pipe_sw->set_vertex_buffers(pipe_sw, i, 1, &vtxbuf);
+ pipe_sw->set_vertex_buffers(pipe_sw, i, 1, 0, &vtxbuf);
pipe_vertex_buffer_unreference(&vtxbuf);
} else
- pipe_sw->set_vertex_buffers(pipe_sw, i, 1, NULL);
+ pipe_sw->set_vertex_buffers(pipe_sw, i, 0, 1, NULL);
}
}
nine_context_get_pipe_release(device);
int i;
for (i = 0; i < 4; i++) {
- pipe_sw->set_vertex_buffers(pipe_sw, i, 1, NULL);
+ pipe_sw->set_vertex_buffers(pipe_sw, i, 0, 1, NULL);
if (sw_internal->transfers_so[i])
pipe->transfer_unmap(pipe, sw_internal->transfers_so[i]);
sw_internal->transfers_so[i] = NULL;
void (*set_vertex_buffers)( struct pipe_context *,
unsigned start_slot,
unsigned num_buffers,
+ unsigned unbind_num_trailing_slots,
const struct pipe_vertex_buffer * );
/*@}*/
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
sizeof(vertices),
vertices);
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
vertices);
}
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
bytes,
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
sizeof(vertices),
vertices);
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
sizeof(vertices),
vertices);
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
num_verts * sizeof(struct vertex),
verts);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader(void)
sizeof(vertices),
vertices);
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
sizeof(inst_data),
inst_data);
- ctx->set_vertex_buffers(ctx, 0, 2, vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 2, 0, vbuf);
}
static void set_vertex_shader( void )
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
sizeof(vertices),
vertices);
- info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
+ info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
}
sizeof(vertices),
vertices);
- ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
+ ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
}
static void set_vertex_shader( void )
cso_set_vertex_buffers_and_elements(cso, &velements,
num_vbuffers,
unbind_trailing_vbuffers,
- vbuffer, uses_user_vertex_buffers);
+ uses_user_vertex_buffers,
+ vbuffer);
st->last_num_vbuffers = num_vbuffers;
/* Unreference uploaded current attrib buffer. */
}
}
- draw_set_vertex_buffers(draw, 0, num_vbuffers, vbuffers);
+ draw_set_vertex_buffers(draw, 0, num_vbuffers, 0, vbuffers);
draw_set_vertex_elements(draw, vp->num_inputs, velements.velems);
unsigned start = 0;
pipe_buffer_unmap(pipe, vb_transfer[buf]);
draw_set_mapped_vertex_buffer(draw, buf, NULL, 0);
}
- draw_set_vertex_buffers(draw, 0, num_vbuffers, NULL);
+ draw_set_vertex_buffers(draw, 0, 0, num_vbuffers, NULL);
draw_bind_vertex_shader(draw, NULL);
}