/*
 * Copyright (c) 2021 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#import "config.h"
#import "Instance.h"

#import "Adapter.h"
#import "Surface.h"
#import "WebGPUExt.h"
#import <cstring>
#import <wtf/StdLibExtras.h>

namespace WebGPU {

Instance::Instance() = default;

Instance::~Instance() = default;

Ref<Surface> Instance::createSurface(const WGPUSurfaceDescriptor* descriptor)
{
    UNUSED_PARAM(descriptor);
    return Surface::create();
}

void Instance::processEvents()
{
}

void Instance::requestAdapter(const WGPURequestAdapterOptions* options, WTF::Function<void(WGPURequestAdapterStatus, Ref<Adapter>&&, const char*)>&& callback)
{
    UNUSED_PARAM(options);
    UNUSED_PARAM(callback);
    callback(WGPURequestAdapterStatus_Unavailable, Adapter::create(), "Adapter");
}

} // namespace WebGPU

void wgpuInstanceRelease(WGPUInstance instance)
{
    delete instance;
}

WGPUInstance wgpuCreateInstance(const WGPUInstanceDescriptor* descriptor)
{
    UNUSED_PARAM(descriptor);
    return new WGPUInstanceImpl { WebGPU::Instance::create() };
}

WGPUProc wgpuGetProcAddress(WGPUDevice device, const char* procName)
{
    UNUSED_PARAM(device);
    // FIXME: Use gperf to make this faster.
    if (!strcmp(procName, "wgpuAdapterGetFeatureAtIndex"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterGetFeatureAtIndex);
    if (!strcmp(procName, "wgpuAdapterGetLimits"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterGetLimits);
    if (!strcmp(procName, "wgpuAdapterGetProperties"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterGetProperties);
    if (!strcmp(procName, "wgpuAdapterHasFeature"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterHasFeature);
    if (!strcmp(procName, "wgpuAdapterRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterRelease);
    if (!strcmp(procName, "wgpuAdapterRequestDevice"))
        return reinterpret_cast<WGPUProc>(&wgpuAdapterRequestDevice);
    if (!strcmp(procName, "wgpuBindGroupLayoutRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuBindGroupLayoutRelease);
    if (!strcmp(procName, "wgpuBindGroupLayoutSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuBindGroupLayoutSetLabel);
    if (!strcmp(procName, "wgpuBindGroupRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuBindGroupRelease);
    if (!strcmp(procName, "wgpuBindGroupSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuBindGroupSetLabel);
    if (!strcmp(procName, "wgpuBufferDestroy"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferDestroy);
    if (!strcmp(procName, "wgpuBufferGetConstMappedRange"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferGetConstMappedRange);
    if (!strcmp(procName, "wgpuBufferGetMappedRange"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferGetMappedRange);
    if (!strcmp(procName, "wgpuBufferMapAsync"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferMapAsync);
    if (!strcmp(procName, "wgpuBufferRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferRelease);
    if (!strcmp(procName, "wgpuBufferSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferSetLabel);
    if (!strcmp(procName, "wgpuBufferUnmap"))
        return reinterpret_cast<WGPUProc>(&wgpuBufferUnmap);
    if (!strcmp(procName, "wgpuCommandBufferRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandBufferRelease);
    if (!strcmp(procName, "wgpuCommandBufferSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandBufferSetLabel);
    if (!strcmp(procName, "wgpuCommandEncoderBeginComputePass"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderBeginComputePass);
    if (!strcmp(procName, "wgpuCommandEncoderBeginRenderPass"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderBeginRenderPass);
    if (!strcmp(procName, "wgpuCommandEncoderCopyBufferToBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderCopyBufferToBuffer);
    if (!strcmp(procName, "wgpuCommandEncoderCopyBufferToTexture"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderCopyBufferToTexture);
    if (!strcmp(procName, "wgpuCommandEncoderCopyTextureToBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderCopyTextureToBuffer);
    if (!strcmp(procName, "wgpuCommandEncoderCopyTextureToTexture"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderCopyTextureToTexture);
    if (!strcmp(procName, "wgpuCommandEncoderFillBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderFillBuffer);
    if (!strcmp(procName, "wgpuCommandEncoderFinish"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderFinish);
    if (!strcmp(procName, "wgpuCommandEncoderInsertDebugMarker"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderInsertDebugMarker);
    if (!strcmp(procName, "wgpuCommandEncoderPopDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderPopDebugGroup);
    if (!strcmp(procName, "wgpuCommandEncoderPushDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderPushDebugGroup);
    if (!strcmp(procName, "wgpuCommandEncoderRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderRelease);
    if (!strcmp(procName, "wgpuCommandEncoderResolveQuerySet"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderResolveQuerySet);
    if (!strcmp(procName, "wgpuCommandEncoderSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderSetLabel);
    if (!strcmp(procName, "wgpuCommandEncoderWriteTimestamp"))
        return reinterpret_cast<WGPUProc>(&wgpuCommandEncoderWriteTimestamp);
    if (!strcmp(procName, "wgpuComputePassEncoderBeginPipelineStatisticsQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderBeginPipelineStatisticsQuery);
    if (!strcmp(procName, "wgpuComputePassEncoderDispatch"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderDispatch);
    if (!strcmp(procName, "wgpuComputePassEncoderDispatchIndirect"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderDispatchIndirect);
    if (!strcmp(procName, "wgpuComputePassEncoderEndPass"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderEndPass);
    if (!strcmp(procName, "wgpuComputePassEncoderEndPipelineStatisticsQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderEndPipelineStatisticsQuery);
    if (!strcmp(procName, "wgpuComputePassEncoderInsertDebugMarker"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderInsertDebugMarker);
    if (!strcmp(procName, "wgpuComputePassEncoderPopDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderPopDebugGroup);
    if (!strcmp(procName, "wgpuComputePassEncoderPushDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderPushDebugGroup);
    if (!strcmp(procName, "wgpuComputePassEncoderRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderRelease);
    if (!strcmp(procName, "wgpuComputePassEncoderSetBindGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderSetBindGroup);
    if (!strcmp(procName, "wgpuComputePassEncoderSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderSetLabel);
    if (!strcmp(procName, "wgpuComputePassEncoderSetPipeline"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderSetPipeline);
    if (!strcmp(procName, "wgpuComputePassEncoderWriteTimestamp"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePassEncoderWriteTimestamp);
    if (!strcmp(procName, "wgpuComputePipelineGetBindGroupLayout"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePipelineGetBindGroupLayout);
    if (!strcmp(procName, "wgpuComputePipelineRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePipelineRelease);
    if (!strcmp(procName, "wgpuComputePipelineSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuComputePipelineSetLabel);
    if (!strcmp(procName, "wgpuCreateInstance"))
        return reinterpret_cast<WGPUProc>(&wgpuCreateInstance);
    if (!strcmp(procName, "wgpuDeviceCreateBindGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateBindGroup);
    if (!strcmp(procName, "wgpuDeviceCreateBindGroupLayout"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateBindGroupLayout);
    if (!strcmp(procName, "wgpuDeviceCreateBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateBuffer);
    if (!strcmp(procName, "wgpuDeviceCreateCommandEncoder"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateCommandEncoder);
    if (!strcmp(procName, "wgpuDeviceCreateComputePipeline"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateComputePipeline);
    if (!strcmp(procName, "wgpuDeviceCreateComputePipelineAsync"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateComputePipelineAsync);
    if (!strcmp(procName, "wgpuDeviceCreatePipelineLayout"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreatePipelineLayout);
    if (!strcmp(procName, "wgpuDeviceCreateQuerySet"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateQuerySet);
    if (!strcmp(procName, "wgpuDeviceCreateRenderBundleEncoder"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateRenderBundleEncoder);
    if (!strcmp(procName, "wgpuDeviceCreateRenderPipeline"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateRenderPipeline);
    if (!strcmp(procName, "wgpuDeviceCreateRenderPipelineAsync"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateRenderPipelineAsync);
    if (!strcmp(procName, "wgpuDeviceCreateSampler"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateSampler);
    if (!strcmp(procName, "wgpuDeviceCreateShaderModule"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateShaderModule);
    if (!strcmp(procName, "wgpuDeviceCreateSwapChain"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateSwapChain);
    if (!strcmp(procName, "wgpuDeviceCreateTexture"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceCreateTexture);
    if (!strcmp(procName, "wgpuDeviceDestroy"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceDestroy);
    if (!strcmp(procName, "wgpuDeviceGetLimits"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceGetLimits);
    if (!strcmp(procName, "wgpuDeviceGetQueue"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceGetQueue);
    if (!strcmp(procName, "wgpuDevicePopErrorScope"))
        return reinterpret_cast<WGPUProc>(&wgpuDevicePopErrorScope);
    if (!strcmp(procName, "wgpuDevicePushErrorScope"))
        return reinterpret_cast<WGPUProc>(&wgpuDevicePushErrorScope);
    if (!strcmp(procName, "wgpuDeviceRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceRelease);
    if (!strcmp(procName, "wgpuDeviceSetDeviceLostCallback"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceSetDeviceLostCallback);
    if (!strcmp(procName, "wgpuDeviceSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceSetLabel);
    if (!strcmp(procName, "wgpuDeviceSetUncapturedErrorCallback"))
        return reinterpret_cast<WGPUProc>(&wgpuDeviceSetUncapturedErrorCallback);
    if (!strcmp(procName, "wgpuGetProcAddress"))
        return reinterpret_cast<WGPUProc>(&wgpuGetProcAddress);
    if (!strcmp(procName, "wgpuInstanceCreateSurface"))
        return reinterpret_cast<WGPUProc>(&wgpuInstanceCreateSurface);
    if (!strcmp(procName, "wgpuInstanceProcessEvents"))
        return reinterpret_cast<WGPUProc>(&wgpuInstanceProcessEvents);
    if (!strcmp(procName, "wgpuInstanceRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuInstanceRelease);
    if (!strcmp(procName, "wgpuInstanceRequestAdapter"))
        return reinterpret_cast<WGPUProc>(&wgpuInstanceRequestAdapter);
    if (!strcmp(procName, "wgpuPipelineLayoutRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuPipelineLayoutRelease);
    if (!strcmp(procName, "wgpuPipelineLayoutSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuPipelineLayoutSetLabel);
    if (!strcmp(procName, "wgpuQuerySetDestroy"))
        return reinterpret_cast<WGPUProc>(&wgpuQuerySetDestroy);
    if (!strcmp(procName, "wgpuQuerySetRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuQuerySetRelease);
    if (!strcmp(procName, "wgpuQuerySetSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuQuerySetSetLabel);
    if (!strcmp(procName, "wgpuQueueOnSubmittedWorkDone"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueOnSubmittedWorkDone);
    if (!strcmp(procName, "wgpuQueueRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueRelease);
    if (!strcmp(procName, "wgpuQueueSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueSetLabel);
    if (!strcmp(procName, "wgpuQueueSubmit"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueSubmit);
    if (!strcmp(procName, "wgpuQueueWriteBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueWriteBuffer);
    if (!strcmp(procName, "wgpuQueueWriteTexture"))
        return reinterpret_cast<WGPUProc>(&wgpuQueueWriteTexture);
    if (!strcmp(procName, "wgpuRenderBundleEncoderDraw"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderDraw);
    if (!strcmp(procName, "wgpuRenderBundleEncoderDrawIndexed"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderDrawIndexed);
    if (!strcmp(procName, "wgpuRenderBundleEncoderDrawIndexedIndirect"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderDrawIndexedIndirect);
    if (!strcmp(procName, "wgpuRenderBundleEncoderDrawIndirect"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderDrawIndirect);
    if (!strcmp(procName, "wgpuRenderBundleEncoderFinish"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderFinish);
    if (!strcmp(procName, "wgpuRenderBundleEncoderInsertDebugMarker"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderInsertDebugMarker);
    if (!strcmp(procName, "wgpuRenderBundleEncoderPopDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderPopDebugGroup);
    if (!strcmp(procName, "wgpuRenderBundleEncoderPushDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderPushDebugGroup);
    if (!strcmp(procName, "wgpuRenderBundleEncoderRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderRelease);
    if (!strcmp(procName, "wgpuRenderBundleEncoderSetBindGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderSetBindGroup);
    if (!strcmp(procName, "wgpuRenderBundleEncoderSetIndexBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderSetIndexBuffer);
    if (!strcmp(procName, "wgpuRenderBundleEncoderSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderSetLabel);
    if (!strcmp(procName, "wgpuRenderBundleEncoderSetPipeline"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderSetPipeline);
    if (!strcmp(procName, "wgpuRenderBundleEncoderSetVertexBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleEncoderSetVertexBuffer);
    if (!strcmp(procName, "wgpuRenderBundleRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleRelease);
    if (!strcmp(procName, "wgpuRenderBundleSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderBundleSetLabel);
    if (!strcmp(procName, "wgpuRenderPassEncoderBeginOcclusionQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderBeginOcclusionQuery);
    if (!strcmp(procName, "wgpuRenderPassEncoderBeginPipelineStatisticsQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderBeginPipelineStatisticsQuery);
    if (!strcmp(procName, "wgpuRenderPassEncoderDraw"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderDraw);
    if (!strcmp(procName, "wgpuRenderPassEncoderDrawIndexed"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderDrawIndexed);
    if (!strcmp(procName, "wgpuRenderPassEncoderDrawIndexedIndirect"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderDrawIndexedIndirect);
    if (!strcmp(procName, "wgpuRenderPassEncoderDrawIndirect"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderDrawIndirect);
    if (!strcmp(procName, "wgpuRenderPassEncoderEndOcclusionQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderEndOcclusionQuery);
    if (!strcmp(procName, "wgpuRenderPassEncoderEndPass"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderEndPass);
    if (!strcmp(procName, "wgpuRenderPassEncoderEndPipelineStatisticsQuery"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderEndPipelineStatisticsQuery);
    if (!strcmp(procName, "wgpuRenderPassEncoderExecuteBundles"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderExecuteBundles);
    if (!strcmp(procName, "wgpuRenderPassEncoderInsertDebugMarker"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderInsertDebugMarker);
    if (!strcmp(procName, "wgpuRenderPassEncoderPopDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderPopDebugGroup);
    if (!strcmp(procName, "wgpuRenderPassEncoderPushDebugGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderPushDebugGroup);
    if (!strcmp(procName, "wgpuRenderPassEncoderRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderRelease);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetBindGroup"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetBindGroup);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetBlendConstant"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetBlendConstant);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetIndexBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetIndexBuffer);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetLabel);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetPipeline"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetPipeline);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetScissorRect"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetScissorRect);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetStencilReference"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetStencilReference);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetVertexBuffer"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetVertexBuffer);
    if (!strcmp(procName, "wgpuRenderPassEncoderSetViewport"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderSetViewport);
    if (!strcmp(procName, "wgpuRenderPassEncoderWriteTimestamp"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPassEncoderWriteTimestamp);
    if (!strcmp(procName, "wgpuRenderPipelineGetBindGroupLayout"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPipelineGetBindGroupLayout);
    if (!strcmp(procName, "wgpuRenderPipelineRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPipelineRelease);
    if (!strcmp(procName, "wgpuRenderPipelineSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuRenderPipelineSetLabel);
    if (!strcmp(procName, "wgpuSamplerRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuSamplerRelease);
    if (!strcmp(procName, "wgpuSamplerSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuSamplerSetLabel);
    if (!strcmp(procName, "wgpuShaderModuleRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuShaderModuleRelease);
    if (!strcmp(procName, "wgpuShaderModuleSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuShaderModuleSetLabel);
    if (!strcmp(procName, "wgpuSurfaceGetPreferredFormat"))
        return reinterpret_cast<WGPUProc>(&wgpuSurfaceGetPreferredFormat);
    if (!strcmp(procName, "wgpuSurfaceRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuSurfaceRelease);
    if (!strcmp(procName, "wgpuSwapChainGetCurrentTextureView"))
        return reinterpret_cast<WGPUProc>(&wgpuSwapChainGetCurrentTextureView);
    if (!strcmp(procName, "wgpuSwapChainPresent"))
        return reinterpret_cast<WGPUProc>(&wgpuSwapChainPresent);
    if (!strcmp(procName, "wgpuSwapChainRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuSwapChainRelease);
    if (!strcmp(procName, "wgpuTextureCreateView"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureCreateView);
    if (!strcmp(procName, "wgpuTextureDestroy"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureDestroy);
    if (!strcmp(procName, "wgpuTextureRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureRelease);
    if (!strcmp(procName, "wgpuTextureSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureSetLabel);
    if (!strcmp(procName, "wgpuTextureViewRelease"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureViewRelease);
    if (!strcmp(procName, "wgpuTextureViewSetLabel"))
        return reinterpret_cast<WGPUProc>(&wgpuTextureViewSetLabel);
    return nullptr;
}

WGPUSurface wgpuInstanceCreateSurface(WGPUInstance instance, const WGPUSurfaceDescriptor* descriptor)
{
    return new WGPUSurfaceImpl { instance->instance->createSurface(descriptor) };
}

void wgpuInstanceProcessEvents(WGPUInstance instance)
{
    instance->instance->processEvents();
}

void wgpuInstanceRequestAdapter(WGPUInstance instance, const WGPURequestAdapterOptions* options, WGPURequestAdapterCallback callback, void* userdata)
{
    instance->instance->requestAdapter(options, [callback, userdata] (WGPURequestAdapterStatus status, Ref<WebGPU::Adapter>&& adapter, const char* message) {
        callback(status, new WGPUAdapterImpl { WTFMove(adapter) }, message, userdata);
    });
}

