return;
struct zink_resource *res = zink_resource(ctx->vertex_buffers[slot].buffer.resource);
res->vbo_bind_mask &= ~BITFIELD_BIT(slot);
- ctx->vbufs[slot] = VK_NULL_HANDLE;
- ctx->vbuf_offsets[slot] = 0;
update_res_bind_count(ctx, res, false, true);
}
-ALWAYS_INLINE static struct zink_resource *
-set_vertex_buffer_clamped(struct zink_context *ctx, unsigned slot)
-{
- const struct pipe_vertex_buffer *ctx_vb = &ctx->vertex_buffers[slot];
- struct zink_resource *res = zink_resource(ctx_vb->buffer.resource);
- struct zink_screen *screen = zink_screen(ctx->base.screen);
- if (ctx_vb->buffer_offset > screen->info.props.limits.maxVertexInputAttributeOffset) {
- /* buffer offset exceeds maximum: make a tmp buffer at this offset */
- ctx->vbufs[slot] = zink_resource_tmp_buffer(screen, res, ctx_vb->buffer_offset, 0, &ctx->vbuf_offsets[slot]);
- util_dynarray_append(&res->obj->tmp, VkBuffer, ctx->vbufs[slot]);
- /* the driver is broken and sets a min alignment that's larger than its max offset: rebind as staging buffer */
- if (unlikely(ctx->vbuf_offsets[slot] > screen->info.props.limits.maxVertexInputAttributeOffset)) {
- static bool warned = false;
- if (!warned)
- debug_printf("zink: this vulkan driver is BROKEN! maxVertexInputAttributeOffset < VkMemoryRequirements::alignment\n");
- warned = true;
- }
- } else {
- ctx->vbufs[slot] = res->obj->buffer;
- ctx->vbuf_offsets[slot] = ctx_vb->buffer_offset;
- }
- assert(ctx->vbufs[slot]);
- return res;
-}
-
static void
zink_set_vertex_buffers(struct pipe_context *pctx,
unsigned start_slot,
/* always barrier before possible rebind */
zink_resource_buffer_barrier(ctx, res, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT);
- set_vertex_buffer_clamped(ctx, start_slot + i);
- } else
+ } else {
enabled_buffers &= ~BITFIELD_BIT(i);
+ }
}
} else {
if (need_state_change)
u_foreach_bit(slot, res->vbo_bind_mask) {
if (ctx->vertex_buffers[slot].buffer.resource != &res->base.b) //wrong context
goto end;
- set_vertex_buffer_clamped(ctx, slot);
num_rebinds++;
}
rebind_mask &= ~BITFIELD_BIT(TC_BINDING_VERTEX_BUFFER);
zink_rebind_all_buffers(struct zink_context *ctx)
{
struct zink_batch *batch = &ctx->batch;
- u_foreach_bit(slot, ctx->gfx_pipeline_state.vertex_buffers_enabled_mask)
- set_vertex_buffer_clamped(ctx, slot);
ctx->vertex_buffers_dirty = ctx->gfx_pipeline_state.vertex_buffers_enabled_mask > 0;
ctx->dirty_so_targets = ctx->num_so_targets > 0;
if (ctx->num_so_targets)
return;
for (unsigned i = 0; i < elems->hw_state.num_bindings; i++) {
- const unsigned buffer_id = ctx->element_state->binding_map[i];
- struct pipe_vertex_buffer *vb = ctx->vertex_buffers + buffer_id;
+ struct pipe_vertex_buffer *vb = ctx->vertex_buffers + ctx->element_state->binding_map[i];
assert(vb);
if (vb->buffer.resource) {
- buffers[i] = ctx->vbufs[buffer_id];
- assert(buffers[i]);
+ struct zink_resource *res = zink_resource(vb->buffer.resource);
+ assert(res->obj->buffer);
+ buffers[i] = res->obj->buffer;
+ buffer_offsets[i] = vb->buffer_offset;
+ buffer_strides[i] = vb->stride;
if (DYNAMIC_STATE == ZINK_DYNAMIC_VERTEX_INPUT)
elems->hw_state.dynbindings[i].stride = vb->stride;
- buffer_offsets[i] = ctx->vbuf_offsets[buffer_id];
- buffer_strides[i] = vb->stride;
zink_batch_resource_usage_set(&ctx->batch, zink_resource(vb->buffer.resource), false);
} else {
buffers[i] = zink_resource(ctx->dummy_vertex_buffer)->obj->buffer;