//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// DeviceCGL.cpp: CGL implementation of egl::Device

#include "common/platform.h"

#ifdef ANGLE_PLATFORM_MACOS

#    include "libANGLE/renderer/gl/cgl/DeviceCGL.h"

#    include <EGL/eglext.h>
#    include "libANGLE/renderer/gl/cgl/DisplayCGL.h"

namespace rx
{

DeviceCGL::DeviceCGL() {}

DeviceCGL::~DeviceCGL() {}

egl::Error DeviceCGL::initialize()
{
    return egl::NoError();
}

egl::Error DeviceCGL::getAttribute(const egl::Display *display, EGLint attribute, void **outValue)
{
    DisplayCGL *displayImpl = GetImplAs<DisplayCGL>(display);

    switch (attribute)
    {
        case EGL_CGL_CONTEXT_ANGLE:
            *outValue = displayImpl->getCGLContext();
            break;
        case EGL_CGL_PIXEL_FORMAT_ANGLE:
            *outValue = displayImpl->getCGLPixelFormat();
            break;
        default:
            return egl::EglBadAttribute();
    }

    return egl::NoError();
}

EGLint DeviceCGL::getType()
{
    return 0;
}

void DeviceCGL::generateExtensions(egl::DeviceExtensions *outExtensions) const
{
    outExtensions->deviceCGL = true;
}

}  // namespace rx

#endif  // ANGLE_PLATFORM_MACOS
