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> | |
6 #include <set> | |
7 | |
8 #include "base/bind.h" | 5 #include "base/bind.h" |
9 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" | 6 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
10 #include "gpu/command_buffer/service/gpu_service_test.h" | 7 #include "gpu/command_buffer/service/gpu_service_test.h" |
11 #include "gpu/command_buffer/service/gpu_tracer.h" | 8 #include "gpu/command_buffer/service/gpu_tracer.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "ui/gl/gl_mock.h" | 10 #include "ui/gl/gl_mock.h" |
14 #include "ui/gl/gpu_timing.h" | 11 #include "ui/gl/gpu_timing.h" |
| 12 #include "ui/gl/gpu_timing_fake.h" |
15 | 13 |
16 namespace gpu { | 14 namespace gpu { |
17 namespace gles2 { | 15 namespace gles2 { |
18 namespace { | 16 namespace { |
19 | 17 |
20 using ::testing::_; | 18 using ::testing::_; |
21 using ::testing::AtLeast; | |
22 using ::testing::AtMost; | 19 using ::testing::AtMost; |
23 using ::testing::Exactly; | 20 using ::testing::Exactly; |
24 using ::testing::Invoke; | 21 using ::testing::Invoke; |
25 using ::testing::NotNull; | |
26 using ::testing::Return; | 22 using ::testing::Return; |
27 | 23 |
28 int64 g_fakeCPUTime = 0; | 24 int64 g_fakeCPUTime = 0; |
29 int64 FakeCpuTime() { | 25 int64 FakeCpuTime() { |
30 return g_fakeCPUTime; | 26 return g_fakeCPUTime; |
31 } | 27 } |
32 | 28 |
33 class MockOutputter : public Outputter { | 29 class MockOutputter : public Outputter { |
34 public: | 30 public: |
35 MockOutputter() {} | 31 MockOutputter() {} |
36 MOCK_METHOD5(TraceDevice, | 32 MOCK_METHOD5(TraceDevice, |
37 void(GpuTracerSource source, | 33 void(GpuTracerSource source, |
38 const std::string& category, const std::string& name, | 34 const std::string& category, const std::string& name, |
39 int64 start_time, int64 end_time)); | 35 int64 start_time, int64 end_time)); |
40 | 36 |
41 MOCK_METHOD3(TraceServiceBegin, | 37 MOCK_METHOD3(TraceServiceBegin, |
42 void(GpuTracerSource source, | 38 void(GpuTracerSource source, |
43 const std::string& category, const std::string& name)); | 39 const std::string& category, const std::string& name)); |
44 | 40 |
45 MOCK_METHOD3(TraceServiceEnd, | 41 MOCK_METHOD3(TraceServiceEnd, |
46 void(GpuTracerSource source, | 42 void(GpuTracerSource source, |
47 const std::string& category, const std::string& name)); | 43 const std::string& category, const std::string& name)); |
48 | 44 |
49 protected: | 45 protected: |
50 ~MockOutputter() {} | 46 ~MockOutputter() {} |
51 }; | 47 }; |
52 | 48 |
53 class GlFakeQueries { | |
54 public: | |
55 GlFakeQueries() {} | |
56 | |
57 void Reset() { | |
58 current_time_ = 0; | |
59 next_query_id_ = 23; | |
60 alloced_queries_.clear(); | |
61 query_timestamp_.clear(); | |
62 } | |
63 | |
64 void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } | |
65 void SetDisjoint() { disjointed_ = true; } | |
66 | |
67 void GenQueries(GLsizei n, GLuint* ids) { | |
68 for (GLsizei i = 0; i < n; i++) { | |
69 ids[i] = next_query_id_++; | |
70 alloced_queries_.insert(ids[i]); | |
71 } | |
72 } | |
73 | |
74 void DeleteQueries(GLsizei n, const GLuint* ids) { | |
75 for (GLsizei i = 0; i < n; i++) { | |
76 alloced_queries_.erase(ids[i]); | |
77 query_timestamp_.erase(ids[i]); | |
78 } | |
79 } | |
80 | |
81 void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { | |
82 switch (pname) { | |
83 case GL_QUERY_RESULT_AVAILABLE: { | |
84 std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); | |
85 if (it != query_timestamp_.end() && it->second <= current_time_) | |
86 *params = 1; | |
87 else | |
88 *params = 0; | |
89 break; | |
90 } | |
91 default: | |
92 FAIL() << "Invalid variable passed to GetQueryObjectiv: " << pname; | |
93 } | |
94 } | |
95 | |
96 void QueryCounter(GLuint id, GLenum target) { | |
97 switch (target) { | |
98 case GL_TIMESTAMP: | |
99 ASSERT_TRUE(alloced_queries_.find(id) != alloced_queries_.end()); | |
100 query_timestamp_[id] = current_time_; | |
101 break; | |
102 default: | |
103 FAIL() << "Invalid variable passed to QueryCounter: " << target; | |
104 } | |
105 } | |
106 | |
107 void GetInteger64v(GLenum pname, GLint64 * data) { | |
108 switch (pname) { | |
109 case GL_TIMESTAMP: | |
110 *data = current_time_; | |
111 break; | |
112 default: | |
113 FAIL() << "Invalid variable passed to GetInteger64v: " << pname; | |
114 } | |
115 } | |
116 | |
117 void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { | |
118 switch (pname) { | |
119 case GL_QUERY_RESULT: | |
120 ASSERT_TRUE(query_timestamp_.find(id) != query_timestamp_.end()); | |
121 *params = query_timestamp_.find(id)->second; | |
122 break; | |
123 default: | |
124 FAIL() << "Invalid variable passed to GetQueryObjectui64v: " << pname; | |
125 } | |
126 } | |
127 | |
128 void GetIntegerv(GLenum pname, GLint* params) { | |
129 switch (pname) { | |
130 case GL_GPU_DISJOINT_EXT: | |
131 *params = static_cast<GLint>(disjointed_); | |
132 disjointed_ = false; | |
133 break; | |
134 default: | |
135 FAIL() << "Invalid variable passed to GetIntegerv: " << pname; | |
136 } | |
137 } | |
138 | |
139 void Finish() { | |
140 } | |
141 | |
142 GLenum GetError() { | |
143 return GL_NO_ERROR; | |
144 } | |
145 | |
146 protected: | |
147 bool disjointed_ = false; | |
148 GLint64 current_time_ = 0; | |
149 GLuint next_query_id_ = 0; | |
150 std::set<GLuint> alloced_queries_; | |
151 std::map<GLuint, GLint64> query_timestamp_; | |
152 }; | |
153 | |
154 class GPUTracerTester : public GPUTracer { | 49 class GPUTracerTester : public GPUTracer { |
155 public: | 50 public: |
156 explicit GPUTracerTester(gles2::GLES2Decoder* decoder) | 51 explicit GPUTracerTester(gles2::GLES2Decoder* decoder) |
157 : GPUTracer(decoder), tracing_enabled_(0) { | 52 : GPUTracer(decoder), tracing_enabled_(0) { |
158 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); | 53 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); |
159 | 54 |
160 // Force tracing to be dependent on our mock variable here. | 55 // Force tracing to be dependent on our mock variable here. |
161 gpu_trace_srv_category = &tracing_enabled_; | 56 gpu_trace_srv_category = &tracing_enabled_; |
162 gpu_trace_dev_category = &tracing_enabled_; | 57 gpu_trace_dev_category = &tracing_enabled_; |
163 } | 58 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 gl_version = "opengl es 3.0"; | 103 gl_version = "opengl es 3.0"; |
209 extensions = "GL_EXT_disjoint_timer_query"; | 104 extensions = "GL_EXT_disjoint_timer_query"; |
210 } else if (GetTimerType() == gfx::GPUTiming::kTimerTypeARB) { | 105 } else if (GetTimerType() == gfx::GPUTiming::kTimerTypeARB) { |
211 // TODO(sievers): The tracer should not depend on ARB_occlusion_query. | 106 // TODO(sievers): The tracer should not depend on ARB_occlusion_query. |
212 // Try merge Query APIs (core, ARB, EXT) into a single binding each. | 107 // Try merge Query APIs (core, ARB, EXT) into a single binding each. |
213 extensions = "GL_ARB_timer_query GL_ARB_occlusion_query"; | 108 extensions = "GL_ARB_timer_query GL_ARB_occlusion_query"; |
214 } | 109 } |
215 GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); | 110 GpuServiceTest::SetUpWithGLVersion(gl_version, extensions); |
216 | 111 |
217 // Disjoint check should only be called by kTracerTypeDisjointTimer type. | 112 // Disjoint check should only be called by kTracerTypeDisjointTimer type. |
218 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) { | 113 if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) |
219 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1)) | 114 gl_fake_queries_.ExpectDisjointCalls(*gl_); |
220 .WillRepeatedly( | 115 else |
221 Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv)); | 116 gl_fake_queries_.ExpectNoDisjointCalls(*gl_); |
222 } else { | 117 |
223 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0)); | |
224 } | |
225 gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient(); | 118 gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient(); |
226 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); | 119 gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime)); |
227 gl_fake_queries_.Reset(); | 120 gl_fake_queries_.Reset(); |
228 | 121 |
229 outputter_ref_ = new MockOutputter(); | 122 outputter_ref_ = new MockOutputter(); |
230 } | 123 } |
231 | 124 |
232 void TearDown() override { | 125 void TearDown() override { |
233 outputter_ref_ = NULL; | 126 outputter_ref_ = NULL; |
234 gpu_timing_client_ = NULL; | 127 gpu_timing_client_ = NULL; |
235 | 128 |
236 gl_fake_queries_.Reset(); | 129 gl_fake_queries_.Reset(); |
237 GpuServiceTest::TearDown(); | 130 GpuServiceTest::TearDown(); |
238 } | 131 } |
239 | 132 |
240 void ExpectTraceQueryMocks() { | 133 void ExpectTraceQueryMocks() { |
241 if (gpu_timing_client_->IsAvailable() && | 134 if (gpu_timing_client_->IsAvailable()) { |
242 gpu_timing_client_->IsTimerOffsetAvailable()) { | |
243 // Delegate query APIs used by GPUTrace to a GlFakeQueries | 135 // Delegate query APIs used by GPUTrace to a GlFakeQueries |
244 EXPECT_CALL(*gl_, GenQueries(2, NotNull())).Times(AtLeast(1)) | 136 const bool elapsed = (GetTimerType() == gfx::GPUTiming::kTimerTypeEXT); |
245 .WillRepeatedly( | 137 gl_fake_queries_.ExpectGPUTimerQuery(*gl_, elapsed); |
246 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueries)); | |
247 | |
248 EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, | |
249 NotNull())) | |
250 .WillRepeatedly( | |
251 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); | |
252 | |
253 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _)) | |
254 .WillRepeatedly( | |
255 Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); | |
256 | |
257 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(AtLeast(2)) | |
258 .WillRepeatedly( | |
259 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); | |
260 | |
261 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) | |
262 .WillRepeatedly( | |
263 Invoke(&gl_fake_queries_, | |
264 &GlFakeQueries::GetQueryObjectui64v)); | |
265 | |
266 EXPECT_CALL(*gl_, DeleteQueries(2, NotNull())).Times(AtLeast(1)) | |
267 .WillRepeatedly( | |
268 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueries)); | |
269 } | 138 } |
270 } | 139 } |
271 | 140 |
272 void ExpectOutputterBeginMocks(MockOutputter* outputter, | 141 void ExpectOutputterBeginMocks(MockOutputter* outputter, |
273 GpuTracerSource source, | 142 GpuTracerSource source, |
274 const std::string& category, | 143 const std::string& category, |
275 const std::string& name) { | 144 const std::string& name) { |
276 EXPECT_CALL(*outputter, | 145 EXPECT_CALL(*outputter, |
277 TraceServiceBegin(source, category, name)); | 146 TraceServiceBegin(source, category, name)); |
278 } | 147 } |
279 | 148 |
280 void ExpectOutputterEndMocks(MockOutputter* outputter, | 149 void ExpectOutputterEndMocks(MockOutputter* outputter, |
281 GpuTracerSource source, | 150 GpuTracerSource source, |
282 const std::string& category, | 151 const std::string& category, |
283 const std::string& name, int64 expect_start_time, | 152 const std::string& name, int64 expect_start_time, |
284 int64 expect_end_time, | 153 int64 expect_end_time, |
| 154 bool trace_service, |
285 bool trace_device) { | 155 bool trace_device) { |
286 EXPECT_CALL(*outputter, | 156 if (trace_service) { |
287 TraceServiceEnd(source, category, name)); | 157 EXPECT_CALL(*outputter, |
| 158 TraceServiceEnd(source, category, name)); |
| 159 } |
288 | 160 |
289 if (trace_device) { | 161 if (trace_device) { |
290 EXPECT_CALL(*outputter, | 162 EXPECT_CALL(*outputter, |
291 TraceDevice(source, category, name, | 163 TraceDevice(source, category, name, |
292 expect_start_time, expect_end_time)) | 164 expect_start_time, expect_end_time)) |
293 .Times(Exactly(1)); | 165 .Times(Exactly(1)); |
294 } else { | 166 } else { |
295 EXPECT_CALL(*outputter, TraceDevice(source, category, name, | 167 EXPECT_CALL(*outputter, TraceDevice(source, category, name, |
296 expect_start_time, expect_end_time)) | 168 expect_start_time, expect_end_time)) |
297 .Times(Exactly(0)); | 169 .Times(Exactly(0)); |
298 } | 170 } |
299 } | 171 } |
300 | 172 |
301 void ExpectOutputterMocks(MockOutputter* outputter, | 173 void ExpectOutputterMocks(MockOutputter* outputter, |
| 174 bool tracing_service, |
302 bool tracing_device, | 175 bool tracing_device, |
303 GpuTracerSource source, | 176 GpuTracerSource source, |
304 const std::string& category, | 177 const std::string& category, |
305 const std::string& name, int64 expect_start_time, | 178 const std::string& name, int64 expect_start_time, |
306 int64 expect_end_time) { | 179 int64 expect_end_time) { |
307 ExpectOutputterBeginMocks(outputter, source, category, name); | 180 if (tracing_service) |
308 bool valid_timer = tracing_device && | 181 ExpectOutputterBeginMocks(outputter, source, category, name); |
309 gpu_timing_client_->IsAvailable() && | 182 const bool valid_timer = tracing_device && |
310 gpu_timing_client_->IsTimerOffsetAvailable(); | 183 gpu_timing_client_->IsAvailable() && |
| 184 GetTimerType() != gfx::GPUTiming::kTimerTypeEXT; |
311 ExpectOutputterEndMocks(outputter, source, category, name, | 185 ExpectOutputterEndMocks(outputter, source, category, name, |
312 expect_start_time, expect_end_time, valid_timer); | 186 expect_start_time, expect_end_time, |
| 187 tracing_service, valid_timer); |
313 } | 188 } |
314 | 189 |
315 void ExpectTracerOffsetQueryMocks() { | 190 void ExpectTracerOffsetQueryMocks() { |
316 if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) { | 191 if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) { |
317 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) | 192 gl_fake_queries_.ExpectNoOffsetCalculationQuery(*gl_); |
318 .Times(Exactly(0)); | |
319 } else { | 193 } else { |
320 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull())) | 194 gl_fake_queries_.ExpectOffsetCalculationQuery(*gl_); |
321 .Times(AtMost(1)) | |
322 .WillRepeatedly( | |
323 Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v)); | |
324 } | 195 } |
325 } | 196 } |
326 | 197 |
327 gfx::GPUTiming::TimerType GetTimerType() { return test_timer_type_; } | 198 gfx::GPUTiming::TimerType GetTimerType() { return test_timer_type_; } |
328 | 199 |
329 gfx::GPUTiming::TimerType test_timer_type_; | 200 gfx::GPUTiming::TimerType test_timer_type_; |
330 GlFakeQueries gl_fake_queries_; | 201 gfx::GPUTimingFake gl_fake_queries_; |
331 | 202 |
332 scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_; | 203 scoped_refptr<gfx::GPUTimingClient> gpu_timing_client_; |
333 scoped_refptr<MockOutputter> outputter_ref_; | 204 scoped_refptr<MockOutputter> outputter_ref_; |
334 }; | 205 }; |
335 | 206 |
336 // Test GPUTrace calls all the correct gl calls. | 207 // Test GPUTrace calls all the correct gl calls. |
337 class BaseGpuTraceTest : public BaseGpuTest { | 208 class BaseGpuTraceTest : public BaseGpuTest { |
338 public: | 209 public: |
339 explicit BaseGpuTraceTest(gfx::GPUTiming::TimerType test_timer_type) | 210 explicit BaseGpuTraceTest(gfx::GPUTiming::TimerType test_timer_type) |
340 : BaseGpuTest(test_timer_type) {} | 211 : BaseGpuTest(test_timer_type) {} |
341 | 212 |
342 void DoTraceTest(bool tracing_service, bool tracing_device) { | 213 void DoTraceTest(bool tracing_service, bool tracing_device) { |
343 // Expected results | 214 // Expected results |
344 const GpuTracerSource tracer_source = kTraceGroupMarker; | 215 const GpuTracerSource tracer_source = kTraceGroupMarker; |
345 const std::string category_name("trace_category"); | 216 const std::string category_name("trace_category"); |
346 const std::string trace_name("trace_test"); | 217 const std::string trace_name("trace_test"); |
347 const int64 offset_time = 3231; | 218 const int64 offset_time = 3231; |
348 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 219 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
349 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 220 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
350 const int64 expect_start_time = | 221 const int64 expect_start_time = |
351 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 222 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
352 offset_time; | 223 offset_time; |
353 const int64 expect_end_time = | 224 const int64 expect_end_time = |
354 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; | 225 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; |
355 | 226 |
356 if (tracing_service) | 227 ExpectOutputterMocks(outputter_ref_.get(), tracing_service, tracing_device, |
357 ExpectOutputterMocks(outputter_ref_.get(), tracing_device, tracer_source, | 228 tracer_source, category_name, trace_name, |
358 category_name, trace_name, | 229 expect_start_time, expect_end_time); |
359 expect_start_time, expect_end_time); | |
360 | 230 |
361 if (tracing_device) | 231 if (tracing_device) |
362 ExpectTraceQueryMocks(); | 232 ExpectTraceQueryMocks(); |
363 | 233 |
364 scoped_refptr<GPUTrace> trace = new GPUTrace( | 234 scoped_refptr<GPUTrace> trace = new GPUTrace( |
365 outputter_ref_, gpu_timing_client_.get(), tracer_source, | 235 outputter_ref_, gpu_timing_client_.get(), tracer_source, |
366 category_name, trace_name, tracing_service, tracing_device); | 236 category_name, trace_name, tracing_service, tracing_device); |
367 | 237 |
368 gl_fake_queries_.SetCurrentGLTime(start_timestamp); | 238 gl_fake_queries_.SetCurrentGLTime(start_timestamp); |
369 g_fakeCPUTime = expect_start_time; | 239 g_fakeCPUTime = expect_start_time; |
370 trace->Start(); | 240 trace->Start(); |
371 | 241 |
372 // Shouldn't be available before End() call | 242 // Shouldn't be available before End() call |
373 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 243 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
374 g_fakeCPUTime = expect_end_time; | 244 g_fakeCPUTime = expect_end_time; |
375 if (tracing_device) | 245 if (tracing_device) |
376 EXPECT_FALSE(trace->IsAvailable()); | 246 EXPECT_FALSE(trace->IsAvailable()); |
377 | 247 |
378 trace->End(); | 248 trace->End(); |
379 | 249 |
380 // Shouldn't be available until the queries complete | 250 // Shouldn't be available until the queries complete |
381 gl_fake_queries_.SetCurrentGLTime(end_timestamp - | 251 gl_fake_queries_.SetCurrentGLTime(end_timestamp - |
382 base::Time::kNanosecondsPerMicrosecond); | 252 base::Time::kNanosecondsPerMicrosecond); |
| 253 g_fakeCPUTime = expect_end_time - 1; |
383 if (tracing_device) | 254 if (tracing_device) |
384 EXPECT_FALSE(trace->IsAvailable()); | 255 EXPECT_FALSE(trace->IsAvailable()); |
385 | 256 |
386 // Now it should be available | 257 // Now it should be available |
387 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 258 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
| 259 g_fakeCPUTime = expect_end_time; |
388 EXPECT_TRUE(trace->IsAvailable()); | 260 EXPECT_TRUE(trace->IsAvailable()); |
389 | 261 |
390 // Proces should output expected Trace results to MockOutputter | 262 // Proces should output expected Trace results to MockOutputter |
391 trace->Process(); | 263 trace->Process(); |
392 | 264 |
393 // Destroy trace after we are done. | 265 // Destroy trace after we are done. |
394 trace->Destroy(true); | 266 trace->Destroy(true); |
395 | 267 |
396 outputter_ref_ = NULL; | 268 outputter_ref_ = NULL; |
397 } | 269 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 tracer.SetOutputter(outputter_ref_); | 329 tracer.SetOutputter(outputter_ref_); |
458 | 330 |
459 ASSERT_TRUE(tracer.BeginDecoding()); | 331 ASSERT_TRUE(tracer.BeginDecoding()); |
460 ASSERT_TRUE(tracer.EndDecoding()); | 332 ASSERT_TRUE(tracer.EndDecoding()); |
461 | 333 |
462 outputter_ref_ = NULL; | 334 outputter_ref_ = NULL; |
463 } | 335 } |
464 | 336 |
465 void DoTracerMarkersTest() { | 337 void DoTracerMarkersTest() { |
466 ExpectTracerOffsetQueryMocks(); | 338 ExpectTracerOffsetQueryMocks(); |
467 | 339 gl_fake_queries_.ExpectGetErrorCalls(*gl_); |
468 EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0)) | |
469 .WillRepeatedly( | |
470 Invoke(&gl_fake_queries_, &GlFakeQueries::GetError)); | |
471 | 340 |
472 const std::string category_name("trace_category"); | 341 const std::string category_name("trace_category"); |
473 const std::string trace_name("trace_test"); | 342 const std::string trace_name("trace_test"); |
474 const int64 offset_time = 3231; | 343 const int64 offset_time = 3231; |
475 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 344 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
476 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 345 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
477 const int64 expect_start_time = | 346 const int64 expect_start_time = |
478 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 347 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
479 offset_time; | 348 offset_time; |
480 const int64 expect_end_time = | 349 const int64 expect_end_time = |
(...skipping 24 matching lines...) Expand all Loading... |
505 // Each trace name should be different to differentiate. | 374 // Each trace name should be different to differentiate. |
506 const char num_char = static_cast<char>('0' + i); | 375 const char num_char = static_cast<char>('0' + i); |
507 std::string source_category = category_name + num_char; | 376 std::string source_category = category_name + num_char; |
508 std::string source_trace_name = trace_name + num_char; | 377 std::string source_trace_name = trace_name + num_char; |
509 | 378 |
510 const GpuTracerSource source = static_cast<GpuTracerSource>(i); | 379 const GpuTracerSource source = static_cast<GpuTracerSource>(i); |
511 ExpectOutputterBeginMocks(outputter_ref_.get(), source, | 380 ExpectOutputterBeginMocks(outputter_ref_.get(), source, |
512 source_category, source_trace_name); | 381 source_category, source_trace_name); |
513 ASSERT_TRUE(tracer.Begin(source_category, source_trace_name, source)); | 382 ASSERT_TRUE(tracer.Begin(source_category, source_trace_name, source)); |
514 } | 383 } |
515 | |
516 for (int i = 0; i < NUM_TRACER_SOURCES; ++i) { | 384 for (int i = 0; i < NUM_TRACER_SOURCES; ++i) { |
517 // Set times so each source has a different time. | 385 // Set times so each source has a different time. |
518 gl_fake_queries_.SetCurrentGLTime( | 386 gl_fake_queries_.SetCurrentGLTime( |
519 end_timestamp + | 387 end_timestamp + |
520 (i * base::Time::kNanosecondsPerMicrosecond)); | 388 (i * base::Time::kNanosecondsPerMicrosecond)); |
521 g_fakeCPUTime = expect_end_time + i; | 389 g_fakeCPUTime = expect_end_time + i; |
522 | 390 |
523 // Each trace name should be different to differentiate. | 391 // Each trace name should be different to differentiate. |
524 const char num_char = static_cast<char>('0' + i); | 392 const char num_char = static_cast<char>('0' + i); |
525 std::string source_category = category_name + num_char; | 393 std::string source_category = category_name + num_char; |
526 std::string source_trace_name = trace_name + num_char; | 394 std::string source_trace_name = trace_name + num_char; |
527 | 395 |
528 bool valid_timer = gpu_timing_client_->IsAvailable() && | 396 const bool valid_timer = gpu_timing_client_->IsAvailable() && |
529 gpu_timing_client_->IsTimerOffsetAvailable(); | 397 GetTimerType() != gfx::GPUTiming::kTimerTypeEXT; |
530 | 398 |
531 const GpuTracerSource source = static_cast<GpuTracerSource>(i); | 399 const GpuTracerSource source = static_cast<GpuTracerSource>(i); |
532 ExpectOutputterEndMocks(outputter_ref_.get(), source, source_category, | 400 ExpectOutputterEndMocks(outputter_ref_.get(), source, source_category, |
533 source_trace_name, expect_start_time + i, | 401 source_trace_name, expect_start_time + i, |
534 expect_end_time + i, valid_timer); | 402 expect_end_time + i, true, valid_timer); |
535 | |
536 // Check if the current category/name are correct for this source. | 403 // Check if the current category/name are correct for this source. |
537 ASSERT_EQ(source_category, tracer.CurrentCategory(source)); | 404 ASSERT_EQ(source_category, tracer.CurrentCategory(source)); |
538 ASSERT_EQ(source_trace_name, tracer.CurrentName(source)); | 405 ASSERT_EQ(source_trace_name, tracer.CurrentName(source)); |
539 | 406 |
540 ASSERT_TRUE(tracer.End(source)); | 407 ASSERT_TRUE(tracer.End(source)); |
541 } | 408 } |
542 | |
543 ASSERT_TRUE(tracer.EndDecoding()); | 409 ASSERT_TRUE(tracer.EndDecoding()); |
544 | |
545 outputter_ref_ = NULL; | 410 outputter_ref_ = NULL; |
546 } | 411 } |
547 | 412 |
548 void DoDisjointTest() { | 413 void DoDisjointTest() { |
549 // Cause a disjoint in a middle of a trace and expect no output calls. | 414 // Cause a disjoint in a middle of a trace and expect no output calls. |
550 ExpectTracerOffsetQueryMocks(); | 415 ExpectTracerOffsetQueryMocks(); |
551 | 416 gl_fake_queries_.ExpectGetErrorCalls(*gl_); |
552 EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0)) | |
553 .WillRepeatedly( | |
554 Invoke(&gl_fake_queries_, &GlFakeQueries::GetError)); | |
555 | 417 |
556 const GpuTracerSource tracer_source = kTraceGroupMarker; | 418 const GpuTracerSource tracer_source = kTraceGroupMarker; |
557 const std::string category_name("trace_category"); | 419 const std::string category_name("trace_category"); |
558 const std::string trace_name("trace_test"); | 420 const std::string trace_name("trace_test"); |
559 const GpuTracerSource source = static_cast<GpuTracerSource>(0); | 421 const GpuTracerSource source = static_cast<GpuTracerSource>(0); |
560 const int64 offset_time = 3231; | 422 const int64 offset_time = 3231; |
561 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; | 423 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; |
562 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; | 424 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; |
563 const int64 expect_start_time = | 425 const int64 expect_start_time = |
564 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + | 426 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + |
(...skipping 17 matching lines...) Expand all Loading... |
582 | 444 |
583 ExpectOutputterBeginMocks(outputter_ref_.get(), tracer_source, | 445 ExpectOutputterBeginMocks(outputter_ref_.get(), tracer_source, |
584 category_name, trace_name); | 446 category_name, trace_name); |
585 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); | 447 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source)); |
586 | 448 |
587 gl_fake_queries_.SetCurrentGLTime(end_timestamp); | 449 gl_fake_queries_.SetCurrentGLTime(end_timestamp); |
588 g_fakeCPUTime = expect_end_time; | 450 g_fakeCPUTime = expect_end_time; |
589 | 451 |
590 // Create GPUTimingClient to make sure disjoint value is correct. This | 452 // Create GPUTimingClient to make sure disjoint value is correct. This |
591 // should not interfere with the tracer's disjoint value. | 453 // should not interfere with the tracer's disjoint value. |
592 scoped_refptr<gfx::GPUTimingClient> disjoint_client = | 454 scoped_refptr<gfx::GPUTimingClient> disjoint_client = |
593 GetGLContext()->CreateGPUTimingClient(); | 455 GetGLContext()->CreateGPUTimingClient(); |
594 | 456 |
595 // We assert here based on the disjoint_client because if disjoints are not | 457 // We assert here based on the disjoint_client because if disjoints are not |
596 // working properly there is no point testing the tracer output. | 458 // working properly there is no point testing the tracer output. |
597 ASSERT_FALSE(disjoint_client->CheckAndResetTimerErrors()); | 459 ASSERT_FALSE(disjoint_client->CheckAndResetTimerErrors()); |
598 gl_fake_queries_.SetDisjoint(); | 460 gl_fake_queries_.SetDisjoint(); |
599 ASSERT_TRUE(disjoint_client->CheckAndResetTimerErrors()); | 461 ASSERT_TRUE(disjoint_client->CheckAndResetTimerErrors()); |
600 | 462 |
601 ExpectOutputterEndMocks(outputter_ref_.get(), tracer_source, | 463 ExpectOutputterEndMocks(outputter_ref_.get(), tracer_source, |
602 category_name, trace_name, | 464 category_name, trace_name, |
603 expect_start_time, expect_end_time, false); | 465 expect_start_time, expect_end_time, true, false); |
604 | 466 |
605 ASSERT_TRUE(tracer.End(source)); | 467 ASSERT_TRUE(tracer.End(source)); |
606 ASSERT_TRUE(tracer.EndDecoding()); | 468 ASSERT_TRUE(tracer.EndDecoding()); |
607 | 469 |
608 outputter_ref_ = NULL; | 470 outputter_ref_ = NULL; |
609 } | 471 } |
610 }; | 472 }; |
611 | 473 |
612 class InvalidTimerTracerTest : public BaseGpuTracerTest { | 474 class InvalidTimerTracerTest : public BaseGpuTracerTest { |
613 public: | 475 public: |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 scoped_refptr<gfx::GPUTimingClient> client3 = | 604 scoped_refptr<gfx::GPUTimingClient> client3 = |
743 GetGLContext()->CreateGPUTimingClient(); | 605 GetGLContext()->CreateGPUTimingClient(); |
744 ASSERT_TRUE(client1->CheckAndResetTimerErrors()); | 606 ASSERT_TRUE(client1->CheckAndResetTimerErrors()); |
745 ASSERT_TRUE(client2->CheckAndResetTimerErrors()); | 607 ASSERT_TRUE(client2->CheckAndResetTimerErrors()); |
746 ASSERT_FALSE(client3->CheckAndResetTimerErrors()); | 608 ASSERT_FALSE(client3->CheckAndResetTimerErrors()); |
747 } | 609 } |
748 | 610 |
749 } // namespace | 611 } // namespace |
750 } // namespace gles2 | 612 } // namespace gles2 |
751 } // namespace gpu | 613 } // namespace gpu |
OLD | NEW |