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

// This test evaluates the speed of using the same textures to draw repeatedly.
// It uploads a series of textures initially.  On subsequent iterations, it uses
// those uploaded textures to draw.

#include "base/logging.h"

#include "glbench/main.h"
#include "glbench/texturetest.h"

namespace glbench {

class TextureReuseTest : public TextureTest {
 public:
  TextureReuseTest() {}
  virtual ~TextureReuseTest() {}
  virtual bool TestFunc(uint64_t iterations);
  virtual const char* Name() const { return "texture_reuse"; }
  virtual bool IsDrawTest() const { return true; }
};

bool TextureReuseTest::TestFunc(uint64_t iterations) {
  glGetError();

  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  glFlush();

  for (uint64_t i = 0; i < iterations; ++i) {
    glBindTexture(GL_TEXTURE_2D, textures_[i % kNumberOfTextures]);
    switch (flavor_) {
      case TEX_IMAGE:
        glTexImage2D(GL_TEXTURE_2D, 0, texel_gl_format_, width_, height_,
                     0, texel_gl_format_, GL_UNSIGNED_BYTE,
                     pixels_[i % kNumberOfTextures].get());
        break;
      case TEX_SUBIMAGE:
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_,
                        texel_gl_format_, GL_UNSIGNED_BYTE,
                        pixels_[i % kNumberOfTextures].get());
        break;
    }

    // After having uploaded |kNumberOfTextures| textures, use each of them to
    // draw once before uploading new textures.
    if ((i % kNumberOfTextures) == (kNumberOfTextures - 1)) {
      for (int j = 0; j < kNumberOfTextures; ++j) {
        glBindTexture(GL_TEXTURE_2D, textures_[j]);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
      }
    }
  }

  return true;
}

TestBase* GetTextureReuseTest() {
  return new TextureReuseTest;
}

}  // namespace glbench
