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