// Copyright (c) Wojciech Figat. All rights reserved.
#pragma once
#if GRAPHICS_API_WEBGPU
#include "Engine/Core/Types/String.h"
#include "IncludeWebGPU.h"
enum class PixelFormat : unsigned;
///
/// User data used by AsyncCallbackWebGPU to track state adn result.
///
struct AsyncCallbackDataWebGPU
{
String Message;
uint32 Status = 0;
intptr Result = 0;
double WaitTime = 0;
FORCE_INLINE void Call(bool success, uint32 status, WGPUStringView message)
{
Status = status;
if (!success)
Message.Set(message.data, message.data ? (int32)message.length : 0);
Platform::AtomicStore(&Result, success ? 1 : 2);
}
};
struct AsyncWaitParamsWebGPU
{
WGPUInstance Instance;
AsyncCallbackDataWebGPU* Data;
};
WGPUWaitStatus WebGPUAsyncWait(AsyncWaitParamsWebGPU params);
///
/// Helper utility to run WebGPU APIs that use async callback in sync by waiting on the spontaneous call back with an active-waiting loop.
///
template
struct AsyncCallbackWebGPU
{
UserData Data;
CallbackInfo Info;
AsyncCallbackWebGPU(CallbackInfo callbackDefault)
: Info(callbackDefault)
{
Info.mode = WGPUCallbackMode_AllowSpontaneous;
Info.userdata1 = &Data;
}
FORCE_INLINE WGPUWaitStatus Wait(WGPUInstance instance)
{
return WebGPUAsyncWait({ instance, &Data });
}
};
///
/// Set of utilities for rendering on Web GPU platform.
///
class RenderToolsWebGPU
{
public:
static WGPUVertexFormat ToVertexFormat(PixelFormat format);
static WGPUTextureFormat ToTextureFormat(PixelFormat format);
static PixelFormat ToPixelFormat(WGPUTextureFormat format);
static PixelFormat ToPixelFormat(WGPUVertexFormat format);
};
#endif