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 |