// Copyright (c) 2013 The Chromium OS 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 "base/bind.h"
#include "base/callback.h"

#include "glinterface.h"
#include "glinterfacetest.h"
#include "main.h"

namespace glbench {

namespace {

bool IsEven(int value) {
  return ((value % 2) == 0);
}

}  // namespace

class ContextTest : public GLInterfaceTest {
 public:
  ContextTest() {}
  virtual ~ContextTest() {}
  virtual bool TestFunc(uint64_t iterations);
  virtual const char* Name() const { return "context"; }

 private:
  DISALLOW_COPY_AND_ASSIGN(ContextTest);
};

bool ContextTest::TestFunc(uint64_t iterations) {
  GLInterface* interface = g_main_gl_interface.get();
  CHECK(interface);
  GLContext main_context = interface->GetMainContext();
  GLContext new_context = interface->CreateContext();
  CHECK(main_context);
  CHECK(new_context);

  // re-bind VBO on new context
  interface->MakeCurrent(new_context);
  SetupGLRendering();
  interface->MakeCurrent(main_context);

  for (uint64_t i = 0 ; i < iterations; ++i) {
    if (!render_func_.is_null())
      render_func_.Run();
    interface->MakeCurrent(IsEven(i) ? new_context : main_context);
  }

  interface->MakeCurrent(main_context);
  interface->DeleteContext(new_context);
  return true;
}

TestBase* GetContextTest() {
  return new ContextTest;
}

} // namespace glbench