1// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This test evaluates the speed of using the same textures to draw repeatedly.
6// It uploads a series of textures initially.  On subsequent iterations, it uses
7// those uploaded textures to draw.
8
9#include "base/logging.h"
10
11#include "texturetest.h"
12#include "main.h"
13
14namespace glbench {
15
16class TextureReuseTest : public TextureTest {
17 public:
18  TextureReuseTest() {}
19  virtual ~TextureReuseTest() {}
20  virtual bool TestFunc(uint64_t iterations);
21  virtual const char* Name() const { return "texture_reuse"; }
22  virtual bool IsDrawTest() const { return true; }
23};
24
25bool TextureReuseTest::TestFunc(uint64_t iterations) {
26  glGetError();
27
28  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
29  glFlush();
30
31  for (uint64_t i = 0; i < iterations; ++i) {
32    glBindTexture(GL_TEXTURE_2D, textures_[i % kNumberOfTextures]);
33    switch (flavor_) {
34      case TEX_IMAGE:
35        glTexImage2D(GL_TEXTURE_2D, 0, texel_gl_format_, width_, height_,
36                     0, texel_gl_format_, GL_UNSIGNED_BYTE,
37                     pixels_[i % kNumberOfTextures].get());
38        break;
39      case TEX_SUBIMAGE:
40        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_,
41                        texel_gl_format_, GL_UNSIGNED_BYTE,
42                        pixels_[i % kNumberOfTextures].get());
43        break;
44    }
45
46    // After having uploaded |kNumberOfTextures| textures, use each of them to
47    // draw once before uploading new textures.
48    if ((i % kNumberOfTextures) == (kNumberOfTextures - 1)) {
49      for (int j = 0; j < kNumberOfTextures; ++j) {
50        glBindTexture(GL_TEXTURE_2D, textures_[j]);
51        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
52      }
53    }
54  }
55
56  return true;
57}
58
59TestBase* GetTextureReuseTest() {
60  return new TextureReuseTest;
61}
62
63} // namespace glbench
64