| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <fcntl.h> | 5 #include <fcntl.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 #include <sys/mman.h> | 9 #include <sys/mman.h> |
| 10 | 10 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, | 153 glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, |
| 154 GL_RGBA, GL_UNSIGNED_BYTE, pixels); | 154 GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| 155 } | 155 } |
| 156 delete[] pixels; | 156 delete[] pixels; |
| 157 return name; | 157 return name; |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 static void DrawArraysTestFunc(int iter); | 161 static void DrawArraysTestFunc(int iter); |
| 162 static void FillRateTestNormal(const char *name, float coeff=1.f); | 162 static void FillRateTestNormal(const char *name, float coeff=1.f); |
| 163 |
| 164 #ifndef USE_EGL |
| 163 static void FillRateTestBlendDepth(const char *name); | 165 static void FillRateTestBlendDepth(const char *name); |
| 164 | 166 |
| 165 void FillRateTest() { | 167 void FillRateTest() { |
| 166 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | 168 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); |
| 167 glDisable(GL_DEPTH_TEST); | 169 glDisable(GL_DEPTH_TEST); |
| 168 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 170 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| 169 | 171 |
| 170 GLfloat buffer_vertex[8] = { | 172 GLfloat buffer_vertex[8] = { |
| 171 -1.f, -1.f, | 173 -1.f, -1.f, |
| 172 1.f, -1.f, | 174 1.f, -1.f, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 glLoadIdentity(); | 227 glLoadIdentity(); |
| 226 glScalef(0.933f, 0.933f, 1.f); | 228 glScalef(0.933f, 0.933f, 1.f); |
| 227 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, | 229 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
| 228 GL_LINEAR_MIPMAP_LINEAR); | 230 GL_LINEAR_MIPMAP_LINEAR); |
| 229 FillRateTestNormal("fill_tex_trilinear_linear_01", 0.933f * 0.933f); | 231 FillRateTestNormal("fill_tex_trilinear_linear_01", 0.933f * 0.933f); |
| 230 | 232 |
| 231 glDeleteBuffers(1, &vbo_vertex); | 233 glDeleteBuffers(1, &vbo_vertex); |
| 232 glDeleteBuffers(1, &vbo_texture); | 234 glDeleteBuffers(1, &vbo_texture); |
| 233 glDeleteTextures(1, &texture); | 235 glDeleteTextures(1, &texture); |
| 234 } | 236 } |
| 237 #endif |
| 235 | 238 |
| 236 | 239 |
| 237 static void FillRateTestNormal(const char *name, float coeff) { | 240 static void FillRateTestNormal(const char *name, float coeff) { |
| 238 const int buffer_len = 64; | 241 const int buffer_len = 64; |
| 239 char buffer[buffer_len]; | 242 char buffer[buffer_len]; |
| 240 snprintf(buffer, buffer_len, "mpixels_sec_%s", name); | 243 snprintf(buffer, buffer_len, "mpixels_sec_%s", name); |
| 241 RunTest(DrawArraysTestFunc, buffer, coeff * g_width * g_height, true); | 244 RunTest(DrawArraysTestFunc, buffer, coeff * g_width * g_height, true); |
| 242 } | 245 } |
| 243 | 246 |
| 247 #ifndef USE_EGL |
| 244 static void FillRateTestBlendDepth(const char *name) { | 248 static void FillRateTestBlendDepth(const char *name) { |
| 245 const int buffer_len = 64; | 249 const int buffer_len = 64; |
| 246 char buffer[buffer_len]; | 250 char buffer[buffer_len]; |
| 247 | 251 |
| 248 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 252 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| 249 glEnable(GL_BLEND); | 253 glEnable(GL_BLEND); |
| 250 snprintf(buffer, buffer_len, "mpixels_sec_%s_blended", name); | 254 snprintf(buffer, buffer_len, "mpixels_sec_%s_blended", name); |
| 251 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); | 255 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); |
| 252 glDisable(GL_BLEND); | 256 glDisable(GL_BLEND); |
| 253 | 257 |
| 254 glEnable(GL_DEPTH_TEST); | 258 glEnable(GL_DEPTH_TEST); |
| 255 glDepthFunc(GL_NOTEQUAL); | 259 glDepthFunc(GL_NOTEQUAL); |
| 256 snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_neq", name); | 260 snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_neq", name); |
| 257 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); | 261 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); |
| 258 glDepthFunc(GL_NEVER); | 262 glDepthFunc(GL_NEVER); |
| 259 snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_never", name); | 263 snprintf(buffer, buffer_len, "mpixels_sec_%s_depth_never", name); |
| 260 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); | 264 RunTest(DrawArraysTestFunc, buffer, g_width * g_height, true); |
| 261 glDisable(GL_DEPTH_TEST); | 265 glDisable(GL_DEPTH_TEST); |
| 262 } | 266 } |
| 267 #endif |
| 263 | 268 |
| 264 | 269 |
| 265 static void DrawArraysTestFunc(int iter) { | 270 static void DrawArraysTestFunc(int iter) { |
| 266 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 271 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
| 267 glFlush(); | 272 glFlush(); |
| 268 for (int i = 0; i < iter-1; ++i) { | 273 for (int i = 0; i < iter-1; ++i) { |
| 269 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 274 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
| 270 } | 275 } |
| 271 } | 276 } |
| 272 | 277 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 *iptr++ = flag ? third : second; | 328 *iptr++ = flag ? third : second; |
| 324 *iptr++ = flag ? second : third; | 329 *iptr++ = flag ? second : third; |
| 325 } | 330 } |
| 326 } | 331 } |
| 327 } | 332 } |
| 328 *size = (iptr - *indices) * sizeof(GLuint); | 333 *size = (iptr - *indices) * sizeof(GLuint); |
| 329 | 334 |
| 330 return iptr - *indices; | 335 return iptr - *indices; |
| 331 } | 336 } |
| 332 | 337 |
| 338 #ifndef USE_EGL |
| 333 void TriangleSetupTest() { | 339 void TriangleSetupTest() { |
| 334 glViewport(-g_width, -g_height, g_width*2, g_height*2); | 340 glViewport(-g_width, -g_height, g_width*2, g_height*2); |
| 335 | 341 |
| 336 // Larger meshes make this test too slow for devices that do 1 mtri/sec. | 342 // Larger meshes make this test too slow for devices that do 1 mtri/sec. |
| 337 GLint width = 64; | 343 GLint width = 64; |
| 338 GLint height = 64; | 344 GLint height = 64; |
| 339 | 345 |
| 340 GLfloat *vertices = NULL; | 346 GLfloat *vertices = NULL; |
| 341 GLsizeiptr vertex_buffer_size = 0; | 347 GLsizeiptr vertex_buffer_size = 0; |
| 342 CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, | 348 CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 RunTest(DrawElementsTestFunc, "mtri_sec_triangle_setup_half_culled", | 382 RunTest(DrawElementsTestFunc, "mtri_sec_triangle_setup_half_culled", |
| 377 arg1 / 3, true); | 383 arg1 / 3, true); |
| 378 | 384 |
| 379 glDeleteBuffers(1, &index_buffer); | 385 glDeleteBuffers(1, &index_buffer); |
| 380 delete[] indices; | 386 delete[] indices; |
| 381 } | 387 } |
| 382 | 388 |
| 383 glDeleteBuffers(1, &vertex_buffer); | 389 glDeleteBuffers(1, &vertex_buffer); |
| 384 delete[] vertices; | 390 delete[] vertices; |
| 385 } | 391 } |
| 392 #endif |
| 386 | 393 |
| 387 | 394 |
| 388 void AttributeFetchShaderTest() { | 395 void AttributeFetchShaderTest() { |
| 389 GLint width = 64; | 396 GLint width = 64; |
| 390 GLint height = 64; | 397 GLint height = 64; |
| 391 | 398 |
| 392 glViewport(-g_width, -g_height, g_width*2, g_height*2); | 399 glViewport(-g_width, -g_height, g_width*2, g_height*2); |
| 393 | 400 |
| 394 GLfloat *vertices = NULL; | 401 GLfloat *vertices = NULL; |
| 395 GLsizeiptr vertex_buffer_size = 0; | 402 GLsizeiptr vertex_buffer_size = 0; |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 } | 569 } |
| 563 | 570 |
| 564 void YuvToRgbShaderTest1() { | 571 void YuvToRgbShaderTest1() { |
| 565 YuvToRgbShaderTestHelper(1, "yuv_shader_1"); | 572 YuvToRgbShaderTestHelper(1, "yuv_shader_1"); |
| 566 } | 573 } |
| 567 | 574 |
| 568 void YuvToRgbShaderTest2() { | 575 void YuvToRgbShaderTest2() { |
| 569 YuvToRgbShaderTestHelper(2, "yuv_shader_2"); | 576 YuvToRgbShaderTestHelper(2, "yuv_shader_2"); |
| 570 } | 577 } |
| 571 | 578 |
| 572 static GLuint compositing_textures[5]; | |
| 573 static uint32_t texture_base[WINDOW_HEIGHT*WINDOW_WIDTH]; | 579 static uint32_t texture_base[WINDOW_HEIGHT*WINDOW_WIDTH]; |
| 574 static uint32_t texture_update[WINDOW_HEIGHT*WINDOW_WIDTH]; | 580 static uint32_t texture_update[WINDOW_HEIGHT*WINDOW_WIDTH]; |
| 581 #ifndef USE_EGL |
| 582 static GLuint compositing_textures[5]; |
| 575 static ShaderProgram compositing_background_program = 0; | 583 static ShaderProgram compositing_background_program = 0; |
| 576 static ShaderProgram compositing_foreground_program = 0; | 584 static ShaderProgram compositing_foreground_program = 0; |
| 585 #endif |
| 577 | 586 |
| 578 void InitBaseTexture() { | 587 void InitBaseTexture() { |
| 579 for (int y = 0; y < WINDOW_HEIGHT; y++) { | 588 for (int y = 0; y < WINDOW_HEIGHT; y++) { |
| 580 for (int x = 0; x < WINDOW_WIDTH; x++) { | 589 for (int x = 0; x < WINDOW_WIDTH; x++) { |
| 581 // This color is gray, half alpha. | 590 // This color is gray, half alpha. |
| 582 texture_base[y*WINDOW_WIDTH+x] = 0x80808080; | 591 texture_base[y*WINDOW_WIDTH+x] = 0x80808080; |
| 583 } | 592 } |
| 584 } | 593 } |
| 585 } | 594 } |
| 586 | 595 |
| 587 // UpdateTexture simulates Chrome updating tab contents. | 596 // UpdateTexture simulates Chrome updating tab contents. |
| 588 // We cause a bunch of read and write cpu memory bandwidth. | 597 // We cause a bunch of read and write cpu memory bandwidth. |
| 589 // It's a very rough approximation. | 598 // It's a very rough approximation. |
| 590 void UpdateTexture() { | 599 void UpdateTexture() { |
| 591 memcpy(texture_update, texture_base, sizeof(texture_base)); | 600 memcpy(texture_update, texture_base, sizeof(texture_base)); |
| 592 } | 601 } |
| 593 | 602 |
| 594 void LoadTexture() { | 603 void LoadTexture() { |
| 595 // Use GL_RGBA for compatibility with GLES2.0. | 604 // Use GL_RGBA for compatibility with GLES2.0. |
| 596 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, | 605 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, |
| 597 WINDOW_WIDTH, WINDOW_HEIGHT, 0, | 606 WINDOW_WIDTH, WINDOW_HEIGHT, 0, |
| 598 GL_RGBA, GL_UNSIGNED_BYTE, texture_update); | 607 GL_RGBA, GL_UNSIGNED_BYTE, texture_update); |
| 599 } | 608 } |
| 600 | 609 |
| 610 #ifndef USE_EGL |
| 601 // Test how fast we can do full-screen compositing of images | 611 // Test how fast we can do full-screen compositing of images |
| 602 // continuously updated from the CPU. | 612 // continuously updated from the CPU. |
| 603 // This tests both GPU compositing performance and also | 613 // This tests both GPU compositing performance and also |
| 604 // CPU -> GPU data transfer speed. | 614 // CPU -> GPU data transfer speed. |
| 605 // It is a basic perf test to make sure we have enough performance | 615 // It is a basic perf test to make sure we have enough performance |
| 606 // to run a compositing window manager. | 616 // to run a compositing window manager. |
| 607 void CompositingTestFunc(int iter) { | 617 void CompositingTestFunc(int iter) { |
| 608 for (int i = 0 ; i < iter; ++i) { | 618 for (int i = 0 ; i < iter; ++i) { |
| 609 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 619 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 610 | 620 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 } | 792 } |
| 783 | 793 |
| 784 void NoFillWindowManagerCompositingTest() { | 794 void NoFillWindowManagerCompositingTest() { |
| 785 glScissor(0, 0, 1, 1); | 795 glScissor(0, 0, 1, 1); |
| 786 glEnable(GL_SCISSOR_TEST); | 796 glEnable(GL_SCISSOR_TEST); |
| 787 InitializeCompositing(); | 797 InitializeCompositing(); |
| 788 RunTest(CompositingTestFunc, "1280x768_fps_no_fill_compositing", | 798 RunTest(CompositingTestFunc, "1280x768_fps_no_fill_compositing", |
| 789 screen_scale_factor, true); | 799 screen_scale_factor, true); |
| 790 TeardownCompositing(); | 800 TeardownCompositing(); |
| 791 } | 801 } |
| 802 #endif |
| 792 | 803 |
| 793 void ReadPixelTestFunc(int iter) { | 804 void ReadPixelTestFunc(int iter) { |
| 794 glReadPixels(0, 0, g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, arg2); | 805 glReadPixels(0, 0, g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, arg2); |
| 795 CHECK(glGetError() == 0); | 806 CHECK(glGetError() == 0); |
| 796 for (int i = 0; i < iter; i++) | 807 for (int i = 0; i < iter; i++) |
| 797 glReadPixels(0, 0, g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, arg2); | 808 glReadPixels(0, 0, g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, arg2); |
| 798 } | 809 } |
| 799 | 810 |
| 800 // TODO: better test names. | 811 // TODO: better test names. |
| 801 void ReadPixelTest() { | 812 void ReadPixelTest() { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 SetBasePathFromArgv0(argv[0], "src"); | 862 SetBasePathFromArgv0(argv[0], "src"); |
| 852 ParseArgs(argc, argv); | 863 ParseArgs(argc, argv); |
| 853 if (!Init()) { | 864 if (!Init()) { |
| 854 printf("# Failed to initialize.\n"); | 865 printf("# Failed to initialize.\n"); |
| 855 return 1; | 866 return 1; |
| 856 } | 867 } |
| 857 | 868 |
| 858 void (*test[])() = { | 869 void (*test[])() = { |
| 859 SwapTest, | 870 SwapTest, |
| 860 ClearTest, | 871 ClearTest, |
| 861 FillRateTest, | |
| 862 TriangleSetupTest, | |
| 863 AttributeFetchShaderTest, | 872 AttributeFetchShaderTest, |
| 864 VaryingsAndDdxyShaderTest, | 873 VaryingsAndDdxyShaderTest, |
| 865 YuvToRgbShaderTest1, | 874 YuvToRgbShaderTest1, |
| 866 YuvToRgbShaderTest2, | 875 YuvToRgbShaderTest2, |
| 876 #ifndef USE_EGL |
| 877 FillRateTest, |
| 878 TriangleSetupTest, |
| 867 NoFillWindowManagerCompositingTest, | 879 NoFillWindowManagerCompositingTest, |
| 868 WindowManagerCompositingTest, | 880 WindowManagerCompositingTest, |
| 881 #endif |
| 869 ReadPixelTest, | 882 ReadPixelTest, |
| 870 }; | 883 }; |
| 871 | 884 |
| 872 uint64_t done = GetUTime() + 1000000ULL * seconds_to_run; | 885 uint64_t done = GetUTime() + 1000000ULL * seconds_to_run; |
| 873 do { | 886 do { |
| 874 for (unsigned int i = 0; i < sizeof(test) / sizeof(*test); i++) { | 887 for (unsigned int i = 0; i < sizeof(test) / sizeof(*test); i++) { |
| 875 InitContext(); | 888 InitContext(); |
| 876 test[i](); | 889 test[i](); |
| 877 GLenum err = glGetError(); | 890 GLenum err = glGetError(); |
| 878 if (err != 0) | 891 if (err != 0) |
| 879 printf("# glGetError returned non-zero: 0x%x\n", err); | 892 printf("# glGetError returned non-zero: 0x%x\n", err); |
| 880 DestroyContext(); | 893 DestroyContext(); |
| 881 } | 894 } |
| 882 } while (GetUTime() < done); | 895 } while (GetUTime() < done); |
| 883 | 896 |
| 884 return 0; | 897 return 0; |
| 885 } | 898 } |
| OLD | NEW |