Chromium Code Reviews| 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 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 protected: | 143 protected: |
| 144 bool disjointed_ = false; | 144 bool disjointed_ = false; |
| 145 GLint64 current_time_ = 0; | 145 GLint64 current_time_ = 0; |
| 146 GLuint next_query_id_ = 0; | 146 GLuint next_query_id_ = 0; |
| 147 std::set<GLuint> alloced_queries_; | 147 std::set<GLuint> alloced_queries_; |
| 148 std::map<GLuint, GLint64> query_timestamp_; | 148 std::map<GLuint, GLint64> query_timestamp_; |
| 149 }; | 149 }; |
| 150 | 150 |
| 151 class GPUTracerTester : public GPUTracer { | 151 class GPUTracerTester : public GPUTracer { |
| 152 public: | 152 public: |
| 153 explicit GPUTracerTester(gles2::GLES2Decoder* decoder) | 153 explicit GPUTracerTester(gles2::GLES2Decoder* decoder, GPUTiming* gpu_timing) |
|
Daniele Castagna
2015/02/19 18:15:32
nit: explicit here is not needed anymore.
| |
| 154 : GPUTracer(decoder), tracing_enabled_(0) { | 154 : GPUTracer(decoder, gpu_timing), tracing_enabled_(0) { |
| 155 gpu_timing_.SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); | 155 gpu_timing_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); |
| 156 | 156 |
| 157 // Force tracing to be dependent on our mock variable here. | 157 // Force tracing to be dependent on our mock variable here. |
| 158 gpu_trace_srv_category = &tracing_enabled_; | 158 gpu_trace_srv_category = &tracing_enabled_; |
| 159 gpu_trace_dev_category = &tracing_enabled_; | 159 gpu_trace_dev_category = &tracing_enabled_; |
| 160 } | 160 } |
| 161 | 161 |
| 162 ~GPUTracerTester() override {} | 162 ~GPUTracerTester() override {} |
| 163 | 163 |
| 164 void SetTracingEnabled(bool enabled) { | 164 void SetTracingEnabled(bool enabled) { |
| 165 tracing_enabled_ = enabled ? 1 : 0; | 165 tracing_enabled_ = enabled ? 1 : 0; |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 class BaseGpuTracerTest : public BaseGpuTest { | 399 class BaseGpuTracerTest : public BaseGpuTest { |
| 400 public: | 400 public: |
| 401 explicit BaseGpuTracerTest(GPUTiming::TimerType test_timer_type) | 401 explicit BaseGpuTracerTest(GPUTiming::TimerType test_timer_type) |
| 402 : BaseGpuTest(test_timer_type) {} | 402 : BaseGpuTest(test_timer_type) {} |
| 403 | 403 |
| 404 void DoBasicTracerTest() { | 404 void DoBasicTracerTest() { |
| 405 ExpectTracerOffsetQueryMocks(); | 405 ExpectTracerOffsetQueryMocks(); |
| 406 | 406 |
| 407 MockGLES2Decoder decoder; | 407 MockGLES2Decoder decoder; |
| 408 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); | 408 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); |
| 409 GPUTracerTester tracer(&decoder); | 409 GPUTracerTester tracer(&decoder, &gpu_timing_); |
| 410 tracer.SetTracingEnabled(true); | 410 tracer.SetTracingEnabled(true); |
| 411 | 411 |
| 412 tracer.SetOutputter(outputter_ref_); | 412 tracer.SetOutputter(outputter_ref_); |
| 413 | 413 |
| 414 ASSERT_TRUE(tracer.BeginDecoding()); | 414 ASSERT_TRUE(tracer.BeginDecoding()); |
| 415 ASSERT_TRUE(tracer.EndDecoding()); | 415 ASSERT_TRUE(tracer.EndDecoding()); |
| 416 | 416 |
| 417 outputter_ref_ = NULL; | 417 outputter_ref_ = NULL; |
| 418 } | 418 } |
| 419 | 419 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 430 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 430 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
| 431 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 431 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
| 432 const int64 expect_start_time = | 432 const int64 expect_start_time = |
| 433 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 433 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
| 434 offset_time; | 434 offset_time; |
| 435 const int64 expect_end_time = | 435 const int64 expect_end_time = |
| 436 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; | 436 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; |
| 437 | 437 |
| 438 MockGLES2Decoder decoder; | 438 MockGLES2Decoder decoder; |
| 439 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); | 439 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); |
| 440 GPUTracerTester tracer(&decoder); | 440 GPUTracerTester tracer(&decoder, &gpu_timing_); |
| 441 tracer.SetTracingEnabled(true); | 441 tracer.SetTracingEnabled(true); |
| 442 | 442 |
| 443 tracer.SetOutputter(outputter_ref_); | 443 tracer.SetOutputter(outputter_ref_); |
| 444 | 444 |
| 445 gl_fake_queries_.SetCurrentGLTime(start_timestamp); | 445 gl_fake_queries_.SetCurrentGLTime(start_timestamp); |
| 446 g_fakeCPUTime = expect_start_time; | 446 g_fakeCPUTime = expect_start_time; |
| 447 | 447 |
| 448 ASSERT_TRUE(tracer.BeginDecoding()); | 448 ASSERT_TRUE(tracer.BeginDecoding()); |
| 449 | 449 |
| 450 ExpectTraceQueryMocks(); | 450 ExpectTraceQueryMocks(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 515 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 515 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
| 516 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 516 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
| 517 const int64 expect_start_time = | 517 const int64 expect_start_time = |
| 518 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 518 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
| 519 offset_time; | 519 offset_time; |
| 520 const int64 expect_end_time = | 520 const int64 expect_end_time = |
| 521 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; | 521 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; |
| 522 | 522 |
| 523 MockGLES2Decoder decoder; | 523 MockGLES2Decoder decoder; |
| 524 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); | 524 EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext())); |
| 525 GPUTracerTester tracer(&decoder); | 525 GPUTracerTester tracer(&decoder, &gpu_timing_); |
| 526 tracer.SetTracingEnabled(true); | 526 tracer.SetTracingEnabled(true); |
| 527 | 527 |
| 528 tracer.SetOutputter(outputter_ref_); | 528 tracer.SetOutputter(outputter_ref_); |
| 529 | 529 |
| 530 gl_fake_queries_.SetCurrentGLTime(start_timestamp); | 530 gl_fake_queries_.SetCurrentGLTime(start_timestamp); |
| 531 g_fakeCPUTime = expect_start_time; | 531 g_fakeCPUTime = expect_start_time; |
| 532 | 532 |
| 533 ASSERT_TRUE(tracer.BeginDecoding()); | 533 ASSERT_TRUE(tracer.BeginDecoding()); |
| 534 | 534 |
| 535 ExpectTraceQueryMocks(); | 535 ExpectTraceQueryMocks(); |
| 536 | 536 |
| 537 ExpectOutputterBeginMocks(outputter_ref_.get(), | 537 ExpectOutputterBeginMocks(outputter_ref_.get(), |
| 538 category_name, trace_name); | 538 category_name, trace_name); |
| 539 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); | 539 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); |
| 540 | 540 |
| 541 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 541 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
| 542 g_fakeCPUTime = expect_end_time; | 542 g_fakeCPUTime = expect_end_time; |
| 543 | |
| 544 // Create a disjoint context to test disjoint behavior. This should not | |
| 545 // interfere with the tracer's disjoint context. | |
| 546 scoped_refptr<DisjointContext> disjoint_context = | |
| 547 gpu_timing_.CreateDisjointContext(); | |
| 548 | |
| 549 ASSERT_FALSE(disjoint_context->CheckAndResetTimerErrors()); | |
| 543 gl_fake_queries_.SetDisjoint(); | 550 gl_fake_queries_.SetDisjoint(); |
| 551 ASSERT_TRUE(disjoint_context->CheckAndResetTimerErrors()); | |
| 544 | 552 |
| 545 ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name, | 553 ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name, |
| 546 expect_start_time, expect_end_time, false); | 554 expect_start_time, expect_end_time, false); |
| 547 | 555 |
| 548 ASSERT_TRUE(tracer.End(source)); | 556 ASSERT_TRUE(tracer.End(source)); |
| 549 ASSERT_TRUE(tracer.EndDecoding()); | 557 ASSERT_TRUE(tracer.EndDecoding()); |
| 550 | 558 |
| 551 outputter_ref_ = NULL; | 559 outputter_ref_ = NULL; |
| 552 } | 560 } |
| 553 }; | 561 }; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 | 606 |
| 599 class GPUTracerTest : public GpuServiceTest { | 607 class GPUTracerTest : public GpuServiceTest { |
| 600 protected: | 608 protected: |
| 601 void SetUp() override { | 609 void SetUp() override { |
| 602 g_fakeCPUTime = 0; | 610 g_fakeCPUTime = 0; |
| 603 GpuServiceTest::SetUpWithGLVersion("3.2", ""); | 611 GpuServiceTest::SetUpWithGLVersion("3.2", ""); |
| 604 decoder_.reset(new MockGLES2Decoder()); | 612 decoder_.reset(new MockGLES2Decoder()); |
| 605 EXPECT_CALL(*decoder_, GetGLContext()) | 613 EXPECT_CALL(*decoder_, GetGLContext()) |
| 606 .Times(AtMost(1)) | 614 .Times(AtMost(1)) |
| 607 .WillRepeatedly(Return(GetGLContext())); | 615 .WillRepeatedly(Return(GetGLContext())); |
| 608 tracer_tester_.reset(new GPUTracerTester(decoder_.get())); | 616 tracer_tester_.reset(new GPUTracerTester(decoder_.get(), &gpu_timing_)); |
| 609 } | 617 } |
| 610 | 618 |
| 611 void TearDown() override { | 619 void TearDown() override { |
| 612 tracer_tester_ = nullptr; | 620 tracer_tester_ = nullptr; |
| 613 decoder_ = nullptr; | 621 decoder_ = nullptr; |
| 614 GpuServiceTest::TearDown(); | 622 GpuServiceTest::TearDown(); |
| 615 } | 623 } |
| 624 GPUTiming gpu_timing_; | |
| 616 scoped_ptr<MockGLES2Decoder> decoder_; | 625 scoped_ptr<MockGLES2Decoder> decoder_; |
| 617 scoped_ptr<GPUTracerTester> tracer_tester_; | 626 scoped_ptr<GPUTracerTester> tracer_tester_; |
| 618 }; | 627 }; |
| 619 | 628 |
| 620 TEST_F(GPUTracerTest, IsTracingTest) { | 629 TEST_F(GPUTracerTest, IsTracingTest) { |
| 621 EXPECT_FALSE(tracer_tester_->IsTracing()); | 630 EXPECT_FALSE(tracer_tester_->IsTracing()); |
| 622 tracer_tester_->SetTracingEnabled(true); | 631 tracer_tester_->SetTracingEnabled(true); |
| 623 EXPECT_TRUE(tracer_tester_->IsTracing()); | 632 EXPECT_TRUE(tracer_tester_->IsTracing()); |
| 624 } | 633 } |
| 625 // Test basic functionality of the GPUTracerTester. | 634 // Test basic functionality of the GPUTracerTester. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 636 | 645 |
| 637 EXPECT_FALSE( | 646 EXPECT_FALSE( |
| 638 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); | 647 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); |
| 639 | 648 |
| 640 ASSERT_TRUE(tracer_tester_->BeginDecoding()); | 649 ASSERT_TRUE(tracer_tester_->BeginDecoding()); |
| 641 EXPECT_TRUE( | 650 EXPECT_TRUE( |
| 642 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); | 651 tracer_tester_->Begin(category_name, trace_name, kTraceGroupMarker)); |
| 643 ASSERT_TRUE(tracer_tester_->EndDecoding()); | 652 ASSERT_TRUE(tracer_tester_->EndDecoding()); |
| 644 } | 653 } |
| 645 | 654 |
| 655 TEST_F(GpuDisjointTimerTracerTest, MultipleDisjointContexts) { | |
| 656 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1)) | |
| 657 .WillRepeatedly( | |
| 658 Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv)); | |
| 659 | |
| 660 scoped_refptr<DisjointContext> disjoint_context1 = | |
| 661 gpu_timing_.CreateDisjointContext(); | |
| 662 scoped_refptr<DisjointContext> disjoint_context2 = | |
| 663 gpu_timing_.CreateDisjointContext(); | |
| 664 | |
| 665 // Test both contexts are initialized as no errors. | |
| 666 ASSERT_FALSE(disjoint_context1->CheckAndResetTimerErrors()); | |
| 667 ASSERT_FALSE(disjoint_context2->CheckAndResetTimerErrors()); | |
| 668 | |
| 669 // Issue a disjoint. | |
| 670 gl_fake_queries_.SetDisjoint(); | |
| 671 | |
| 672 ASSERT_TRUE(disjoint_context1->CheckAndResetTimerErrors()); | |
| 673 ASSERT_TRUE(disjoint_context2->CheckAndResetTimerErrors()); | |
| 674 | |
| 675 // Test new context gets the disjoint value as if no other contexts reset it. | |
| 676 scoped_refptr<DisjointContext> disjoint_context3 = | |
| 677 gpu_timing_.CreateDisjointContext(); | |
| 678 ASSERT_TRUE(disjoint_context3->CheckAndResetTimerErrors()); | |
| 679 | |
| 680 // Test all 3 are all reset. | |
| 681 ASSERT_FALSE(disjoint_context1->CheckAndResetTimerErrors()); | |
| 682 ASSERT_FALSE(disjoint_context2->CheckAndResetTimerErrors()); | |
| 683 ASSERT_FALSE(disjoint_context3->CheckAndResetTimerErrors()); | |
| 684 } | |
| 685 | |
| 686 TEST_F(GpuDisjointTimerTracerTest, DisjointContextDestruction) { | |
| 687 ASSERT_EQ(0u, gpu_timing_.GetDisjointContextsCount()); | |
| 688 | |
| 689 { | |
| 690 scoped_refptr<DisjointContext> context = | |
| 691 gpu_timing_.CreateDisjointContext(); | |
| 692 ASSERT_EQ(1u, gpu_timing_.GetDisjointContextsCount()); | |
| 693 } | |
| 694 | |
| 695 ASSERT_EQ(0u, gpu_timing_.GetDisjointContextsCount()); | |
| 696 } | |
| 697 | |
| 646 } // namespace | 698 } // namespace |
| 647 } // namespace gles2 | 699 } // namespace gles2 |
| 648 } // namespace gpu | 700 } // namespace gpu |
| OLD | NEW |