| Index: gpu/command_buffer/service/gpu_tracer_unittest.cc
|
| diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
|
| index ba61ba38d8f2420403b0d144f2dddea548983d37..cd3f5dfe91725779e598fd5377a20afc21d9d481 100644
|
| --- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
|
| +++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
|
| @@ -150,10 +150,8 @@ class GlFakeQueries {
|
|
|
| class GPUTracerTester : public GPUTracer {
|
| public:
|
| - explicit GPUTracerTester(gles2::GLES2Decoder* decoder)
|
| - : GPUTracer(decoder), tracing_enabled_(0) {
|
| - gpu_timing_.SetCpuTimeForTesting(base::Bind(&FakeCpuTime));
|
| -
|
| + GPUTracerTester(gles2::GLES2Decoder* decoder, GPUTiming* gpu_timing)
|
| + : GPUTracer(decoder, gpu_timing), tracing_enabled_(0) {
|
| // Force tracing to be dependent on our mock variable here.
|
| gpu_trace_srv_category = &tracing_enabled_;
|
| gpu_trace_dev_category = &tracing_enabled_;
|
| @@ -191,8 +189,6 @@ class BaseGpuTest : public GpuServiceTest {
|
| public:
|
| explicit BaseGpuTest(GPUTiming::TimerType test_timer_type)
|
| : test_timer_type_(test_timer_type) {
|
| - gpu_timing_.SetCpuTimeForTesting(base::Bind(&FakeCpuTime));
|
| - gpu_timing_.SetTimerTypeForTesting(test_timer_type);
|
| }
|
|
|
| protected:
|
| @@ -209,6 +205,8 @@ class BaseGpuTest : public GpuServiceTest {
|
| extensions = "GL_ARB_timer_query GL_ARB_occlusion_query";
|
| }
|
| GpuServiceTest::SetUpWithGLVersion(gl_version, extensions);
|
| + gpu_timing_.Initialize(GetGLContext());
|
| + gpu_timing_.SetCpuTimeForTesting(base::Bind(&FakeCpuTime));
|
| gl_fake_queries_.Reset();
|
|
|
| outputter_ref_ = new MockOutputter();
|
| @@ -229,15 +227,13 @@ class BaseGpuTest : public GpuServiceTest {
|
| Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
|
|
|
| EXPECT_CALL(*gl_, GetQueryObjectivARB(_, GL_QUERY_RESULT_AVAILABLE,
|
| - NotNull()))
|
| + NotNull()))
|
| .WillRepeatedly(
|
| Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectivARB));
|
|
|
| - if (GetTimerType() == GPUTiming::kTimerTypeDisjoint) {
|
| - EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _))
|
| + EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _))
|
| .WillRepeatedly(
|
| Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v));
|
| - }
|
|
|
| EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(AtLeast(2))
|
| .WillRepeatedly(
|
| @@ -347,9 +343,6 @@ class BaseGpuTraceTest : public BaseGpuTest {
|
| scoped_refptr<GPUTrace> trace = new GPUTrace(
|
| outputter_ref_, &gpu_timing_, category_name, trace_name, true);
|
|
|
| - gpu_timing_.SetOffsetForTesting(
|
| - offset_time, test_timer_type_ == GPUTiming::kTimerTypeARB);
|
| -
|
| gl_fake_queries_.SetCurrentGLTime(start_timestamp);
|
| g_fakeCPUTime = expect_start_time;
|
| trace->Start(true);
|
| @@ -406,8 +399,7 @@ class BaseGpuTracerTest : public BaseGpuTest {
|
| ExpectTracerOffsetQueryMocks();
|
|
|
| MockGLES2Decoder decoder;
|
| - EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext()));
|
| - GPUTracerTester tracer(&decoder);
|
| + GPUTracerTester tracer(&decoder, &gpu_timing_);
|
| tracer.SetTracingEnabled(true);
|
|
|
| tracer.SetOutputter(outputter_ref_);
|
| @@ -437,8 +429,7 @@ class BaseGpuTracerTest : public BaseGpuTest {
|
| (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
|
|
|
| MockGLES2Decoder decoder;
|
| - EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext()));
|
| - GPUTracerTester tracer(&decoder);
|
| + GPUTracerTester tracer(&decoder, &gpu_timing_);
|
| tracer.SetTracingEnabled(true);
|
|
|
| tracer.SetOutputter(outputter_ref_);
|
| @@ -522,8 +513,7 @@ class BaseGpuTracerTest : public BaseGpuTest {
|
| (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
|
|
|
| MockGLES2Decoder decoder;
|
| - EXPECT_CALL(decoder, GetGLContext()).WillOnce(Return(GetGLContext()));
|
| - GPUTracerTester tracer(&decoder);
|
| + GPUTracerTester tracer(&decoder, &gpu_timing_);
|
| tracer.SetTracingEnabled(true);
|
|
|
| tracer.SetOutputter(outputter_ref_);
|
| @@ -541,7 +531,14 @@ class BaseGpuTracerTest : public BaseGpuTest {
|
|
|
| gl_fake_queries_.SetCurrentGLTime(end_timestamp);
|
| g_fakeCPUTime = expect_end_time;
|
| +
|
| + // Create a disjoint context to test disjoint behavior. This should not
|
| + // interfere with the tracer's disjoint context.
|
| + int disjoint_id = gpu_timing_.CreateDisjointContextID();
|
| +
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id));
|
| gl_fake_queries_.SetDisjoint();
|
| + ASSERT_TRUE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id));
|
|
|
| ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name,
|
| expect_start_time, expect_end_time, false);
|
| @@ -602,11 +599,10 @@ class GPUTracerTest : public GpuServiceTest {
|
| void SetUp() override {
|
| g_fakeCPUTime = 0;
|
| GpuServiceTest::SetUpWithGLVersion("3.2", "");
|
| + gpu_timing_.Initialize(GetGLContext());
|
| + gpu_timing_.SetCpuTimeForTesting(base::Bind(&FakeCpuTime));
|
| decoder_.reset(new MockGLES2Decoder());
|
| - EXPECT_CALL(*decoder_, GetGLContext())
|
| - .Times(AtMost(1))
|
| - .WillRepeatedly(Return(GetGLContext()));
|
| - tracer_tester_.reset(new GPUTracerTester(decoder_.get()));
|
| + tracer_tester_.reset(new GPUTracerTester(decoder_.get(), &gpu_timing_));
|
| }
|
|
|
| void TearDown() override {
|
| @@ -614,6 +610,7 @@ class GPUTracerTest : public GpuServiceTest {
|
| decoder_ = nullptr;
|
| GpuServiceTest::TearDown();
|
| }
|
| + GPUTiming gpu_timing_;
|
| scoped_ptr<MockGLES2Decoder> decoder_;
|
| scoped_ptr<GPUTracerTester> tracer_tester_;
|
| };
|
| @@ -644,6 +641,34 @@ TEST_F(GPUTracerTest, TraceDuringDecodeTest) {
|
| ASSERT_TRUE(tracer_tester_->EndDecoding());
|
| }
|
|
|
| +TEST_F(GpuDisjointTimerTracerTest, MultipleDisjointContexts) {
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1))
|
| + .WillRepeatedly(
|
| + Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv));
|
| +
|
| + int disjoint_id1 = gpu_timing_.CreateDisjointContextID();
|
| + int disjoint_id2 = gpu_timing_.CreateDisjointContextID();
|
| +
|
| + // Test both contexts are initialized as no errors.
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id1));
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id2));
|
| +
|
| + // Issue a disjoint.
|
| + gl_fake_queries_.SetDisjoint();
|
| +
|
| + ASSERT_TRUE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id1));
|
| + ASSERT_TRUE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id2));
|
| +
|
| + // Test new context gets the disjoint value as if no other contexts reset it.
|
| + int disjoint_id3 = gpu_timing_.CreateDisjointContextID();
|
| + ASSERT_TRUE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id3));
|
| +
|
| + // Test all 3 are all reset.
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id1));
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id2));
|
| + ASSERT_FALSE(gpu_timing_.CheckAndResetTimerErrors(disjoint_id3));
|
| +}
|
| +
|
| } // namespace
|
| } // namespace gles2
|
| } // namespace gpu
|
|
|