| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <map> | 5 #include <map> |
| 6 #include <set> | 6 #include <set> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" | 9 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
| 10 #include "gpu/command_buffer/service/gpu_service_test.h" | 10 #include "gpu/command_buffer/service/gpu_service_test.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 const char* extensions = ""; | 200 const char* extensions = ""; |
| 201 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { | 201 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { |
| 202 gl_version = "opengl es 3.0"; | 202 gl_version = "opengl es 3.0"; |
| 203 extensions = "GL_EXT_disjoint_timer_query"; | 203 extensions = "GL_EXT_disjoint_timer_query"; |
| 204 } else if (GetTimerType() == gfx::GPUTiming::kTimerTypeARB) { | 204 } else if (GetTimerType() == gfx::GPUTiming::kTimerTypeARB) { |
| 205 // TODO(sievers): The tracer should not depend on ARB_occlusion_query. | 205 // TODO(sievers): The tracer should not depend on ARB_occlusion_query. |
| 206 // Try merge Query APIs (core, ARB, EXT) into a single binding each. | 206 // Try merge Query APIs (core, ARB, EXT) into a single binding each. |
| 207 extensions = "GL_ARB_timer_query GL_ARB_occlusion_query"; | 207 extensions = "GL_ARB_timer_query GL_ARB_occlusion_query"; |
| 208 } | 208 } |
| 209 GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); | 209 GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); |
| 210 |
| 211 // Disjoint check should only be called by kTracerTypeDisjointTimer type. |
| 212 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { |
| 213 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1)) |
| 214 .WillRepeatedly( |
| 215 Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv)); |
| 216 } else { |
| 217 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0)); |
| 218 } |
| 210 gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient(); | 219 gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient(); |
| 211 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); | 220 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); |
| 212 gl_fake_queries_.Reset(); | 221 gl_fake_queries_.Reset(); |
| 213 | 222 |
| 214 outputter_ref_ = new MockOutputter(); | 223 outputter_ref_ = new MockOutputter(); |
| 215 } | 224 } |
| 216 | 225 |
| 217 void TearDown() override { | 226 void TearDown() override { |
| 218 outputter_ref_ = NULL; | 227 outputter_ref_ = NULL; |
| 219 | 228 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 const std::string& category, | 292 const std::string& category, |
| 284 const std::string& name, int64 expect_start_time, | 293 const std::string& name, int64 expect_start_time, |
| 285 int64 expect_end_time) { | 294 int64 expect_end_time) { |
| 286 ExpectOutputterBeginMocks(outputter, category, name); | 295 ExpectOutputterBeginMocks(outputter, category, name); |
| 287 bool valid_timer = GetTimerType() != gfx::GPUTiming::kTimerTypeInvalid; | 296 bool valid_timer = GetTimerType() != gfx::GPUTiming::kTimerTypeInvalid; |
| 288 ExpectOutputterEndMocks(outputter, category, name, expect_start_time, | 297 ExpectOutputterEndMocks(outputter, category, name, expect_start_time, |
| 289 expect_end_time, valid_timer); | 298 expect_end_time, valid_timer); |
| 290 } | 299 } |
| 291 | 300 |
| 292 void ExpectTracerOffsetQueryMocks() { | 301 void ExpectTracerOffsetQueryMocks() { |
| 293 // Disjoint check should only be called by kTracerTypeDisjointTimer type. | |
| 294 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { | |
| 295 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1)) | |
| 296 .WillRepeatedly( | |
| 297 Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv)); | |
| 298 } else { | |
| 299 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0)); | |
| 300 } | |
| 301 | |
| 302 if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) { | 302 if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) { |
| 303 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) | 303 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) |
| 304 .Times(Exactly(0)); | 304 .Times(Exactly(0)); |
| 305 } else { | 305 } else { |
| 306 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) | 306 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) |
| 307 .Times(AtMost(1)) | 307 .Times(AtMost(1)) |
| 308 .WillRepeatedly( | 308 .WillRepeatedly( |
| 309 Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); | 309 Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); |
| 310 } | 310 } |
| 311 } | 311 } |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 ASSERT_TRUE(tracer.BeginDecoding()); | 530 ASSERT_TRUE(tracer.BeginDecoding()); |
| 531 | 531 |
| 532 ExpectTraceQueryMocks(); | 532 ExpectTraceQueryMocks(); |
| 533 | 533 |
| 534 ExpectOutputterBeginMocks(outputter_ref_.get(), | 534 ExpectOutputterBeginMocks(outputter_ref_.get(), |
| 535 category_name, trace_name); | 535 category_name, trace_name); |
| 536 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); | 536 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); |
| 537 | 537 |
| 538 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 538 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
| 539 g_fakeCPUTime = expect_end_time; | 539 g_fakeCPUTime = expect_end_time; |
| 540 |
| 541 // Create GPUTimingClient to make sure disjoint value is correct. This |
| 542 // should not interfere with the tracer's disjoint value. |
| 543 scoped_refptr<gfx::GPUTimingClient> disjoint_client = |
| 544 GetGLContext()->CreateGPUTimingClient(); |
| 545 |
| 546 // We assert here based on the disjoint_client because if disjoints are not |
| 547 // working properly there is no point testing the tracer output. |
| 548 ASSERT_FALSE(disjoint_client->CheckAndResetTimerErrors()); |
| 540 gl_fake_queries_.SetDisjoint(); | 549 gl_fake_queries_.SetDisjoint(); |
| 550 ASSERT_TRUE(disjoint_client->CheckAndResetTimerErrors()); |
| 541 | 551 |
| 542 ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name, | 552 ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name, |
| 543 expect_start_time, expect_end_time, false); | 553 expect_start_time, expect_end_time, false); |
| 544 | 554 |
| 545 ASSERT_TRUE(tracer.End(source)); | 555 ASSERT_TRUE(tracer.End(source)); |
| 546 ASSERT_TRUE(tracer.EndDecoding()); | 556 ASSERT_TRUE(tracer.EndDecoding()); |
| 547 | 557 |
| 548 outputter_ref_ = NULL; | 558 outputter_ref_ = NULL; |
| 549 } | 559 } |
| 550 }; | 560 }; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 | 645 |
| 636 EXPECT_FALSE( | 646 EXPECT_FALSE( |
| 637 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); | 647 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); |
| 638 | 648 |
| 639 ASSERT_TRUE(tracer_tester_->BeginDecoding()); | 649 ASSERT_TRUE(tracer_tester_->BeginDecoding()); |
| 640 EXPECT_TRUE( | 650 EXPECT_TRUE( |
| 641 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); | 651 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); |
| 642 ASSERT_TRUE(tracer_tester_->EndDecoding()); | 652 ASSERT_TRUE(tracer_tester_->EndDecoding()); |
| 643 } | 653 } |
| 644 | 654 |
| 655 TEST_F(GpuDisjointTimerTracerTest, MultipleClientsDisjointTest) { |
| 656 scoped_refptr<gfx::GPUTimingClient> client1 = |
| 657 GetGLContext()->CreateGPUTimingClient(); |
| 658 scoped_refptr<gfx::GPUTimingClient> client2 = |
| 659 GetGLContext()->CreateGPUTimingClient(); |
| 660 |
| 661 // Test both clients are initialized as no errors. |
| 662 ASSERT_FALSE(client1->CheckAndResetTimerErrors()); |
| 663 ASSERT_FALSE(client2->CheckAndResetTimerErrors()); |
| 664 |
| 665 // Issue a disjoint. |
| 666 gl_fake_queries_.SetDisjoint(); |
| 667 |
| 668 ASSERT_TRUE(client1->CheckAndResetTimerErrors()); |
| 669 ASSERT_TRUE(client2->CheckAndResetTimerErrors()); |
| 670 |
| 671 // Test both are now reset. |
| 672 ASSERT_FALSE(client1->CheckAndResetTimerErrors()); |
| 673 ASSERT_FALSE(client2->CheckAndResetTimerErrors()); |
| 674 |
| 675 // Issue a disjoint. |
| 676 gl_fake_queries_.SetDisjoint(); |
| 677 |
| 678 // Test new client disjoint value is cleared. |
| 679 scoped_refptr<gfx::GPUTimingClient> client3 = |
| 680 GetGLContext()->CreateGPUTimingClient(); |
| 681 ASSERT_TRUE(client1->CheckAndResetTimerErrors()); |
| 682 ASSERT_TRUE(client2->CheckAndResetTimerErrors()); |
| 683 ASSERT_FALSE(client3->CheckAndResetTimerErrors()); |
| 684 } |
| 685 |
| 645 } // namespace | 686 } // namespace |
| 646 } // namespace gles2 | 687 } // namespace gles2 |
| 647 } // namespace gpu | 688 } // namespace gpu |
| OLD | NEW |