// Copyright 2015 Google Inc. 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
