// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// 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 "cobalt/renderer/backend/egl/utils.h"

#include <EGL/egl.h>
#include <GLES2/gl2ext.h>

namespace cobalt {
namespace renderer {
namespace backend {

EGLContext CreateGLES3Context(EGLDisplay display, EGLConfig config,
                              EGLContext share_context) {
  // Create an OpenGL ES 3.0 context.
  EGLint context_attrib_list[] = {
      EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE,
  };
  EGLContext context =
      eglCreateContext(display, config, share_context, context_attrib_list);

  if (eglGetError() != EGL_SUCCESS) {
    // Some drivers, such as Mesa 3D on Linux, do support GL ES 3, and report
    // it as the version when queried (via glGetString(GL_VERSION)), however
    // for some reason they do not initialize correctly unless 2 is provided
    // as EGL_CONTEXT_CLIENT_VERSION.  Thus, this fallback code exists to
    // facilitate those platforms.
    EGLint context_attrib_list_gles2[] = {
        EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE,
    };
    context = eglCreateContext(display, config, share_context,
                               context_attrib_list_gles2);
    CHECK_EQ(EGL_SUCCESS, eglGetError());
  }

  return context;
}

int BytesPerPixelForGLFormat(GLenum format) {
  switch (format) {
    case GL_RGBA:
    case GL_BGRA_EXT:
      return 4;
    case GL_LUMINANCE_ALPHA:
      return 2;
    case GL_ALPHA:
      return 1;
    default:
      NOTREACHED() << "Unknown GL format.";
  }
  return 0;
}

}  // namespace backend
}  // namespace renderer
}  // namespace cobalt
