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

#ifndef UI_GL_GL_VERSION_INFO_H_
#define UI_GL_GL_VERSION_INFO_H_

#include <set>
#include <string>
#include "base/macros.h"
#include "build/build_config.h"
#include "ui/gfx/extension_set.h"
#include "ui/gl/gl_export.h"

namespace gl {

struct GL_EXPORT GLVersionInfo {
  GLVersionInfo(const char* version_str,
                const char* renderer_str,
                const gfx::ExtensionSet& exts);

  bool IsAtLeastGL(unsigned major, unsigned minor) const {
    return !is_es && (major_version > major ||
                      (major_version == major && minor_version >= minor));
  }

  bool IsLowerThanGL(unsigned major, unsigned minor) const {
    return !is_es && (major_version < major ||
                      (major_version == major && minor_version < minor));
  }

  bool IsAtLeastGLES(unsigned major, unsigned minor) const {
    return is_es && (major_version > major ||
                     (major_version == major && minor_version >= minor));
  }

  bool BehavesLikeGLES() const {
    return is_es || is_desktop_core_profile;
  }

  bool SupportsFixedType() const {
    return is_es || IsAtLeastGL(4, 1);
  }

  // We need to emulate GL_ALPHA and GL_LUMINANCE and GL_LUMINANCE_ALPHA
  // texture formats on core profile and ES3, except for ANGLE and Swiftshader.
  bool NeedsLuminanceAlphaEmulation() const {
    return !is_angle && !is_swiftshader && (is_es3 || is_desktop_core_profile);
  }

  bool is_es;
  bool is_angle;
  bool is_d3d;
  bool is_mesa;
  bool is_swiftshader;
  unsigned major_version;
  unsigned minor_version;
  bool is_es2;
  bool is_es3;
  bool is_desktop_core_profile;
  bool is_es3_capable;
  std::string driver_vendor;
  std::string driver_version;

  static void DisableES3ForTesting();

 private:
  void Initialize(const char* version_str,
                  const char* renderer_str,
                  const gfx::ExtensionSet& extensions);
  void ParseVersionString(const char* version_str);
  bool IsES3Capable(const gfx::ExtensionSet& extensions) const;

  DISALLOW_COPY_AND_ASSIGN(GLVersionInfo);
};

}  // namespace gl

#endif // UI_GL_GL_VERSION_INFO_H_
