Seemed to make an attempt at running but no valid adapter found on laptop

This commit is contained in:
Warwick New 2025-04-21 18:44:27 +01:00
parent 45fbf0abca
commit cbd4b0f0e9

View file

@ -3,48 +3,35 @@
#include <stdio.h> #include <stdio.h>
#include <webgpu/webgpu.h> #include <webgpu/webgpu.h>
WGPUAdapter requestAdapterSync(WGPUInstance instance, static void OnRequestAdapter(WGPURequestAdapterStatus status,
WGPURequestAdapterOptions const *options) { WGPUAdapter adapter, WGPUStringView message,
typedef struct { void *userdata1, void *userdata2) {
WGPUAdapter adapter; // TODO handle messages and errors better
bool requestEnded; if (status != WGPURequestAdapterStatus_Success) {
} UserData; printf("%s", message.data);
UserData userData = {.adapter = NULL, .requestEnded = false};
// Callback called by wgpuInstanceRequestAdapter when the request returns
// This is a C++ lambda function, but could be any function defined in the
// global scope. It must be non-capturing (the brackets [] are empty) so
// that it behaves like a regular C function pointer, which is what
// wgpuInstanceRequestAdapter expects (WebGPU being a C API). The workaround
// is to convey what we want to capture through the pUserData pointer,
// provided as the last argument of wgpuInstanceRequestAdapter and received
// by the callback as its last argument.
auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status,
WGPUAdapter adapter, char const *message,
void *pUserData) {
UserData &userData = *reinterpret_cast<UserData *>(pUserData);
if (status == WGPURequestAdapterStatus_Success) {
userData.adapter = adapter;
} else {
std::cout << "Could not get WebGPU adapter: " << message << std::endl;
}
userData.requestEnded = true;
};
// Call to the WebGPU request adapter procedure
wgpuInstanceRequestAdapter(instance /* equivalent of navigator.gpu */,
options, onAdapterRequestEnded, (void *)&userData);
// We wait until userData.requestEnded gets true
{
{Wait for request to end
}
} }
assert(status == WGPURequestAdapterStatus_Success);
assert(userData.requestEnded); WGPUAdapter *result = userdata1;
if (*result == NULL) {
*result = adapter;
}
}
return userData.adapter; void requestAdapterSync(WGPUInstance instance,
WGPURequestAdapterOptions const *options,
WGPUAdapter *adapter) {
WGPURequestAdapterCallbackInfo info = {.mode = WGPUCallbackMode_WaitAnyOnly,
.callback = &OnRequestAdapter,
.userdata1 = adapter};
WGPUFuture future = wgpuInstanceRequestAdapter(instance, options, info);
WGPUFutureWaitInfo wait = {
.future = future,
};
WGPUWaitStatus status = wgpuInstanceWaitAny(instance, 1, &wait, 0);
assert(status == WGPUWaitStatus_Success);
assert(adapter);
} }
int main() { int main() {
@ -65,6 +52,14 @@ int main() {
// copied around without worrying about its size). // copied around without worrying about its size).
printf("WGPU instance: %p\n", instance); printf("WGPU instance: %p\n", instance);
printf("Requesting Adapter.\n");
WGPUAdapter adapter = NULL;
WGPURequestAdapterOptions adapterOpts = {0};
requestAdapterSync(instance, &adapterOpts, &adapter);
printf("Got Adapter: %p\n", &adapter);
// Cleanup
wgpuAdapterRelease(adapter);
wgpuInstanceRelease(instance); wgpuInstanceRelease(instance);
return 0; return 0;
} }