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


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