1 // Copyright 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 <stdlib.h> 6 7 #include "arraysize.h" 8 #include "main.h" 9 #include "testbase.h" 10 #include "utils.h" 11 12 namespace glbench { 13 14 class DrawSizeTest : public DrawElementsTestFunc { 15 public: 16 DrawSizeTest() {} 17 virtual ~DrawSizeTest() {} 18 virtual bool Run(); 19 virtual const char* Name() const { return "draw_size"; } 20 21 private: 22 DISALLOW_COPY_AND_ASSIGN(DrawSizeTest); 23 }; 24 25 const char* kDrawSizeVS = 26 "attribute vec4 pos;" 27 "void main() {" 28 " gl_Position = pos;" 29 "}"; 30 31 const char* kDrawSizeFS = 32 "uniform vec4 color;" 33 "void main() {" 34 " gl_FragColor = color;" 35 "}"; 36 37 bool DrawSizeTest::Run() { 38 GLuint program = InitShaderProgram(kDrawSizeVS, kDrawSizeFS); 39 const int sizes[] = {4, 8, 16, 32, 64, 128}; 40 41 glViewport(0, 0, g_width, g_height); 42 43 for (unsigned int j = 0; j < arraysize(sizes); j++) { 44 // This specifies a square mesh in the middle of the viewport. 45 // Larger meshes make this test too slow for devices that do 1 mtri/sec. 46 // Also note that GLES 2.0 uses 16 bit indices. 47 GLint width = sizes[j]; 48 GLint height = sizes[j]; 49 50 GLfloat* vertices = NULL; 51 GLsizeiptr vertex_buffer_size = 0; 52 CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, 53 width, height); 54 GLuint vertex_buffer = 55 SetupVBO(GL_ARRAY_BUFFER, vertex_buffer_size, vertices); 56 57 GLint attribute_index = glGetAttribLocation(program, "pos"); 58 glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); 59 glEnableVertexAttribArray(attribute_index); 60 61 // Use orange for drawing. 62 const GLfloat orange[4] = {1.0f, 0.5f, 0.0f, 1.0f}; 63 GLint color_uniform = glGetUniformLocation(program, "color"); 64 glUniform4fv(color_uniform, 1, orange); 65 66 GLushort* indices = NULL; 67 GLuint index_buffer = 0; 68 GLsizeiptr index_buffer_size = 0; 69 70 count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0); 71 72 index_buffer = 73 SetupVBO(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, indices); 74 75 std::string name = "draw_size_" + IntToString(width * height); 76 77 RunTest(this, name.c_str(), count_ / 3, g_width, g_height, true); 78 79 glDeleteBuffers(1, &index_buffer); 80 delete[] indices; 81 glDeleteBuffers(1, &vertex_buffer); 82 delete[] vertices; 83 } 84 85 glDeleteProgram(program); 86 return true; 87 } 88 89 TestBase* GetDrawSizeTest() { 90 return new DrawSizeTest; 91 } 92 93 } // namespace glbench 94