// Copyright (c) 2018 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 "arraysize.h" #include "main.h" #include "testbase.h" #include "utils.h" namespace glbench { namespace { const int kNumberOfBuffers = 1; } // namespace class BufferUploadTest : public TestBase { public: BufferUploadTest() : target_(GL_ARRAY_BUFFER), size_(0), usage_(GL_DYNAMIC_DRAW) { memset(data_, 0, sizeof(data_)); } virtual ~BufferUploadTest() {} virtual bool TestFunc(uint64_t iterations); virtual bool Run(); virtual const char* Name() const { return "buffer_upload"; } virtual bool IsDrawTest() const { return false; } virtual const char* Unit() const { return "mbytes_sec"; } private: GLenum target_; GLsizeiptr size_; GLenum usage_; GLbyte data_[256 * 1024]; GLuint buffers_[kNumberOfBuffers]; DISALLOW_COPY_AND_ASSIGN(BufferUploadTest); }; bool BufferUploadTest::TestFunc(uint64_t iterations) { for (uint64_t i = 0; i < iterations - 1; ++i) { if (kNumberOfBuffers > 1) { glBindBuffer(target_, buffers_[i % kNumberOfBuffers]); } glBufferData(target_, size_, data_, usage_); } return true; } bool BufferUploadTest::Run() { const GLenum usages[] = {GL_DYNAMIC_DRAW, GL_STATIC_DRAW}; const char * usage_names[] = {"dynamic", "static"}; const GLenum targets[] = {GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER}; const char * target_names[] = {"array", "element_array"}; const int sizes[] = {8, 12, 16, 32, 64, 128, 192, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072}; for (unsigned int uidx = 0; uidx < arraysize(usages); uidx++) { usage_ = usages[uidx]; for (unsigned int tidx = 0; tidx < arraysize(targets); tidx++) { target_ = targets[tidx]; glGenBuffers(kNumberOfBuffers, buffers_); if (kNumberOfBuffers == 1) { glBindBuffer(target_, buffers_[0]); } for (unsigned int sidx = 0; sidx < arraysize(sizes); sidx++) { size_ = sizes[sidx]; std::string name = std::string(Name()) + "_" + usage_names[uidx] + "_" + target_names[tidx] + "_" + IntToString(size_); RunTest(this, name.c_str(), sizes[sidx], g_width, g_height, true); CHECK(!glGetError()); } glDeleteBuffers(kNumberOfBuffers, buffers_); } } return true; } TestBase* GetBufferUploadTest() { return new BufferUploadTest; } } // namespace glbench