Home | History | Annotate | Download | only in src
      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 class BufferUploadSubTest : public TestBase {
     13   public:
     14     BufferUploadSubTest()
     15       : buffer_size_(1572864),
     16       target_(GL_ARRAY_BUFFER),
     17       size_(0)
     18   {
     19     memset(data_, 0, sizeof(data_));
     20   }
     21     virtual ~BufferUploadSubTest() {}
     22     virtual bool TestFunc(uint64_t iterations);
     23     virtual bool Run();
     24     virtual const char* Name() const { return "buffer_upload_sub"; }
     25     virtual bool IsDrawTest() const { return false; }
     26     virtual const char* Unit() const { return "mbytes_sec"; }
     27 
     28   private:
     29     GLsizeiptr buffer_size_;
     30     GLenum target_;
     31     GLsizeiptr size_;
     32     GLbyte data_[256 * 1024];
     33     DISALLOW_COPY_AND_ASSIGN(BufferUploadSubTest);
     34 };
     35 
     36 bool BufferUploadSubTest::TestFunc(uint64_t iterations) {
     37   GLintptr offset = 0;
     38   for (uint64_t i = 0; i < iterations - 1; ++i) {
     39     if (offset + size_ > buffer_size_) {
     40       offset = 0;
     41     }
     42     glBufferSubData(target_, offset, size_, data_);
     43     offset += size_;
     44   }
     45   return true;
     46 }
     47 
     48 bool BufferUploadSubTest::Run() {
     49   const GLenum usages[] = {GL_DYNAMIC_DRAW, GL_STATIC_DRAW};
     50   const char * usage_names[] = {"dynamic", "static"};
     51   const GLenum targets[] = {GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER};
     52   const char * target_names[] = {"array", "element_array"};
     53   const int sizes[] = {8, 12, 16, 32, 64, 128, 192, 256, 512, 1024, 2048,
     54                         4096, 8192, 16384, 32768, 65536, 131072};
     55 
     56   for (unsigned int uidx = 0; uidx < arraysize(usages); uidx++) {
     57     GLenum usage = usages[uidx];
     58 
     59     for (unsigned int tidx = 0; tidx < arraysize(targets); tidx++) {
     60       target_ = targets[tidx];
     61       GLuint buf = ~0;
     62       glGenBuffers(1, &buf);
     63       glBindBuffer(target_, buf);
     64 
     65       for (unsigned int sidx = 0; sidx < arraysize(sizes); sidx++) {
     66         size_ = sizes[sidx];
     67         glBufferData(target_, buffer_size_, NULL, usage);
     68 
     69         std::string name = std::string(Name()) + "_" + usage_names[uidx] + "_" +
     70                             target_names[tidx] + "_" + IntToString(size_);
     71         RunTest(this, name.c_str(), sizes[sidx], g_width, g_height, true);
     72         CHECK(!glGetError());
     73       }
     74 
     75       glDeleteBuffers(1, &buf);
     76     }
     77   }
     78 
     79   return true;
     80 }
     81 
     82 TestBase* GetBufferUploadSubTest() {
     83   return new BufferUploadSubTest;
     84 }
     85 
     86 } // namespace glbench
     87