• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2018 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 #include "arraysize.h"
6 #include "main.h"
7 #include "testbase.h"
8 #include "utils.h"
9 
10 namespace glbench {
11 
12 namespace {
13 
14 const int kNumberOfBuffers = 1;
15 
16 } // namespace
17 
18 class BufferUploadTest : public TestBase {
19  public:
BufferUploadTest()20   BufferUploadTest()
21       : target_(GL_ARRAY_BUFFER),
22         size_(0),
23         usage_(GL_DYNAMIC_DRAW)
24   {
25     memset(data_, 0, sizeof(data_));
26   }
~BufferUploadTest()27   virtual ~BufferUploadTest() {}
28   virtual bool TestFunc(uint64_t iterations);
29   virtual bool Run();
Name() const30   virtual const char* Name() const { return "buffer_upload"; }
IsDrawTest() const31   virtual bool IsDrawTest() const { return false; }
Unit() const32   virtual const char* Unit() const { return "mbytes_sec"; }
33 
34  private:
35   GLenum target_;
36   GLsizeiptr size_;
37   GLenum usage_;
38   GLbyte data_[256 * 1024];
39   GLuint buffers_[kNumberOfBuffers];
40   DISALLOW_COPY_AND_ASSIGN(BufferUploadTest);
41 };
42 
TestFunc(uint64_t iterations)43 bool BufferUploadTest::TestFunc(uint64_t iterations) {
44   for (uint64_t i = 0; i < iterations - 1; ++i) {
45     if (kNumberOfBuffers > 1) {
46       glBindBuffer(target_, buffers_[i % kNumberOfBuffers]);
47     }
48     glBufferData(target_, size_, data_, usage_);
49   }
50   return true;
51 }
52 
Run()53 bool BufferUploadTest::Run() {
54   const GLenum usages[] = {GL_DYNAMIC_DRAW, GL_STATIC_DRAW};
55   const char * usage_names[] = {"dynamic", "static"};
56   const GLenum targets[] = {GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER};
57   const char * target_names[] = {"array", "element_array"};
58   const int sizes[] = {8, 12, 16, 32, 64, 128, 192, 256, 512, 1024, 2048,
59                        4096, 8192, 16384, 32768, 65536, 131072};
60 
61   for (unsigned int uidx = 0; uidx < arraysize(usages); uidx++) {
62     usage_ = usages[uidx];
63 
64     for (unsigned int tidx = 0; tidx < arraysize(targets); tidx++) {
65       target_ = targets[tidx];
66       glGenBuffers(kNumberOfBuffers, buffers_);
67       if (kNumberOfBuffers == 1) {
68         glBindBuffer(target_, buffers_[0]);
69       }
70 
71       for (unsigned int sidx = 0; sidx < arraysize(sizes); sidx++) {
72         size_ = sizes[sidx];
73 
74         std::string name = std::string(Name()) + "_" + usage_names[uidx] + "_" +
75                            target_names[tidx] + "_" + IntToString(size_);
76         RunTest(this, name.c_str(), sizes[sidx], g_width, g_height, true);
77         CHECK(!glGetError());
78       }
79 
80       glDeleteBuffers(kNumberOfBuffers, buffers_);
81     }
82   }
83 
84   return true;
85 }
86 
GetBufferUploadTest()87 TestBase* GetBufferUploadTest() {
88   return new BufferUploadTest;
89 }
90 
91 } // namespace glbench
92