diff options
author | Charles Baker <charles@juicelabs.co> | 2022-01-13 20:19:33 +1300 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-01-21 16:44:14 +0000 |
commit | 1b88777e97f635612c560a2f00d349ea271581b1 (patch) | |
tree | eafdb7c8b80f6c819e94e693fab5cb76a7c4829e | |
parent | 3712cd27671e1acd10dd53a19bd225f276514de6 (diff) |
Revert "zink: handle vertex buffer offset overflows"
This reverts commit 9823b970fb51db21ac6ce29753eba82dc25f3072.
From VkPhysicalDeviceLimits [1]:
> maxVertexInputAttributeOffset is the maximum vertex input attribute
offset that can be added to the vertex input binding stride. The offset
member of the VkVertexInputAttributeDescription structure must be
less than or equal to this limit.
The maxVertexInputAttributeOffset is a limit on the offset of a vertex
attribute within a vertex rather than a limit on offsets for vertex
buffer bindings. The code to bind temporary buffers can be removed.
[1] https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkPhysicalDeviceLimits.html
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14572>
-rw-r--r-- | src/gallium/drivers/zink/zink_context.c | 34 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_context.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_draw.cpp | 12 |
3 files changed, 8 insertions, 40 deletions
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 5352c2c6e7b..8d1d89845cc 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -919,36 +919,9 @@ update_existing_vbo(struct zink_context *ctx, unsigned slot) 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, @@ -986,9 +959,9 @@ zink_set_vertex_buffers(struct pipe_context *pctx, /* 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) @@ -3807,7 +3780,6 @@ rebind_buffer(struct zink_context *ctx, struct zink_resource *res, uint32_t rebi 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); @@ -3951,8 +3923,6 @@ void 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) diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index eaf0ffe5f3b..4fa1bea3d93 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -259,8 +259,6 @@ struct zink_context { uint16_t rp_clears_enabled; uint16_t fbfetch_outputs; - VkBuffer vbufs[PIPE_MAX_ATTRIBS]; - unsigned vbuf_offsets[PIPE_MAX_ATTRIBS]; struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS]; bool vertex_buffers_dirty; diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 875b45ab992..c3f5ab16134 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -134,16 +134,16 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx) 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; |