// Copyright 2021 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/dawn_node/binding/Converter.h"

#include "src/dawn_node/binding/GPUBuffer.h"
#include "src/dawn_node/binding/GPUPipelineLayout.h"
#include "src/dawn_node/binding/GPUSampler.h"
#include "src/dawn_node/binding/GPUShaderModule.h"
#include "src/dawn_node/binding/GPUTexture.h"
#include "src/dawn_node/binding/GPUTextureView.h"
#include "src/dawn_node/utils/Debug.h"

namespace wgpu::binding {

    Converter::~Converter() {
        for (auto& free : free_) {
            free();
        }
    }

    bool Converter::Convert(wgpu::Extent3D& out, const interop::GPUExtent3D& in) {
        out = {};
        if (auto* dict = std::get_if<interop::GPUExtent3DDict>(&in)) {
            out.depthOrArrayLayers = dict->depthOrArrayLayers;
            out.width = dict->width;
            out.height = dict->height;
            return true;
        }
        if (auto* vec = std::get_if<std::vector<interop::GPUIntegerCoordinate>>(&in)) {
            switch (vec->size()) {
                default:
                case 3:
                    out.depthOrArrayLayers = (*vec)[2];
                case 2:  // fallthrough
                    out.height = (*vec)[1];
                case 1:  // fallthrough
                    out.width = (*vec)[0];
                    return true;
                case 0:
                    break;
            }
        }
        Napi::Error::New(env, "invalid value for GPUExtent3D").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::Origin3D& out, const interop::GPUOrigin3DDict& in) {
        out = {};
        out.x = in.x;
        out.y = in.y;
        out.z = in.z;
        return true;
    }

    bool Converter::Convert(wgpu::Color& out, const interop::GPUColor& in) {
        out = {};
        if (auto* dict = std::get_if<interop::GPUColorDict>(&in)) {
            out.r = dict->r;
            out.g = dict->g;
            out.b = dict->b;
            out.a = dict->a;
            return true;
        }
        if (auto* vec = std::get_if<std::vector<double>>(&in)) {
            switch (vec->size()) {
                default:
                case 4:
                    out.a = (*vec)[3];
                case 3:  // fallthrough
                    out.b = (*vec)[2];
                case 2:  // fallthrough
                    out.g = (*vec)[1];
                case 1:  // fallthrough
                    out.r = (*vec)[0];
                    return true;
                case 0:
                    break;
            }
        }
        Napi::Error::New(env, "invalid value for GPUColor").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::Origin3D& out,
                            const std::vector<interop::GPUIntegerCoordinate>& in) {
        out = {};
        switch (in.size()) {
            default:
            case 3:
                out.z = in[2];
            case 2:  // fallthrough
                out.y = in[1];
            case 1:  // fallthrough
                out.x = in[0];
            case 0:
                break;
        }
        return true;
    }

    bool Converter::Convert(wgpu::TextureAspect& out, const interop::GPUTextureAspect& in) {
        out = wgpu::TextureAspect::All;
        switch (in) {
            case interop::GPUTextureAspect::kAll:
                out = wgpu::TextureAspect::All;
                return true;
            case interop::GPUTextureAspect::kStencilOnly:
                out = wgpu::TextureAspect::StencilOnly;
                return true;
            case interop::GPUTextureAspect::kDepthOnly:
                out = wgpu::TextureAspect::DepthOnly;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUTextureAspect").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::ImageCopyTexture& out, const interop::GPUImageCopyTexture& in) {
        out = {};
        return Convert(out.texture, in.texture) && Convert(out.mipLevel, in.mipLevel) &&
               Convert(out.origin, in.origin) && Convert(out.aspect, in.aspect);
    }

    bool Converter::Convert(wgpu::ImageCopyBuffer& out, const interop::GPUImageCopyBuffer& in) {
        out = {};
        out.buffer = *in.buffer.As<GPUBuffer>();
        return Convert(out.layout.offset, in.offset) &&
               Convert(out.layout.bytesPerRow, in.bytesPerRow) &&
               Convert(out.layout.rowsPerImage, in.rowsPerImage);
    }

    bool Converter::Convert(BufferSource& out, interop::BufferSource in) {
        out = {};
        if (auto* view = std::get_if<interop::ArrayBufferView>(&in)) {
            std::visit(
                [&](auto&& v) {
                    auto arr = v.ArrayBuffer();
                    out.data = arr.Data();
                    out.size = arr.ByteLength();
                },
                *view);
            return true;
        }
        if (auto* arr = std::get_if<interop::ArrayBuffer>(&in)) {
            out.data = arr->Data();
            out.size = arr->ByteLength();
            return true;
        }
        Napi::Error::New(env, "invalid value for BufferSource").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::TextureDataLayout& out, const interop::GPUImageDataLayout& in) {
        out = {};
        return Convert(out.bytesPerRow, in.bytesPerRow) && Convert(out.offset, in.offset) &&
               Convert(out.rowsPerImage, in.rowsPerImage);
    }

    bool Converter::Convert(wgpu::TextureFormat& out, const interop::GPUTextureFormat& in) {
        out = wgpu::TextureFormat::Undefined;
        switch (in) {
            case interop::GPUTextureFormat::kR8Unorm:
                out = wgpu::TextureFormat::R8Unorm;
                return true;
            case interop::GPUTextureFormat::kR8Snorm:
                out = wgpu::TextureFormat::R8Snorm;
                return true;
            case interop::GPUTextureFormat::kR8Uint:
                out = wgpu::TextureFormat::R8Uint;
                return true;
            case interop::GPUTextureFormat::kR8Sint:
                out = wgpu::TextureFormat::R8Sint;
                return true;
            case interop::GPUTextureFormat::kR16Uint:
                out = wgpu::TextureFormat::R16Uint;
                return true;
            case interop::GPUTextureFormat::kR16Sint:
                out = wgpu::TextureFormat::R16Sint;
                return true;
            case interop::GPUTextureFormat::kR16Float:
                out = wgpu::TextureFormat::R16Float;
                return true;
            case interop::GPUTextureFormat::kRg8Unorm:
                out = wgpu::TextureFormat::RG8Unorm;
                return true;
            case interop::GPUTextureFormat::kRg8Snorm:
                out = wgpu::TextureFormat::RG8Snorm;
                return true;
            case interop::GPUTextureFormat::kRg8Uint:
                out = wgpu::TextureFormat::RG8Uint;
                return true;
            case interop::GPUTextureFormat::kRg8Sint:
                out = wgpu::TextureFormat::RG8Sint;
                return true;
            case interop::GPUTextureFormat::kR32Uint:
                out = wgpu::TextureFormat::R32Uint;
                return true;
            case interop::GPUTextureFormat::kR32Sint:
                out = wgpu::TextureFormat::R32Sint;
                return true;
            case interop::GPUTextureFormat::kR32Float:
                out = wgpu::TextureFormat::R32Float;
                return true;
            case interop::GPUTextureFormat::kRg16Uint:
                out = wgpu::TextureFormat::RG16Uint;
                return true;
            case interop::GPUTextureFormat::kRg16Sint:
                out = wgpu::TextureFormat::RG16Sint;
                return true;
            case interop::GPUTextureFormat::kRg16Float:
                out = wgpu::TextureFormat::RG16Float;
                return true;
            case interop::GPUTextureFormat::kRgba8Unorm:
                out = wgpu::TextureFormat::RGBA8Unorm;
                return true;
            case interop::GPUTextureFormat::kRgba8UnormSrgb:
                out = wgpu::TextureFormat::RGBA8UnormSrgb;
                return true;
            case interop::GPUTextureFormat::kRgba8Snorm:
                out = wgpu::TextureFormat::RGBA8Snorm;
                return true;
            case interop::GPUTextureFormat::kRgba8Uint:
                out = wgpu::TextureFormat::RGBA8Uint;
                return true;
            case interop::GPUTextureFormat::kRgba8Sint:
                out = wgpu::TextureFormat::RGBA8Sint;
                return true;
            case interop::GPUTextureFormat::kBgra8Unorm:
                out = wgpu::TextureFormat::BGRA8Unorm;
                return true;
            case interop::GPUTextureFormat::kBgra8UnormSrgb:
                out = wgpu::TextureFormat::BGRA8UnormSrgb;
                return true;
            case interop::GPUTextureFormat::kRgb9E5Ufloat:
                out = wgpu::TextureFormat::RGB9E5Ufloat;
                return true;
            case interop::GPUTextureFormat::kRgb10A2Unorm:
                out = wgpu::TextureFormat::RGB10A2Unorm;
                return true;
            case interop::GPUTextureFormat::kRg11B10Ufloat:
                out = wgpu::TextureFormat::RG11B10Ufloat;
                return true;
            case interop::GPUTextureFormat::kRg32Uint:
                out = wgpu::TextureFormat::RG32Uint;
                return true;
            case interop::GPUTextureFormat::kRg32Sint:
                out = wgpu::TextureFormat::RG32Sint;
                return true;
            case interop::GPUTextureFormat::kRg32Float:
                out = wgpu::TextureFormat::RG32Float;
                return true;
            case interop::GPUTextureFormat::kRgba16Uint:
                out = wgpu::TextureFormat::RGBA16Uint;
                return true;
            case interop::GPUTextureFormat::kRgba16Sint:
                out = wgpu::TextureFormat::RGBA16Sint;
                return true;
            case interop::GPUTextureFormat::kRgba16Float:
                out = wgpu::TextureFormat::RGBA16Float;
                return true;
            case interop::GPUTextureFormat::kRgba32Uint:
                out = wgpu::TextureFormat::RGBA32Uint;
                return true;
            case interop::GPUTextureFormat::kRgba32Sint:
                out = wgpu::TextureFormat::RGBA32Sint;
                return true;
            case interop::GPUTextureFormat::kRgba32Float:
                out = wgpu::TextureFormat::RGBA32Float;
                return true;
            case interop::GPUTextureFormat::kStencil8:
                out = wgpu::TextureFormat::Stencil8;
                return true;
            case interop::GPUTextureFormat::kDepth16Unorm:
                break;  // TODO(crbug.com/dawn/1130): Unsupported.
            case interop::GPUTextureFormat::kDepth24Plus:
                out = wgpu::TextureFormat::Depth24Plus;
                return true;
            case interop::GPUTextureFormat::kDepth24PlusStencil8:
                out = wgpu::TextureFormat::Depth24PlusStencil8;
                return true;
            case interop::GPUTextureFormat::kDepth32Float:
                out = wgpu::TextureFormat::Depth32Float;
                return true;
            case interop::GPUTextureFormat::kBc1RgbaUnorm:
                out = wgpu::TextureFormat::BC1RGBAUnorm;
                return true;
            case interop::GPUTextureFormat::kBc1RgbaUnormSrgb:
                out = wgpu::TextureFormat::BC1RGBAUnormSrgb;
                return true;
            case interop::GPUTextureFormat::kBc2RgbaUnorm:
                out = wgpu::TextureFormat::BC2RGBAUnorm;
                return true;
            case interop::GPUTextureFormat::kBc2RgbaUnormSrgb:
                out = wgpu::TextureFormat::BC2RGBAUnormSrgb;
                return true;
            case interop::GPUTextureFormat::kBc3RgbaUnorm:
                out = wgpu::TextureFormat::BC3RGBAUnorm;
                return true;
            case interop::GPUTextureFormat::kBc3RgbaUnormSrgb:
                out = wgpu::TextureFormat::BC3RGBAUnormSrgb;
                return true;
            case interop::GPUTextureFormat::kBc4RUnorm:
                out = wgpu::TextureFormat::BC4RUnorm;
                return true;
            case interop::GPUTextureFormat::kBc4RSnorm:
                out = wgpu::TextureFormat::BC4RSnorm;
                return true;
            case interop::GPUTextureFormat::kBc5RgUnorm:
                out = wgpu::TextureFormat::BC5RGUnorm;
                return true;
            case interop::GPUTextureFormat::kBc5RgSnorm:
                out = wgpu::TextureFormat::BC5RGSnorm;
                return true;
            case interop::GPUTextureFormat::kBc6HRgbUfloat:
                out = wgpu::TextureFormat::BC6HRGBUfloat;
                return true;
            case interop::GPUTextureFormat::kBc6HRgbFloat:
                out = wgpu::TextureFormat::BC6HRGBFloat;
                return true;
            case interop::GPUTextureFormat::kBc7RgbaUnorm:
                out = wgpu::TextureFormat::BC7RGBAUnorm;
                return true;
            case interop::GPUTextureFormat::kBc7RgbaUnormSrgb:
                out = wgpu::TextureFormat::BC7RGBAUnormSrgb;
                return true;
            case interop::GPUTextureFormat::kDepth24UnormStencil8:
                break;  // TODO(crbug.com/dawn/1130): Unsupported.
            case interop::GPUTextureFormat::kDepth32FloatStencil8:
                break;  // TODO(crbug.com/dawn/1130): Unsupported.
        }
        // TODO(crbug.com/dawn/1130): Add ASTC and ETC formats.
        Napi::Error::New(env, "invalid value for GPUTextureFormat").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::TextureUsage& out, const interop::GPUTextureUsageFlags& in) {
        out = static_cast<wgpu::TextureUsage>(in);
        return true;
    }

    bool Converter::Convert(wgpu::ColorWriteMask& out, const interop::GPUColorWriteFlags& in) {
        out = static_cast<wgpu::ColorWriteMask>(in);
        return true;
    }

    bool Converter::Convert(wgpu::BufferUsage& out, const interop::GPUBufferUsageFlags& in) {
        out = static_cast<wgpu::BufferUsage>(in);
        return true;
    }

    bool Converter::Convert(wgpu::MapMode& out, const interop::GPUMapModeFlags& in) {
        out = static_cast<wgpu::MapMode>(in);
        return true;
    }

    bool Converter::Convert(wgpu::ShaderStage& out, const interop::GPUShaderStageFlags& in) {
        out = static_cast<wgpu::ShaderStage>(in);
        return true;
    }

    bool Converter::Convert(wgpu::TextureDimension& out, const interop::GPUTextureDimension& in) {
        out = wgpu::TextureDimension::e1D;
        switch (in) {
            case interop::GPUTextureDimension::k1D:
                out = wgpu::TextureDimension::e1D;
                return true;
            case interop::GPUTextureDimension::k2D:
                out = wgpu::TextureDimension::e2D;
                return true;
            case interop::GPUTextureDimension::k3D:
                out = wgpu::TextureDimension::e3D;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUTextureDimension").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::TextureViewDimension& out,
                            const interop::GPUTextureViewDimension& in) {
        out = wgpu::TextureViewDimension::Undefined;
        switch (in) {
            case interop::GPUTextureViewDimension::k1D:
                out = wgpu::TextureViewDimension::e1D;
                return true;
            case interop::GPUTextureViewDimension::k2D:
                out = wgpu::TextureViewDimension::e2D;
                return true;
            case interop::GPUTextureViewDimension::k2DArray:
                out = wgpu::TextureViewDimension::e2DArray;
                return true;
            case interop::GPUTextureViewDimension::kCube:
                out = wgpu::TextureViewDimension::Cube;
                return true;
            case interop::GPUTextureViewDimension::kCubeArray:
                out = wgpu::TextureViewDimension::CubeArray;
                return true;
            case interop::GPUTextureViewDimension::k3D:
                out = wgpu::TextureViewDimension::e3D;
                return true;
            default:
                break;
        }
        Napi::Error::New(env, "invalid value for GPUTextureViewDimension")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::ProgrammableStageDescriptor& out,
                            const interop::GPUProgrammableStage& in) {
        out = {};
        out.entryPoint = in.entryPoint.c_str();
        out.module = *in.module.As<GPUShaderModule>();
        return Convert(out.constants, out.constantCount, in.constants);
    }

    bool Converter::Convert(wgpu::ConstantEntry& out,
                            const std::string& in_name,
                            wgpu::interop::GPUPipelineConstantValue in_value) {
        out.key = in_name.c_str();
        out.value = in_value;
        return true;
    }

    bool Converter::Convert(wgpu::BlendComponent& out, const interop::GPUBlendComponent& in) {
        out = {};
        return Convert(out.operation, in.operation) && Convert(out.dstFactor, in.dstFactor) &&
               Convert(out.srcFactor, in.srcFactor);
    }

    bool Converter::Convert(wgpu::BlendFactor& out, const interop::GPUBlendFactor& in) {
        out = wgpu::BlendFactor::Zero;
        switch (in) {
            case interop::GPUBlendFactor::kZero:
                out = wgpu::BlendFactor::Zero;
                return true;
            case interop::GPUBlendFactor::kOne:
                out = wgpu::BlendFactor::One;
                return true;
            case interop::GPUBlendFactor::kSrc:
                out = wgpu::BlendFactor::Src;
                return true;
            case interop::GPUBlendFactor::kOneMinusSrc:
                out = wgpu::BlendFactor::OneMinusSrc;
                return true;
            case interop::GPUBlendFactor::kSrcAlpha:
                out = wgpu::BlendFactor::SrcAlpha;
                return true;
            case interop::GPUBlendFactor::kOneMinusSrcAlpha:
                out = wgpu::BlendFactor::OneMinusSrcAlpha;
                return true;
            case interop::GPUBlendFactor::kDst:
                out = wgpu::BlendFactor::Dst;
                return true;
            case interop::GPUBlendFactor::kOneMinusDst:
                out = wgpu::BlendFactor::OneMinusDst;
                return true;
            case interop::GPUBlendFactor::kDstAlpha:
                out = wgpu::BlendFactor::DstAlpha;
                return true;
            case interop::GPUBlendFactor::kOneMinusDstAlpha:
                out = wgpu::BlendFactor::OneMinusDstAlpha;
                return true;
            case interop::GPUBlendFactor::kSrcAlphaSaturated:
                out = wgpu::BlendFactor::SrcAlphaSaturated;
                return true;
            case interop::GPUBlendFactor::kConstant:
                out = wgpu::BlendFactor::Constant;
                return true;
            case interop::GPUBlendFactor::kOneMinusConstant:
                out = wgpu::BlendFactor::OneMinusConstant;
                return true;
            default:
                break;
        }
        Napi::Error::New(env, "invalid value for GPUBlendFactor").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::BlendOperation& out, const interop::GPUBlendOperation& in) {
        out = wgpu::BlendOperation::Add;
        switch (in) {
            case interop::GPUBlendOperation::kAdd:
                out = wgpu::BlendOperation::Add;
                return true;
            case interop::GPUBlendOperation::kSubtract:
                out = wgpu::BlendOperation::Subtract;
                return true;
            case interop::GPUBlendOperation::kReverseSubtract:
                out = wgpu::BlendOperation::ReverseSubtract;
                return true;
            case interop::GPUBlendOperation::kMin:
                out = wgpu::BlendOperation::Min;
                return true;
            case interop::GPUBlendOperation::kMax:
                out = wgpu::BlendOperation::Max;
                return true;
            default:
                break;
        }
        Napi::Error::New(env, "invalid value for GPUBlendOperation").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::BlendState& out, const interop::GPUBlendState& in) {
        out = {};
        return Convert(out.alpha, in.alpha) && Convert(out.color, in.color);
    }

    bool Converter::Convert(wgpu::PrimitiveState& out, const interop::GPUPrimitiveState& in) {
        out = {};
        return Convert(out.topology, in.topology) &&
               Convert(out.stripIndexFormat, in.stripIndexFormat) &&
               Convert(out.frontFace, in.frontFace) && Convert(out.cullMode, in.cullMode);
    }

    bool Converter::Convert(wgpu::ColorTargetState& out, const interop::GPUColorTargetState& in) {
        out = {};
        return Convert(out.format, in.format) && Convert(out.blend, in.blend) &&
               Convert(out.writeMask, in.writeMask);
    }

    bool Converter::Convert(wgpu::DepthStencilState& out, const interop::GPUDepthStencilState& in) {
        out = {};
        return Convert(out.format, in.format) &&
               Convert(out.depthWriteEnabled, in.depthWriteEnabled) &&
               Convert(out.depthCompare, in.depthCompare) &&
               Convert(out.stencilFront, in.stencilFront) &&
               Convert(out.stencilBack, in.stencilBack) &&
               Convert(out.stencilReadMask, in.stencilReadMask) &&
               Convert(out.stencilWriteMask, in.stencilWriteMask) &&
               Convert(out.depthBias, in.depthBias) &&
               Convert(out.depthBiasSlopeScale, in.depthBiasSlopeScale) &&
               Convert(out.depthBiasClamp, in.depthBiasClamp);
    }

    bool Converter::Convert(wgpu::MultisampleState& out, const interop::GPUMultisampleState& in) {
        out = {};
        return Convert(out.count, in.count) && Convert(out.mask, in.mask) &&
               Convert(out.alphaToCoverageEnabled, in.alphaToCoverageEnabled);
    }

    bool Converter::Convert(wgpu::FragmentState& out, const interop::GPUFragmentState& in) {
        out = {};
        return Convert(out.targets, out.targetCount, in.targets) &&  //
               Convert(out.module, in.module) &&                     //
               Convert(out.entryPoint, in.entryPoint) &&             //
               Convert(out.constants, out.constantCount, in.constants);
    }

    bool Converter::Convert(wgpu::PrimitiveTopology& out, const interop::GPUPrimitiveTopology& in) {
        out = wgpu::PrimitiveTopology::LineList;
        switch (in) {
            case interop::GPUPrimitiveTopology::kPointList:
                out = wgpu::PrimitiveTopology::PointList;
                return true;
            case interop::GPUPrimitiveTopology::kLineList:
                out = wgpu::PrimitiveTopology::LineList;
                return true;
            case interop::GPUPrimitiveTopology::kLineStrip:
                out = wgpu::PrimitiveTopology::LineStrip;
                return true;
            case interop::GPUPrimitiveTopology::kTriangleList:
                out = wgpu::PrimitiveTopology::TriangleList;
                return true;
            case interop::GPUPrimitiveTopology::kTriangleStrip:
                out = wgpu::PrimitiveTopology::TriangleStrip;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUPrimitiveTopology")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::FrontFace& out, const interop::GPUFrontFace& in) {
        out = wgpu::FrontFace::CW;
        switch (in) {
            case interop::GPUFrontFace::kCw:
                out = wgpu::FrontFace::CW;
                return true;
            case interop::GPUFrontFace::kCcw:
                out = wgpu::FrontFace::CCW;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUFrontFace").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::CullMode& out, const interop::GPUCullMode& in) {
        out = wgpu::CullMode::None;
        switch (in) {
            case interop::GPUCullMode::kNone:
                out = wgpu::CullMode::None;
                return true;
            case interop::GPUCullMode::kFront:
                out = wgpu::CullMode::Front;
                return true;
            case interop::GPUCullMode::kBack:
                out = wgpu::CullMode::Back;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUCullMode").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::CompareFunction& out, const interop::GPUCompareFunction& in) {
        out = wgpu::CompareFunction::Undefined;
        switch (in) {
            case interop::GPUCompareFunction::kNever:
                out = wgpu::CompareFunction::Never;
                return true;
            case interop::GPUCompareFunction::kLess:
                out = wgpu::CompareFunction::Less;
                return true;
            case interop::GPUCompareFunction::kLessEqual:
                out = wgpu::CompareFunction::LessEqual;
                return true;
            case interop::GPUCompareFunction::kGreater:
                out = wgpu::CompareFunction::Greater;
                return true;
            case interop::GPUCompareFunction::kGreaterEqual:
                out = wgpu::CompareFunction::GreaterEqual;
                return true;
            case interop::GPUCompareFunction::kEqual:
                out = wgpu::CompareFunction::Equal;
                return true;
            case interop::GPUCompareFunction::kNotEqual:
                out = wgpu::CompareFunction::NotEqual;
                return true;
            case interop::GPUCompareFunction::kAlways:
                out = wgpu::CompareFunction::Always;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUCompareFunction").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::IndexFormat& out, const interop::GPUIndexFormat& in) {
        out = wgpu::IndexFormat::Undefined;
        switch (in) {
            case interop::GPUIndexFormat::kUint16:
                out = wgpu::IndexFormat::Uint16;
                return true;
            case interop::GPUIndexFormat::kUint32:
                out = wgpu::IndexFormat::Uint32;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUIndexFormat").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::StencilOperation& out, const interop::GPUStencilOperation& in) {
        out = wgpu::StencilOperation::Zero;
        switch (in) {
            case interop::GPUStencilOperation::kKeep:
                out = wgpu::StencilOperation::Keep;
                return true;
            case interop::GPUStencilOperation::kZero:
                out = wgpu::StencilOperation::Zero;
                return true;
            case interop::GPUStencilOperation::kReplace:
                out = wgpu::StencilOperation::Replace;
                return true;
            case interop::GPUStencilOperation::kInvert:
                out = wgpu::StencilOperation::Invert;
                return true;
            case interop::GPUStencilOperation::kIncrementClamp:
                out = wgpu::StencilOperation::IncrementClamp;
                return true;
            case interop::GPUStencilOperation::kDecrementClamp:
                out = wgpu::StencilOperation::DecrementClamp;
                return true;
            case interop::GPUStencilOperation::kIncrementWrap:
                out = wgpu::StencilOperation::IncrementWrap;
                return true;
            case interop::GPUStencilOperation::kDecrementWrap:
                out = wgpu::StencilOperation::DecrementWrap;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUStencilOperation").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::StencilFaceState& out, const interop::GPUStencilFaceState& in) {
        return Convert(out.compare, in.compare) && Convert(out.failOp, in.failOp) &&
               Convert(out.depthFailOp, in.depthFailOp) && Convert(out.passOp, in.passOp);
    }

    bool Converter::Convert(wgpu::VertexBufferLayout& out,
                            const interop::GPUVertexBufferLayout& in) {
        out = {};
        return Convert(out.attributes, out.attributeCount, in.attributes) &&
               Convert(out.arrayStride, in.arrayStride) && Convert(out.stepMode, in.stepMode);
    }

    bool Converter::Convert(wgpu::VertexState& out, const interop::GPUVertexState& in) {
        out = {};
        return Convert(out.module, in.module) &&
               Convert(out.buffers, out.bufferCount, in.buffers) &&
               Convert(out.entryPoint, in.entryPoint) &&
               Convert(out.constants, out.constantCount, in.constants);
    }

    bool Converter::Convert(wgpu::VertexStepMode& out, const interop::GPUVertexStepMode& in) {
        out = wgpu::VertexStepMode::Instance;
        switch (in) {
            case interop::GPUVertexStepMode::kInstance:
                out = wgpu::VertexStepMode::Instance;
                return true;
            case interop::GPUVertexStepMode::kVertex:
                out = wgpu::VertexStepMode::Vertex;
                return true;
            default:
                break;
        }
        Napi::Error::New(env, "invalid value for GPUVertexStepMode").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::VertexAttribute& out, const interop::GPUVertexAttribute& in) {
        return Convert(out.format, in.format) && Convert(out.offset, in.offset) &&
               Convert(out.shaderLocation, in.shaderLocation);
    }

    bool Converter::Convert(wgpu::VertexFormat& out, const interop::GPUVertexFormat& in) {
        out = wgpu::VertexFormat::Undefined;
        switch (in) {
            case interop::GPUVertexFormat::kUint8X2:
                out = wgpu::VertexFormat::Uint8x2;
                return true;
            case interop::GPUVertexFormat::kUint8X4:
                out = wgpu::VertexFormat::Uint8x4;
                return true;
            case interop::GPUVertexFormat::kSint8X2:
                out = wgpu::VertexFormat::Sint8x2;
                return true;
            case interop::GPUVertexFormat::kSint8X4:
                out = wgpu::VertexFormat::Sint8x4;
                return true;
            case interop::GPUVertexFormat::kUnorm8X2:
                out = wgpu::VertexFormat::Unorm8x2;
                return true;
            case interop::GPUVertexFormat::kUnorm8X4:
                out = wgpu::VertexFormat::Unorm8x4;
                return true;
            case interop::GPUVertexFormat::kSnorm8X2:
                out = wgpu::VertexFormat::Snorm8x2;
                return true;
            case interop::GPUVertexFormat::kSnorm8X4:
                out = wgpu::VertexFormat::Snorm8x4;
                return true;
            case interop::GPUVertexFormat::kUint16X2:
                out = wgpu::VertexFormat::Uint16x2;
                return true;
            case interop::GPUVertexFormat::kUint16X4:
                out = wgpu::VertexFormat::Uint16x4;
                return true;
            case interop::GPUVertexFormat::kSint16X2:
                out = wgpu::VertexFormat::Sint16x2;
                return true;
            case interop::GPUVertexFormat::kSint16X4:
                out = wgpu::VertexFormat::Sint16x4;
                return true;
            case interop::GPUVertexFormat::kUnorm16X2:
                out = wgpu::VertexFormat::Unorm16x2;
                return true;
            case interop::GPUVertexFormat::kUnorm16X4:
                out = wgpu::VertexFormat::Unorm16x4;
                return true;
            case interop::GPUVertexFormat::kSnorm16X2:
                out = wgpu::VertexFormat::Snorm16x2;
                return true;
            case interop::GPUVertexFormat::kSnorm16X4:
                out = wgpu::VertexFormat::Snorm16x4;
                return true;
            case interop::GPUVertexFormat::kFloat16X2:
                out = wgpu::VertexFormat::Float16x2;
                return true;
            case interop::GPUVertexFormat::kFloat16X4:
                out = wgpu::VertexFormat::Float16x4;
                return true;
            case interop::GPUVertexFormat::kFloat32:
                out = wgpu::VertexFormat::Float32;
                return true;
            case interop::GPUVertexFormat::kFloat32X2:
                out = wgpu::VertexFormat::Float32x2;
                return true;
            case interop::GPUVertexFormat::kFloat32X3:
                out = wgpu::VertexFormat::Float32x3;
                return true;
            case interop::GPUVertexFormat::kFloat32X4:
                out = wgpu::VertexFormat::Float32x4;
                return true;
            case interop::GPUVertexFormat::kUint32:
                out = wgpu::VertexFormat::Uint32;
                return true;
            case interop::GPUVertexFormat::kUint32X2:
                out = wgpu::VertexFormat::Uint32x2;
                return true;
            case interop::GPUVertexFormat::kUint32X3:
                out = wgpu::VertexFormat::Uint32x3;
                return true;
            case interop::GPUVertexFormat::kUint32X4:
                out = wgpu::VertexFormat::Uint32x4;
                return true;
            case interop::GPUVertexFormat::kSint32:
                out = wgpu::VertexFormat::Sint32;
                return true;
            case interop::GPUVertexFormat::kSint32X2:
                out = wgpu::VertexFormat::Sint32x2;
                return true;
            case interop::GPUVertexFormat::kSint32X3:
                out = wgpu::VertexFormat::Sint32x3;
                return true;
            case interop::GPUVertexFormat::kSint32X4:
                out = wgpu::VertexFormat::Sint32x4;
                return true;
            default:
                break;
        }
        Napi::Error::New(env, "invalid value for GPUVertexFormat").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::RenderPassColorAttachment& out,
                            const interop::GPURenderPassColorAttachment& in) {
        out = {};
        if (auto* op = std::get_if<interop::GPULoadOp>(&in.loadValue)) {
            if (!Convert(out.loadOp, *op)) {
                return false;
            }
        } else if (auto* color = std::get_if<interop::GPUColor>(&in.loadValue)) {
            out.loadOp = wgpu::LoadOp::Clear;
            if (!Convert(out.clearColor, *color)) {
                return false;
            }
        } else {
            Napi::Error::New(env, "invalid value for GPURenderPassColorAttachment.loadValue")
                .ThrowAsJavaScriptException();
            return false;
        }

        return Convert(out.view, in.view) && Convert(out.resolveTarget, in.resolveTarget) &&
               Convert(out.storeOp, in.storeOp);
    }

    bool Converter::Convert(wgpu::RenderPassDepthStencilAttachment& out,
                            const interop::GPURenderPassDepthStencilAttachment& in) {
        out = {};
        if (auto* op = std::get_if<interop::GPULoadOp>(&in.depthLoadValue)) {
            if (!Convert(out.depthLoadOp, *op)) {
                return false;
            }
        } else if (auto* value = std::get_if<float>(&in.depthLoadValue)) {
            out.stencilLoadOp = wgpu::LoadOp::Clear;
            if (!Convert(out.clearDepth, *value)) {
                return false;
            }
        } else {
            Napi::Error::New(env,
                             "invalid value for GPURenderPassDepthStencilAttachment.depthLoadValue")
                .ThrowAsJavaScriptException();
            return false;
        }

        if (auto* op = std::get_if<interop::GPULoadOp>(&in.stencilLoadValue)) {
            if (!Convert(out.stencilLoadOp, *op)) {
                return false;
            }
        } else if (auto* value = std::get_if<interop::GPUStencilValue>(&in.stencilLoadValue)) {
            if (!Convert(out.clearStencil, *value)) {
                return false;
            }
        } else {
            Napi::Error::New(env,
                             "invalid value for "
                             "GPURenderPassDepthStencilAttachment.stencilLoadValue")
                .ThrowAsJavaScriptException();
            return false;
        }

        return Convert(out.view, in.view) && Convert(out.depthStoreOp, in.depthStoreOp) &&
               Convert(out.depthReadOnly, in.depthReadOnly) &&
               Convert(out.stencilStoreOp, in.stencilStoreOp) &&
               Convert(out.stencilReadOnly, in.stencilReadOnly);
    }

    bool Converter::Convert(wgpu::LoadOp& out, const interop::GPULoadOp& in) {
        out = wgpu::LoadOp::Clear;
        switch (in) {
            case interop::GPULoadOp::kLoad:
                out = wgpu::LoadOp::Load;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPULoadOp").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::StoreOp& out, const interop::GPUStoreOp& in) {
        out = wgpu::StoreOp::Store;
        switch (in) {
            case interop::GPUStoreOp::kStore:
                out = wgpu::StoreOp::Store;
                return true;
            case interop::GPUStoreOp::kDiscard:
                out = wgpu::StoreOp::Discard;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUStoreOp").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::BindGroupEntry& out, const interop::GPUBindGroupEntry& in) {
        out = {};
        if (!Convert(out.binding, in.binding)) {
            return false;
        }

        if (auto* res = std::get_if<interop::Interface<interop::GPUSampler>>(&in.resource)) {
            return Convert(out.sampler, *res);
        }
        if (auto* res = std::get_if<interop::Interface<interop::GPUTextureView>>(&in.resource)) {
            return Convert(out.textureView, *res);
        }
        if (auto* res = std::get_if<interop::GPUBufferBinding>(&in.resource)) {
            auto buffer = res->buffer.As<GPUBuffer>();
            out.size = wgpu::kWholeSize;
            if (!buffer || !Convert(out.offset, res->offset) || !Convert(out.size, res->size)) {
                return false;
            }
            out.buffer = *buffer;
            return true;
        }
        if (auto* res =
                std::get_if<interop::Interface<interop::GPUExternalTexture>>(&in.resource)) {
            // TODO(crbug.com/dawn/1129): External textures
            UNIMPLEMENTED();
        }
        Napi::Error::New(env, "invalid value for GPUBindGroupEntry.resource")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::BindGroupLayoutEntry& out,
                            const interop::GPUBindGroupLayoutEntry& in) {
        // TODO(crbug.com/dawn/1129): External textures
        return Convert(out.binding, in.binding) && Convert(out.visibility, in.visibility) &&
               Convert(out.buffer, in.buffer) && Convert(out.sampler, in.sampler) &&
               Convert(out.texture, in.texture) && Convert(out.storageTexture, in.storageTexture);
    }

    bool Converter::Convert(wgpu::BufferBindingLayout& out,
                            const interop::GPUBufferBindingLayout& in) {
        return Convert(out.type, in.type) && Convert(out.hasDynamicOffset, in.hasDynamicOffset) &&
               Convert(out.minBindingSize, in.minBindingSize);
    }

    bool Converter::Convert(wgpu::SamplerBindingLayout& out,
                            const interop::GPUSamplerBindingLayout& in) {
        return Convert(out.type, in.type);
    }

    bool Converter::Convert(wgpu::TextureBindingLayout& out,
                            const interop::GPUTextureBindingLayout& in) {
        return Convert(out.sampleType, in.sampleType) &&
               Convert(out.viewDimension, in.viewDimension) &&
               Convert(out.multisampled, in.multisampled);
    }

    bool Converter::Convert(wgpu::StorageTextureBindingLayout& out,
                            const interop::GPUStorageTextureBindingLayout& in) {
        return Convert(out.access, in.access) && Convert(out.format, in.format) &&
               Convert(out.viewDimension, in.viewDimension);
    }

    bool Converter::Convert(wgpu::BufferBindingType& out, const interop::GPUBufferBindingType& in) {
        out = wgpu::BufferBindingType::Undefined;
        switch (in) {
            case interop::GPUBufferBindingType::kUniform:
                out = wgpu::BufferBindingType::Uniform;
                return true;
            case interop::GPUBufferBindingType::kStorage:
                out = wgpu::BufferBindingType::Storage;
                return true;
            case interop::GPUBufferBindingType::kReadOnlyStorage:
                out = wgpu::BufferBindingType::ReadOnlyStorage;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUBufferBindingType")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::TextureSampleType& out, const interop::GPUTextureSampleType& in) {
        out = wgpu::TextureSampleType::Undefined;
        switch (in) {
            case interop::GPUTextureSampleType::kFloat:
                out = wgpu::TextureSampleType::Float;
                return true;
            case interop::GPUTextureSampleType::kUnfilterableFloat:
                out = wgpu::TextureSampleType::UnfilterableFloat;
                return true;
            case interop::GPUTextureSampleType::kDepth:
                out = wgpu::TextureSampleType::Depth;
                return true;
            case interop::GPUTextureSampleType::kSint:
                out = wgpu::TextureSampleType::Sint;
                return true;
            case interop::GPUTextureSampleType::kUint:
                out = wgpu::TextureSampleType::Uint;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUTextureSampleType")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::SamplerBindingType& out,
                            const interop::GPUSamplerBindingType& in) {
        out = wgpu::SamplerBindingType::Undefined;
        switch (in) {
            case interop::GPUSamplerBindingType::kFiltering:
                out = wgpu::SamplerBindingType::Filtering;
                return true;
            case interop::GPUSamplerBindingType::kNonFiltering:
                out = wgpu::SamplerBindingType::NonFiltering;
                return true;
            case interop::GPUSamplerBindingType::kComparison:
                out = wgpu::SamplerBindingType::Comparison;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUSamplerBindingType")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::StorageTextureAccess& out,
                            const interop::GPUStorageTextureAccess& in) {
        out = wgpu::StorageTextureAccess::Undefined;
        switch (in) {
            case interop::GPUStorageTextureAccess::kWriteOnly:
                out = wgpu::StorageTextureAccess::WriteOnly;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUStorageTextureAccess")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::QueryType& out, const interop::GPUQueryType& in) {
        out = wgpu::QueryType::Occlusion;
        switch (in) {
            case interop::GPUQueryType::kOcclusion:
                out = wgpu::QueryType::Occlusion;
                return true;
            case interop::GPUQueryType::kPipelineStatistics:
                out = wgpu::QueryType::PipelineStatistics;
                return true;
            case interop::GPUQueryType::kTimestamp:
                out = wgpu::QueryType::Timestamp;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUQueryType").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::PipelineStatisticName& out,
                            const interop::GPUPipelineStatisticName& in) {
        out = wgpu::PipelineStatisticName::VertexShaderInvocations;
        switch (in) {
            case interop::GPUPipelineStatisticName::kVertexShaderInvocations:
                out = wgpu::PipelineStatisticName::VertexShaderInvocations;
                return true;
            case interop::GPUPipelineStatisticName::kClipperInvocations:
                out = wgpu::PipelineStatisticName::ClipperInvocations;
                return true;
            case interop::GPUPipelineStatisticName::kClipperPrimitivesOut:
                out = wgpu::PipelineStatisticName::ClipperPrimitivesOut;
                return true;
            case interop::GPUPipelineStatisticName::kFragmentShaderInvocations:
                out = wgpu::PipelineStatisticName::FragmentShaderInvocations;
                return true;
            case interop::GPUPipelineStatisticName::kComputeShaderInvocations:
                out = wgpu::PipelineStatisticName::ComputeShaderInvocations;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUPipelineStatisticName")
            .ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::AddressMode& out, const interop::GPUAddressMode& in) {
        out = wgpu::AddressMode::Repeat;
        switch (in) {
            case interop::GPUAddressMode::kClampToEdge:
                out = wgpu::AddressMode::ClampToEdge;
                return true;
            case interop::GPUAddressMode::kRepeat:
                out = wgpu::AddressMode::Repeat;
                return true;
            case interop::GPUAddressMode::kMirrorRepeat:
                out = wgpu::AddressMode::MirrorRepeat;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUAddressMode").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::FilterMode& out, const interop::GPUFilterMode& in) {
        out = wgpu::FilterMode::Nearest;
        switch (in) {
            case interop::GPUFilterMode::kNearest:
                out = wgpu::FilterMode::Nearest;
                return true;
            case interop::GPUFilterMode::kLinear:
                out = wgpu::FilterMode::Linear;
                return true;
        }
        Napi::Error::New(env, "invalid value for GPUFilterMode").ThrowAsJavaScriptException();
        return false;
    }

    bool Converter::Convert(wgpu::ComputePipelineDescriptor& out,
                            const interop::GPUComputePipelineDescriptor& in) {
        return Convert(out.label, in.label) &&    //
               Convert(out.layout, in.layout) &&  //
               Convert(out.compute, in.compute);
    }

    bool Converter::Convert(wgpu::RenderPipelineDescriptor& out,
                            const interop::GPURenderPipelineDescriptor& in) {
        wgpu::RenderPipelineDescriptor desc{};
        return Convert(out.label, in.label) &&                //
               Convert(out.layout, in.layout) &&              //
               Convert(out.vertex, in.vertex) &&              //
               Convert(out.primitive, in.primitive) &&        //
               Convert(out.depthStencil, in.depthStencil) &&  //
               Convert(out.multisample, in.multisample) &&    //
               Convert(out.fragment, in.fragment);
    }

}  // namespace wgpu::binding
