gallium: add unbind_num_trailing_slots to set_vertex_buffers
Instead of calling this functions again to unbind trailing slots, extend it to do it as part of the call that sets vertex buffers. This reduces CPU overhead. Only st/mesa benefits from this. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8298>
This commit is contained in:
parent
a51d4b10f1
commit
0278d1fa32
|
@ -1027,12 +1027,12 @@ void cso_set_vertex_buffers(struct cso_context *ctx,
|
|||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1052,8 +1052,8 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
|
|||
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;
|
||||
|
@ -1063,18 +1063,18 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
|
|||
/* Unbind all buffers in cso_context, because we'll use u_vbuf. */
|
||||
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count;
|
||||
if (unbind_vb_count)
|
||||
pipe->set_vertex_buffers(pipe, 0, 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;
|
||||
}
|
||||
|
@ -1083,17 +1083,18 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
|
|||
/* Unbind all buffers in u_vbuf, because we'll use cso_context. */
|
||||
unsigned unbind_vb_count = vb_count + unbind_trailing_vb_count;
|
||||
if (unbind_vb_count)
|
||||
u_vbuf_set_vertex_buffers(vbuf, 0, 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -169,8 +169,8 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
|
|||
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 */
|
||||
|
||||
|
|
|
@ -411,13 +411,15 @@ void draw_set_viewport_states( struct draw_context *draw,
|
|||
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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -284,6 +284,7 @@ void draw_set_tess_state(struct draw_context *draw,
|
|||
|
||||
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,
|
||||
|
|
|
@ -553,6 +553,7 @@ dd_context_set_shader_buffers(struct pipe_context *_pipe,
|
|||
static void
|
||||
dd_context_set_vertex_buffers(struct pipe_context *_pipe,
|
||||
unsigned start, unsigned num_buffers,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct dd_context *dctx = dd_context(_pipe);
|
||||
|
@ -560,7 +561,10 @@ dd_context_set_vertex_buffers(struct pipe_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
|
||||
|
|
|
@ -203,6 +203,7 @@ static void noop_delete_state(struct pipe_context *ctx, void *state)
|
|||
|
||||
static void noop_set_vertex_buffers(struct pipe_context *ctx,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -774,6 +774,7 @@ rbug_set_sampler_views(struct pipe_context *_pipe,
|
|||
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);
|
||||
|
@ -795,7 +796,7 @@ rbug_set_vertex_buffers(struct pipe_context *_pipe,
|
|||
}
|
||||
|
||||
pipe->set_vertex_buffers(pipe, start_slot,
|
||||
num_buffers,
|
||||
num_buffers, unbind_num_trailing_slots,
|
||||
buffers);
|
||||
|
||||
mtx_unlock(&rb_pipe->call_mutex);
|
||||
|
|
|
@ -1021,6 +1021,7 @@ trace_context_set_sampler_views(struct pipe_context *_pipe,
|
|||
static void
|
||||
trace_context_set_vertex_buffers(struct pipe_context *_pipe,
|
||||
unsigned start_slot, unsigned num_buffers,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct trace_context *tr_ctx = trace_context(_pipe);
|
||||
|
@ -1031,12 +1032,14 @@ trace_context_set_vertex_buffers(struct pipe_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();
|
||||
}
|
||||
|
|
|
@ -607,7 +607,7 @@ done:
|
|||
|
||||
/* 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 */
|
||||
|
|
|
@ -190,7 +190,7 @@ pp_run(struct pp_queue_t *ppq, struct pipe_resource *in,
|
|||
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 */
|
||||
|
|
|
@ -633,7 +633,7 @@ void util_blitter_restore_vertex_states(struct blitter_context *blitter)
|
|||
|
||||
/* Vertex buffer. */
|
||||
if (ctx->base.saved_vertex_buffer.buffer.resource) {
|
||||
pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1,
|
||||
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);
|
||||
}
|
||||
|
@ -1352,7 +1352,7 @@ static void blitter_draw(struct blitter_context_priv *ctx,
|
|||
return;
|
||||
u_upload_unmap(pipe->stream_uploader);
|
||||
|
||||
pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &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));
|
||||
|
||||
|
@ -2517,7 +2517,7 @@ void util_blitter_copy_buffer(struct blitter_context *blitter,
|
|||
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)
|
||||
|
@ -2583,7 +2583,7 @@ void util_blitter_clear_buffer(struct blitter_context *blitter,
|
|||
blitter_check_saved_vertex_states(ctx);
|
||||
blitter_disable_render_cond(ctx);
|
||||
|
||||
pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &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);
|
||||
|
|
|
@ -64,7 +64,7 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,8 @@
|
|||
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;
|
||||
|
@ -75,6 +76,9 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
|
|||
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]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -84,7 +88,8 @@ void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
|
|||
void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
|
||||
unsigned *dst_count,
|
||||
const struct pipe_vertex_buffer *src,
|
||||
unsigned start_slot, unsigned count)
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots)
|
||||
{
|
||||
unsigned i;
|
||||
uint32_t enabled_buffers = 0;
|
||||
|
@ -95,7 +100,7 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
|
|||
}
|
||||
|
||||
util_set_vertex_buffers_mask(dst, &enabled_buffers, src, start_slot,
|
||||
count);
|
||||
count, unbind_num_trailing_slots);
|
||||
|
||||
*dst_count = util_last_bit(enabled_buffers);
|
||||
}
|
||||
|
|
|
@ -40,12 +40,14 @@ extern "C" {
|
|||
void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
|
||||
uint32_t *enabled_buffers,
|
||||
const struct pipe_vertex_buffer *src,
|
||||
unsigned start_slot, unsigned count);
|
||||
unsigned 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,
|
||||
|
|
|
@ -1112,7 +1112,7 @@ tc_set_shader_buffers(struct pipe_context *_pipe,
|
|||
|
||||
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 */
|
||||
};
|
||||
|
||||
|
@ -1122,15 +1122,17 @@ tc_call_set_vertex_buffers(struct pipe_context *pipe, union tc_payload *payload)
|
|||
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);
|
||||
}
|
||||
|
@ -1138,19 +1140,20 @@ tc_call_set_vertex_buffers(struct pipe_context *pipe, union tc_payload *payload)
|
|||
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];
|
||||
|
@ -1167,8 +1170,8 @@ tc_set_vertex_buffers(struct pipe_context *_pipe,
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -391,7 +391,7 @@ void u_vbuf_destroy(struct u_vbuf *mgr)
|
|||
const unsigned num_vb = screen->get_shader_param(screen, PIPE_SHADER_VERTEX,
|
||||
PIPE_SHADER_CAP_MAX_INPUTS);
|
||||
|
||||
mgr->pipe->set_vertex_buffers(mgr->pipe, 0, 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]);
|
||||
|
@ -877,6 +877,7 @@ static void u_vbuf_delete_vertex_elements(void *ctx, void *state,
|
|||
|
||||
void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *bufs)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -888,7 +889,8 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
|
|||
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;
|
||||
|
@ -899,16 +901,18 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -953,6 +957,13 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
|
|||
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;
|
||||
|
@ -1251,7 +1262,7 @@ static void u_vbuf_set_driver_vertex_buffers(struct u_vbuf *mgr)
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -76,6 +76,7 @@ void u_vbuf_set_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,
|
||||
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,
|
||||
|
|
|
@ -457,7 +457,7 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
|
|||
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
|
||||
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
|
||||
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
|
||||
filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &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);
|
||||
|
|
|
@ -717,7 +717,7 @@ vl_compositor_gfx_render(struct vl_compositor_state *s,
|
|||
|
||||
c->pipe->set_framebuffer_state(c->pipe, &c->fb_state);
|
||||
c->pipe->bind_vs_state(c->pipe, c->vs);
|
||||
c->pipe->set_vertex_buffers(c->pipe, 0, 1, &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);
|
||||
|
|
|
@ -463,7 +463,7 @@ vl_deint_filter_render(struct vl_deint_filter *filter,
|
|||
|
||||
/* set up pipe state */
|
||||
filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state);
|
||||
filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &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,
|
||||
|
|
|
@ -296,7 +296,7 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter,
|
|||
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
|
||||
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
|
||||
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
|
||||
filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &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);
|
||||
|
|
|
@ -400,7 +400,7 @@ vl_median_filter_render(struct vl_median_filter *filter,
|
|||
filter->pipe->bind_fs_state(filter->pipe, filter->fs);
|
||||
filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
|
||||
filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
|
||||
filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &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);
|
||||
|
|
|
@ -794,7 +794,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder,
|
|||
if (!ref_frames[j] || !ref_frames[j][i]) continue;
|
||||
|
||||
vb[2] = vl_vb_get_mv(&buf->vertex_stream, j);
|
||||
dec->context->set_vertex_buffers(dec->context, 0, 3, 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]);
|
||||
}
|
||||
|
@ -805,7 +805,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder,
|
|||
if (!buf->num_ycbcr_blocks[i]) continue;
|
||||
|
||||
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, i);
|
||||
dec->context->set_vertex_buffers(dec->context, 0, 2, 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]);
|
||||
|
||||
|
@ -824,7 +824,7 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder,
|
|||
if (!buf->num_ycbcr_blocks[plane]) continue;
|
||||
|
||||
vb[1] = vl_vb_get_ycbcr(&buf->vertex_stream, plane);
|
||||
dec->context->set_vertex_buffers(dec->context, 0, 2, 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]);
|
||||
|
|
|
@ -1118,11 +1118,13 @@ static void
|
|||
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;
|
||||
|
|
|
@ -426,12 +426,14 @@ etna_set_viewport_states(struct pipe_context *pctx, unsigned start_slot,
|
|||
|
||||
static void
|
||||
etna_set_vertex_buffers(struct pipe_context *pctx, unsigned start_slot,
|
||||
unsigned num_buffers, 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) {
|
||||
|
|
|
@ -219,7 +219,7 @@ fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
|
|||
pctx->set_viewport_states(pctx, 0, 1, &vp);
|
||||
|
||||
pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx);
|
||||
pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1,
|
||||
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);
|
||||
|
||||
|
|
|
@ -340,6 +340,7 @@ fd_set_viewport_states(struct pipe_context *pctx,
|
|||
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);
|
||||
|
@ -363,7 +364,8 @@ fd_set_vertex_buffers(struct pipe_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)
|
||||
|
|
|
@ -1007,6 +1007,7 @@ static void i915_delete_rasterizer_state(struct pipe_context *pipe,
|
|||
|
||||
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);
|
||||
|
@ -1014,10 +1015,12 @@ static void i915_set_vertex_buffers(struct pipe_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 *
|
||||
|
|
|
@ -3421,6 +3421,7 @@ iris_delete_state(struct pipe_context *ctx, void *state)
|
|||
static void
|
||||
iris_set_vertex_buffers(struct pipe_context *ctx,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct iris_context *ice = (struct iris_context *) ctx;
|
||||
|
@ -3468,6 +3469,13 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < unbind_num_trailing_slots; i++) {
|
||||
struct iris_vertex_buffer_state *state =
|
||||
&genx->vertex_buffers[start_slot + count + i];
|
||||
|
||||
pipe_resource_reference(&state->resource, NULL);
|
||||
}
|
||||
|
||||
ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS;
|
||||
}
|
||||
|
||||
|
|
|
@ -184,13 +184,15 @@ lima_delete_vertex_elements_state(struct pipe_context *pctx, void *hwcso)
|
|||
static void
|
||||
lima_set_vertex_buffers(struct pipe_context *pctx,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned 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;
|
||||
|
@ -445,7 +447,7 @@ lima_state_fini(struct lima_context *ctx)
|
|||
struct lima_context_vertex_buffer *so = &ctx->vertex_buffers;
|
||||
|
||||
util_set_vertex_buffers_mask(so->vb, &so->enabled_mask, NULL,
|
||||
0, 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);
|
||||
|
|
|
@ -77,6 +77,7 @@ llvmpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
|
|||
static void
|
||||
llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
||||
|
@ -85,11 +86,13 @@ llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
|
|||
|
||||
util_set_vertex_buffers_count(llvmpipe->vertex_buffer,
|
||||
&llvmpipe->num_vertex_buffers,
|
||||
buffers, start_slot, count);
|
||||
buffers, 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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -394,7 +394,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
|
|||
if (nv30->draw_dirty & NV30_NEW_CLIP)
|
||||
draw_set_clip_state(draw, &nv30->clip);
|
||||
if (nv30->draw_dirty & NV30_NEW_ARRAYS) {
|
||||
draw_set_vertex_buffers(draw, 0, nv30->num_vtxbufs, 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) {
|
||||
|
|
|
@ -437,6 +437,7 @@ nv30_set_viewport_states(struct pipe_context *pipe,
|
|||
static void
|
||||
nv30_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *vb)
|
||||
{
|
||||
struct nv30_context *nv30 = nv30_context(pipe);
|
||||
|
@ -444,7 +445,8 @@ nv30_set_vertex_buffers(struct pipe_context *pipe,
|
|||
nouveau_bufctx_reset(nv30->bufctx, BUFCTX_VTXBUF);
|
||||
|
||||
util_set_vertex_buffers_count(nv30->vtxbuf, &nv30->num_vtxbufs,
|
||||
vb, start_slot, count);
|
||||
vb, start_slot, count,
|
||||
unbind_num_trailing_slots);
|
||||
|
||||
nv30->dirty |= NV30_NEW_ARRAYS;
|
||||
}
|
||||
|
|
|
@ -1075,6 +1075,7 @@ nv50_set_window_rectangles(struct pipe_context *pipe,
|
|||
static void
|
||||
nv50_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *vb)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
|
@ -1084,7 +1085,8 @@ nv50_set_vertex_buffers(struct pipe_context *pipe,
|
|||
nv50->dirty_3d |= NV50_NEW_3D_ARRAYS;
|
||||
|
||||
util_set_vertex_buffers_count(nv50->vtxbuf, &nv50->num_vtxbufs, vb,
|
||||
start_slot, count);
|
||||
start_slot, count,
|
||||
unbind_num_trailing_slots);
|
||||
|
||||
if (!vb) {
|
||||
nv50->vbo_user &= ~(((1ull << count) - 1) << start_slot);
|
||||
|
|
|
@ -996,6 +996,7 @@ nvc0_set_tess_state(struct pipe_context *pipe,
|
|||
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);
|
||||
|
@ -1005,7 +1006,8 @@ nvc0_set_vertex_buffers(struct pipe_context *pipe,
|
|||
nvc0->dirty_3d |= NVC0_NEW_3D_ARRAYS;
|
||||
|
||||
util_set_vertex_buffers_count(nvc0->vtxbuf, &nvc0->num_vtxbufs, vb,
|
||||
start_slot, count);
|
||||
start_slot, count,
|
||||
unbind_num_trailing_slots);
|
||||
|
||||
if (!vb) {
|
||||
nvc0->vbo_user &= ~(((1ull << count) - 1) << start_slot);
|
||||
|
|
|
@ -1008,11 +1008,13 @@ panfrost_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 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
|
||||
|
|
|
@ -471,7 +471,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
|||
vb.depth0 = 1;
|
||||
|
||||
r300->dummy_vb.buffer.resource = screen->resource_create(screen, &vb);
|
||||
r300->context.set_vertex_buffers(&r300->context, 0, 1, &r300->dummy_vb);
|
||||
r300->context.set_vertex_buffers(&r300->context, 0, 1, 0, &r300->dummy_vb);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -1732,19 +1732,21 @@ static void r300_set_viewport_states(struct pipe_context* pipe,
|
|||
|
||||
static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned 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;
|
||||
|
@ -1752,6 +1754,7 @@ static void r300_set_vertex_buffers_hwtcl(struct pipe_context* pipe,
|
|||
|
||||
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);
|
||||
|
@ -1759,8 +1762,10 @@ static void r300_set_vertex_buffers_swtcl(struct pipe_context* pipe,
|
|||
|
||||
util_set_vertex_buffers_count(r300->vertex_buffer,
|
||||
&r300->nr_vertex_buffers,
|
||||
buffers, start_slot, count);
|
||||
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;
|
||||
|
|
|
@ -207,7 +207,7 @@ void r600_draw_rectangle(struct blitter_context *blitter,
|
|||
vbuffer.stride = 2 * 4 * sizeof(float); /* vertex size */
|
||||
vbuffer.buffer_offset = offset;
|
||||
|
||||
rctx->b.set_vertex_buffers(&rctx->b, blitter->vb_slot, 1, &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);
|
||||
|
|
|
@ -566,6 +566,7 @@ void r600_vertex_buffers_dirty(struct r600_context *rctx)
|
|||
|
||||
static void r600_set_vertex_buffers(struct pipe_context *ctx,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *input)
|
||||
{
|
||||
struct r600_context *rctx = (struct r600_context *)ctx;
|
||||
|
@ -602,6 +603,11 @@ static void r600_set_vertex_buffers(struct pipe_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;
|
||||
|
||||
|
|
|
@ -4829,16 +4829,17 @@ static void si_delete_vertex_element(struct pipe_context *ctx, void *state)
|
|||
}
|
||||
|
||||
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++) {
|
||||
|
@ -4863,6 +4864,9 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, unsigned start_slot,
|
|||
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;
|
||||
|
||||
|
|
|
@ -81,6 +81,7 @@ softpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
|
|||
static void
|
||||
softpipe_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned start_slot, unsigned count,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context(pipe);
|
||||
|
@ -89,11 +90,13 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe,
|
|||
|
||||
util_set_vertex_buffers_count(softpipe->vertex_buffer,
|
||||
&softpipe->num_vertex_buffers,
|
||||
buffers, start_slot, count);
|
||||
buffers, 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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -43,13 +43,15 @@
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ update_swtnl_draw(struct svga_context *svga, uint64_t dirty)
|
|||
|
||||
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)
|
||||
|
|
|
@ -664,6 +664,7 @@ static void
|
|||
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);
|
||||
|
@ -674,7 +675,8 @@ swr_set_vertex_buffers(struct pipe_context *pipe,
|
|||
&ctx->num_vertex_buffers,
|
||||
buffers,
|
||||
start_slot,
|
||||
num_elements);
|
||||
num_elements,
|
||||
unbind_num_trailing_slots);
|
||||
|
||||
ctx->dirty |= SWR_NEW_VERTEX;
|
||||
}
|
||||
|
|
|
@ -622,7 +622,7 @@ tegra_set_shader_images(struct pipe_context *pcontext, unsigned int shader,
|
|||
|
||||
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);
|
||||
|
@ -641,7 +641,7 @@ tegra_set_vertex_buffers(struct pipe_context *pcontext, unsigned start_slot,
|
|||
}
|
||||
|
||||
context->gpu->set_vertex_buffers(context->gpu, start_slot, num_buffers,
|
||||
buffers);
|
||||
unbind_num_trailing_slots, buffers);
|
||||
}
|
||||
|
||||
static struct pipe_stream_output_target *
|
||||
|
|
|
@ -290,13 +290,15 @@ v3d_set_viewport_states(struct pipe_context *pctx,
|
|||
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;
|
||||
|
|
|
@ -313,13 +313,15 @@ vc4_set_viewport_states(struct pipe_context *pctx,
|
|||
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;
|
||||
|
|
|
@ -569,13 +569,15 @@ static void virgl_bind_vertex_elements_state(struct pipe_context *ctx,
|
|||
static void virgl_set_vertex_buffers(struct pipe_context *ctx,
|
||||
unsigned start_slot,
|
||||
unsigned num_buffers,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
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++) {
|
||||
|
|
|
@ -483,6 +483,7 @@ static void
|
|||
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);
|
||||
|
@ -502,7 +503,8 @@ zink_set_vertex_buffers(struct pipe_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
|
||||
|
|
|
@ -237,7 +237,7 @@ static void emit_state(struct rendering_state *state)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -2755,7 +2755,7 @@ VkResult lvp_execute_cmds(struct lvp_device *device,
|
|||
}
|
||||
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);
|
||||
|
|
|
@ -906,7 +906,7 @@ update_vertex_buffers(struct NineDevice9 *device)
|
|||
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);
|
||||
|
@ -915,9 +915,9 @@ update_vertex_buffers(struct NineDevice9 *device)
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2390,7 +2390,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_primitive_from_vtxbuf,
|
|||
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);
|
||||
}
|
||||
|
@ -2425,7 +2425,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
|
|||
else
|
||||
info.index.user = user_ibuf;
|
||||
|
||||
context->pipe->set_vertex_buffers(context->pipe, 0, 1, vbuf);
|
||||
context->pipe->set_vertex_buffers(context->pipe, 0, 1, 0, vbuf);
|
||||
|
||||
context->pipe->draw_vbo(context->pipe, &info, NULL, &draw, 1);
|
||||
}
|
||||
|
@ -2916,7 +2916,7 @@ nine_context_clear(struct NineDevice9 *device)
|
|||
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);
|
||||
|
@ -3100,10 +3100,10 @@ update_vertex_buffers_sw(struct NineDevice9 *device, int start_vertice, int num_
|
|||
&(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);
|
||||
|
@ -3243,7 +3243,7 @@ nine_state_after_draw_sw(struct NineDevice9 *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;
|
||||
|
|
|
@ -514,6 +514,7 @@ struct pipe_context {
|
|||
void (*set_vertex_buffers)( struct pipe_context *,
|
||||
unsigned start_slot,
|
||||
unsigned num_buffers,
|
||||
unsigned unbind_num_trailing_slots,
|
||||
const struct pipe_vertex_buffer * );
|
||||
|
||||
/*@}*/
|
||||
|
|
|
@ -76,7 +76,7 @@ set_vertices(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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ set_vertices(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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -179,7 +179,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -102,7 +102,7 @@ set_vertices(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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ static void set_vertices( void )
|
|||
vertices);
|
||||
}
|
||||
|
||||
ctx->set_vertex_buffers(ctx, 0, 1, &vbuf);
|
||||
ctx->set_vertex_buffers(ctx, 0, 1, 0, &vbuf);
|
||||
}
|
||||
|
||||
static void set_vertex_shader( void )
|
||||
|
|
|
@ -101,7 +101,7 @@ set_vertices(struct vertex *vertices, unsigned bytes)
|
|||
bytes,
|
||||
vertices);
|
||||
|
||||
info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
|
||||
info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, &vbuf);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -63,7 +63,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -95,7 +95,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -79,7 +79,7 @@ set_vertices(struct vertex *verts, unsigned num_verts)
|
|||
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 )
|
||||
|
|
|
@ -61,7 +61,7 @@ static void set_vertices(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)
|
||||
|
|
|
@ -96,7 +96,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -147,7 +147,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -65,7 +65,7 @@ static void set_vertices( 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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ static void set_vertices( 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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -172,7 +172,7 @@ static void set_vertices( 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 )
|
||||
|
|
|
@ -354,7 +354,8 @@ st_update_array(struct st_context *st)
|
|||
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. */
|
||||
|
|
|
@ -182,7 +182,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -517,7 +517,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
|||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue