webgpu : Query for adapter support when registering WebGPU backend (#21579)
This commit is contained in:
parent
dcdcbad42a
commit
5473949070
|
|
@ -4033,8 +4033,14 @@ ggml_backend_reg_t ggml_backend_webgpu_reg() {
|
||||||
WEBGPU_LOG_DEBUG("ggml_backend_webgpu_reg()");
|
WEBGPU_LOG_DEBUG("ggml_backend_webgpu_reg()");
|
||||||
|
|
||||||
static ggml_backend_webgpu_reg_context ctx;
|
static ggml_backend_webgpu_reg_context ctx;
|
||||||
|
static ggml_backend_reg reg = {
|
||||||
|
/* .api_version = */ GGML_BACKEND_API_VERSION,
|
||||||
|
/* .iface = */ ggml_backend_webgpu_reg_i,
|
||||||
|
/* .context = */ &ctx,
|
||||||
|
};
|
||||||
|
|
||||||
ctx.name = GGML_WEBGPU_NAME;
|
ctx.name = GGML_WEBGPU_NAME;
|
||||||
ctx.device_count = 1;
|
ctx.device_count = 0;
|
||||||
|
|
||||||
wgpu::InstanceDescriptor instance_descriptor{};
|
wgpu::InstanceDescriptor instance_descriptor{};
|
||||||
std::vector<wgpu::InstanceFeatureName> instance_features = { wgpu::InstanceFeatureName::TimedWaitAny };
|
std::vector<wgpu::InstanceFeatureName> instance_features = { wgpu::InstanceFeatureName::TimedWaitAny };
|
||||||
|
|
@ -4053,19 +4059,28 @@ ggml_backend_reg_t ggml_backend_webgpu_reg() {
|
||||||
ctx.webgpu_global_ctx = webgpu_global_context(new webgpu_global_context_struct());
|
ctx.webgpu_global_ctx = webgpu_global_context(new webgpu_global_context_struct());
|
||||||
ctx.webgpu_global_ctx->instance = std::move(inst);
|
ctx.webgpu_global_ctx->instance = std::move(inst);
|
||||||
|
|
||||||
#ifdef __EMSCRIPTEN__
|
wgpu::Adapter adapter;
|
||||||
if (ctx.webgpu_global_ctx->instance == nullptr) {
|
if (ctx.webgpu_global_ctx->instance != nullptr) {
|
||||||
GGML_LOG_ERROR("ggml_webgpu: Failed to create WebGPU instance. Make sure either -sASYNCIFY or -sJSPI is set\n");
|
wgpu::RequestAdapterOptions options = {};
|
||||||
return nullptr;
|
|
||||||
}
|
// probe for adapter support
|
||||||
#endif
|
ctx.webgpu_global_ctx->instance.WaitAny(
|
||||||
GGML_ASSERT(ctx.webgpu_global_ctx->instance != nullptr);
|
ctx.webgpu_global_ctx->instance.RequestAdapter(
|
||||||
|
&options, wgpu::CallbackMode::AllowSpontaneous,
|
||||||
|
[&adapter](wgpu::RequestAdapterStatus status, wgpu::Adapter _adapter, const char * message) {
|
||||||
|
if (status != wgpu::RequestAdapterStatus::Success) {
|
||||||
|
GGML_LOG_ERROR("ggml_webgpu: Failed to get an adapter: %s\n", message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
adapter = std::move(_adapter);
|
||||||
|
}),
|
||||||
|
UINT64_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapter != nullptr) {
|
||||||
|
ctx.device_count = 1;
|
||||||
|
}
|
||||||
|
|
||||||
static ggml_backend_reg reg = {
|
|
||||||
/* .api_version = */ GGML_BACKEND_API_VERSION,
|
|
||||||
/* .iface = */ ggml_backend_webgpu_reg_i,
|
|
||||||
/* .context = */ &ctx,
|
|
||||||
};
|
|
||||||
return ®
|
return ®
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue