Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/containers/small_map.h" | 8 #include "base/containers/small_map.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 GenerateVertexBuffer(texture_size); | 497 GenerateVertexBuffer(texture_size); |
| 498 | 498 |
| 499 gfx::Vector2dF positions[] = {gfx::Vector2dF(0.f, 0.f), | 499 gfx::Vector2dF positions[] = {gfx::Vector2dF(0.f, 0.f), |
| 500 gfx::Vector2dF(1.f, 0.f), | 500 gfx::Vector2dF(1.f, 0.f), |
| 501 gfx::Vector2dF(0.f, 1.f), | 501 gfx::Vector2dF(0.f, 1.f), |
| 502 gfx::Vector2dF(1.f, 1.f)}; | 502 gfx::Vector2dF(1.f, 1.f)}; |
| 503 GLuint texture_id = CreateGLTexture(GL_RGBA, texture_size, true); | 503 GLuint texture_id = CreateGLTexture(GL_RGBA, texture_size, true); |
| 504 | 504 |
| 505 MeasurementTimers upload_and_draw_timers(gpu_timing_client_.get()); | 505 MeasurementTimers upload_and_draw_timers(gpu_timing_client_.get()); |
| 506 | 506 |
| 507 GLint current_tex_id = -1; | |
| 508 bool is_renaming = false; | |
| 507 for (int i = 0; i < 4; ++i) { | 509 for (int i = 0; i < 4; ++i) { |
| 508 UploadTexture(texture_id, texture_size, pixels[i % 4], GL_RGBA, true); | 510 UploadTexture(texture_id, texture_size, pixels[i % 4], GL_RGBA, true); |
| 511 if (!is_renaming && current_tex_id != -1 && | |
| 512 static_cast<GLuint>(current_tex_id) != texture_id) | |
| 513 is_renaming = true; | |
| 509 DCHECK_NE(-1, translation_location_); | 514 DCHECK_NE(-1, translation_location_); |
| 510 glUniform2f(translation_location_, positions[i % 4].x(), | 515 glUniform2f(translation_location_, positions[i % 4].x(), |
| 511 positions[i % 4].y()); | 516 positions[i % 4].y()); |
| 512 // Draw the same quad multiple times to make sure that the time spent on the | 517 // Draw the same quad multiple times to make sure that the time spent on the |
| 513 // gpu is more than the cpu time. | 518 // gpu is more than the cpu time. |
| 514 for (int draw = 0; draw < 128; ++draw) { | 519 for (int draw = 0; draw < 128; ++draw) { |
| 520 glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_tex_id); | |
|
Daniele Castagna
2015/04/07 16:27:08
This returns the name of the texture currently bou
patro
2015/04/08 15:19:49
You are right this patch doesn't work as intended.
Daniele Castagna
2015/04/14 16:13:15
I was thinking about this perftest to print out ra
sivag
2015/04/27 12:39:02
Daniele,
Can you elaborate more on this?
How this
| |
| 515 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | 521 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
| 516 } | 522 } |
| 517 } | 523 } |
| 518 | 524 |
| 519 upload_and_draw_timers.Record(); | 525 upload_and_draw_timers.Record(); |
| 520 MeasurementTimers finish_timers(gpu_timing_client_.get()); | 526 MeasurementTimers finish_timers(gpu_timing_client_.get()); |
| 521 glFinish(); | 527 glFinish(); |
| 522 CheckNoGlError("glFinish"); | 528 CheckNoGlError("glFinish"); |
| 523 finish_timers.Record(); | 529 finish_timers.Record(); |
| 524 | 530 |
| 525 glDeleteTextures(1, &texture_id); | 531 glDeleteTextures(1, &texture_id); |
| 526 | 532 |
| 527 for (int i = 0; i < 4; ++i) { | 533 for (int i = 0; i < 4; ++i) { |
| 528 std::vector<uint8> pixels_rendered(texture_size.GetArea() * 4); | 534 std::vector<uint8> pixels_rendered(texture_size.GetArea() * 4); |
| 529 glReadPixels(texture_size.width() * positions[i].x(), | 535 glReadPixels(texture_size.width() * positions[i].x(), |
| 530 texture_size.height() * positions[i].y(), texture_size.width(), | 536 texture_size.height() * positions[i].y(), texture_size.width(), |
| 531 texture_size.height(), GL_RGBA, GL_UNSIGNED_BYTE, | 537 texture_size.height(), GL_RGBA, GL_UNSIGNED_BYTE, |
| 532 &pixels_rendered[0]); | 538 &pixels_rendered[0]); |
| 533 CheckNoGlError("glReadPixels"); | 539 CheckNoGlError("glReadPixels"); |
| 534 ASSERT_EQ(pixels[i].size(), pixels_rendered.size()); | 540 ASSERT_EQ(pixels[i].size(), pixels_rendered.size()); |
| 535 EXPECT_EQ(pixels[i], pixels_rendered); | 541 EXPECT_EQ(pixels[i], pixels_rendered); |
| 536 } | 542 } |
| 537 | 543 |
| 538 bool gpu_timer_errors = gpu_timing_client_->IsAvailable() && | 544 bool gpu_timer_errors = gpu_timing_client_->IsAvailable() && |
| 539 gpu_timing_client_->CheckAndResetTimerErrors(); | 545 gpu_timing_client_->CheckAndResetTimerErrors(); |
| 540 if (!gpu_timer_errors) { | 546 if (!gpu_timer_errors) { |
| 541 upload_and_draw_timers.GetAsMeasurement("upload_and_draw") | 547 upload_and_draw_timers.GetAsMeasurement("upload_and_draw") |
| 542 .PrintResult("renaming"); | 548 .PrintResult("renaming"); |
| 543 finish_timers.GetAsMeasurement("finish").PrintResult("renaming"); | 549 finish_timers.GetAsMeasurement("finish").PrintResult("renaming"); |
| 550 if (is_renaming) | |
| 551 perf_test::PrintResult("renaming", "", | |
| 552 "Driver renames texture internally", "True", "", | |
| 553 true); | |
| 554 else | |
| 555 perf_test::PrintResult("renaming", "", | |
| 556 "Driver renames texture internally", "False", "", | |
| 557 true); | |
| 544 } | 558 } |
| 545 } | 559 } |
| 546 | 560 |
| 547 } // namespace | 561 } // namespace |
| 548 } // namespace gpu | 562 } // namespace gpu |
| OLD | NEW |