// 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.

#include "ui/gl/gl_implementation_osmesa.h"

#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/native_library.h"
#include "base/path_service.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_osmesa_api_implementation.h"

namespace gfx {

#if defined(OS_LINUX)
// On Linux, we always use the OSMesa implementation of GL so we hardcode these
// functions here.

void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
  impls->push_back(kGLImplementationOSMesaGL);
}
bool InitializeDynamicGLBindings(GLImplementation implementation,
                                 GLContext* context) {
  DCHECK_EQ(implementation, kGLImplementationOSMesaGL);
  InitializeDynamicGLBindingsGL(context);
  return true;
}

bool InitializeStaticGLBindings(GLImplementation implementation) {
  DCHECK_EQ(implementation, kGLImplementationOSMesaGL);

  return InitializeStaticGLBindingsOSMesaGL();
}

void InitializeDebugGLBindings() {
  InitializeDebugGLBindingsOSMESA();
}

void ClearGLBindings() {
  ClearGLBindingsOSMESA();
  SetGLImplementation(kGLImplementationNone);
  UnloadGLNativeLibraries();
}
#endif

base::NativeLibrary LoadLibraryAndPrintError(const base::FilePath& filename) {
  base::NativeLibraryLoadError error;
  base::NativeLibrary library = base::LoadNativeLibrary(filename, &error);
  if (!library) {
    LOG(ERROR) << "Failed to load " << filename.MaybeAsASCII() << ": "
               << error.ToString();
    return NULL;
  }
  return library;
}

base::NativeLibrary LoadLibraryAndPrintError(const char* filename) {
  return LoadLibraryAndPrintError(base::FilePath(filename));
}

bool InitializeStaticGLBindingsOSMesaGL() {
  base::FilePath module_path;
  if (!PathService::Get(base::DIR_MODULE, &module_path)) {
    LOG(ERROR) << "PathService::Get failed.";
    return false;
  }

  base::FilePath library_path = module_path.Append("libosmesa.so");
  base::NativeLibrary library = LoadLibraryAndPrintError(library_path);
  if (!library)
    return false;

  GLGetProcAddressProc get_proc_address =
      reinterpret_cast<GLGetProcAddressProc>(
          base::GetFunctionPointerFromNativeLibrary(library,
                                                    "OSMesaGetProcAddress"));
  if (!get_proc_address) {
    LOG(ERROR) << "OSMesaGetProcAddress not found.";
    base::UnloadNativeLibrary(library);
    return false;
  }

  SetGLGetProcAddressProc(get_proc_address);
  AddGLNativeLibrary(library);
  SetGLImplementation(kGLImplementationOSMesaGL);

  InitializeStaticGLBindingsGL();
  InitializeStaticGLBindingsOSMESA();
  return true;
}

}  // namespace gfx
