// Copyright (c) 2010 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 "main.h"
#include "testbase.h"
#include "utils.h"

namespace glbench {

class ClearTest : public TestBase {
 public:
  ClearTest() : mask_(0) {}
  virtual ~ClearTest() {}
  virtual bool TestFunc(uint64_t iterations);
  virtual bool Run();
  virtual const char* Name() const { return "clear"; }
  virtual bool IsDrawTest() const { return true; }
  virtual const char* Unit() const { return "mpixels_sec"; }

 private:
  GLbitfield mask_;
  DISALLOW_COPY_AND_ASSIGN(ClearTest);
};

bool ClearTest::TestFunc(uint64_t iterations) {
  GLbitfield mask = mask_;
  glClear(mask);
  glFlush();  // Kick GPU as soon as possible
  for (uint64_t i = 0; i < iterations - 1; ++i) {
    glClear(mask);
  }
  return true;
}

bool ClearTest::Run() {
  mask_ = GL_COLOR_BUFFER_BIT;
  RunTest(this, "clear_color", g_width * g_height, g_width, g_height, true);

  mask_ = GL_DEPTH_BUFFER_BIT;
  RunTest(this, "clear_depth", g_width * g_height, g_width, g_height, true);

  mask_ = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
  RunTest(this, "clear_colordepth", g_width * g_height, g_width, g_height,
          true);

  mask_ = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
  RunTest(this, "clear_depthstencil", g_width * g_height, g_width, g_height,
          true);

  mask_ = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
  RunTest(this, "clear_colordepthstencil", g_width * g_height, g_width,
          g_height, true);
  return true;
}

TestBase* GetClearTest() {
  return new ClearTest;
}

}  // namespace glbench
