/*
 * Copyright (C) 2019 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. AND ITS CONTRIBUTORS ``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 ITS 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 "GPUUtils.h"

#if ENABLE(WEBGPU)

#import <Metal/Metal.h>

namespace WebCore {

PlatformTextureFormat platformTextureFormatForGPUTextureFormat(GPUTextureFormat format)
{
    switch (format) {
    case GPUTextureFormat::Rgba8unorm:
        return MTLPixelFormatRGBA8Unorm;
    case GPUTextureFormat::Rgba8uint:
        return MTLPixelFormatRGBA8Uint;
    case GPUTextureFormat::Bgra8unorm:
        return MTLPixelFormatBGRA8Unorm;
    case GPUTextureFormat::Depth32floatStencil8:
        return MTLPixelFormatDepth32Float_Stencil8;
    case GPUTextureFormat::Bgra8unormSRGB:
        return MTLPixelFormatBGRA8Unorm_sRGB;
    case GPUTextureFormat::Rgba16float:
        return MTLPixelFormatRGBA16Float;
    }

    ASSERT_NOT_REACHED();
}

PlatformCompareFunction platformCompareFunctionForGPUCompareFunction(GPUCompareFunction func)
{
    switch (func) {
    case GPUCompareFunction::Never:
        return MTLCompareFunctionNever;
    case GPUCompareFunction::Less:
        return MTLCompareFunctionLess;
    case GPUCompareFunction::Equal:
        return MTLCompareFunctionEqual;
    case GPUCompareFunction::LessEqual:
        return MTLCompareFunctionLessEqual;
    case GPUCompareFunction::Greater:
        return MTLCompareFunctionGreater;
    case GPUCompareFunction::NotEqual:
        return MTLCompareFunctionNotEqual;
    case GPUCompareFunction::GreaterEqual:
        return MTLCompareFunctionGreaterEqual;
    case GPUCompareFunction::Always:
        return MTLCompareFunctionAlways;
    }

    ASSERT_NOT_REACHED();
}

} // namespace WebCore

#endif // ENABLE(WEBGPU)
