summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Baker <charles@juicelabs.co>2022-01-13 20:19:33 +1300
committerMarge Bot <emma+marge@anholt.net>2022-01-21 16:44:14 +0000
commit1b88777e97f635612c560a2f00d349ea271581b1 (patch)
treeeafdb7c8b80f6c819e94e693fab5cb76a7c4829e
parent3712cd27671e1acd10dd53a19bd225f276514de6 (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.c34
-rw-r--r--src/gallium/drivers/zink/zink_context.h2
-rw-r--r--src/gallium/drivers/zink/zink_draw.cpp12
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;