diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 1ef5a507c6f..9dc471a51c1 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -1067,6 +1067,14 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) if (BATCH_CHANGED) { zink_update_descriptor_refs(ctx, true); + + for (unsigned i = 0; i < info->num_globals; i++) { + struct zink_resource *res = zink_resource(info->globals[i]); + util_range_add(&res->base.b, &res->valid_buffer_range, 0, res->base.b.width0); + zink_batch_reference_resource_rw(ctx, res, true); + zink_screen(ctx->base.screen)->buffer_barrier(ctx, res, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT); + res->obj->unordered_read = res->obj->unordered_write = false; + } } if (ctx->compute_dirty) { /* update inlinable constants */ diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index e9f926d11ce..43c22923c1f 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -2134,6 +2134,10 @@ invalidate_buffer(struct zink_context *ctx, struct zink_resource *res) if (res->base.b.flags & PIPE_RESOURCE_FLAG_SPARSE) return false; + /* never invalidate a resource with a fixed address */ + if (res->base.b.flags & PIPE_RESOURCE_FLAG_FIXED_ADDRESS) + return false; + struct pipe_box box; u_box_3d(0, 0, 0, res->base.b.width0, 0, 0, &box); if (res->valid_buffer_range.start > res->valid_buffer_range.end && @@ -3079,6 +3083,14 @@ zink_buffer_subdata(struct pipe_context *ctx, struct pipe_resource *buffer, zink_buffer_unmap(ctx, transfer); } +static uint64_t +zink_resource_get_address_gallium(struct pipe_screen *pscreen, struct pipe_resource *pres) +{ + if (pres->flags & PIPE_RESOURCE_FLAG_FIXED_ADDRESS) + return zink_resource_get_address(zink_screen(pres->screen), zink_resource(pres)); + return 0; +} + static struct pipe_resource * zink_resource_get_separate_stencil(struct pipe_resource *pres) { @@ -3247,6 +3259,8 @@ zink_screen_resource_init(struct pipe_screen *pscreen) pscreen->memobj_destroy = zink_memobj_destroy; pscreen->resource_from_memobj = zink_resource_from_memobj; } + if (screen->info.have_KHR_buffer_device_address) + pscreen->resource_get_address = zink_resource_get_address_gallium; pscreen->resource_get_param = zink_resource_get_param; return true; }