ctx->di.bindless_dirty[1] = true;
}
+static void
+zink_set_global_binding(struct pipe_context *pctx,
+ unsigned first, unsigned count,
+ struct pipe_resource **resources,
+ uint32_t **handles)
+{
+ struct zink_context *ctx = zink_context(pctx);
+
+ size_t size = ctx->di.global_bindings.capacity;
+ if (!util_dynarray_resize(&ctx->di.global_bindings, struct pipe_resource*, first + count + 8))
+ unreachable("zink: out of memory somehow");
+ if (size != ctx->di.global_bindings.capacity) {
+ uint8_t *data = ctx->di.global_bindings.data;
+ memset(data + size, 0, ctx->di.global_bindings.capacity - size);
+ }
+
+ struct pipe_resource **globals = ctx->di.global_bindings.data;
+ for (unsigned i = 0; i < count; i++) {
+ if (resources && resources[i]) {
+ struct zink_resource *res = zink_resource(resources[i]);
+
+ util_range_add(&res->base.b, &res->valid_buffer_range, 0, res->base.b.width0);
+ pipe_resource_reference(&globals[first + i], resources[i]);
+
+ uint64_t addr = 0;
+ memcpy(&addr, handles[i], sizeof(addr));
+ addr += zink_resource_get_address(zink_screen(pctx->screen), res);
+ memcpy(handles[i], &addr, sizeof(addr));
+ zink_resource_usage_set(res, ctx->batch.state, true);
+ res->obj->unordered_read = res->obj->unordered_write = false;
+ 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);
+ } else if (globals[i]) {
+ zink_batch_reference_resource(&ctx->batch, zink_resource(globals[first + i]));
+ pipe_resource_reference(&globals[first + i], NULL);
+ }
+ }
+}
+
static void
zink_set_stencil_ref(struct pipe_context *pctx,
const struct pipe_stencil_ref ref)
}
}
}
+
+ unsigned global_count = util_dynarray_num_elements(&ctx->di.global_bindings, struct zink_resource*);
+ struct zink_resource **globals = ctx->di.global_bindings.data;
+ for (unsigned i = 0; i < global_count; i++) {
+ struct zink_resource *res = globals[i];
+ if (!res)
+ continue;
+ zink_batch_resource_usage_set(batch, res, true, true);
+ res->obj->unordered_read = res->obj->unordered_write = false;
+ }
}
static void
ctx->base.set_stream_output_targets = zink_set_stream_output_targets;
ctx->base.flush_resource = zink_flush_resource;
+ if (screen->info.have_KHR_buffer_device_address)
+ ctx->base.set_global_binding = zink_set_global_binding;
ctx->base.emit_string_marker = zink_emit_string_marker;