Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(655)

Side by Side Diff: gpu/command_buffer/service/gpu_tracer_unittest.cc

Issue 794673007: Added unit tests for the GPU Tracer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed redundant virtual Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/gpu_tracer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
8 #include "gpu/command_buffer/service/gpu_service_test.h" 9 #include "gpu/command_buffer/service/gpu_service_test.h"
9 #include "gpu/command_buffer/service/gpu_tracer.h" 10 #include "gpu/command_buffer/service/gpu_tracer.h"
10 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/gl/gl_context_stub.h"
11 #include "ui/gl/gl_mock.h" 13 #include "ui/gl/gl_mock.h"
14 #include "ui/gl/gl_surface_stub.h"
12 15
13 namespace gpu { 16 namespace gpu {
14 namespace gles2 { 17 namespace gles2 {
15 18
19 using ::testing::_;
20 using ::testing::AtLeast;
21 using ::testing::Exactly;
22 using ::testing::Invoke;
23 using ::testing::NotNull;
16 using ::testing::Return; 24 using ::testing::Return;
17 using ::testing::NotNull; 25
18 using ::testing::AtLeast; 26 class FakeCPUTime : public CPUTime {
19 using ::testing::Invoke; 27 public:
20 using ::testing::_; 28 FakeCPUTime()
29 : current_cpu_time_(0) {
30 }
31
32 int64 GetCurrentTime() override {
33 return current_cpu_time_;
34 }
35
36 void SetFakeCPUTime(int64 cpu_time) {
37 current_cpu_time_ = cpu_time;
38 }
39
40 protected:
41 ~FakeCPUTime() override {}
42
43 int64 current_cpu_time_;
44 };
21 45
22 class MockOutputter : public Outputter { 46 class MockOutputter : public Outputter {
23 public: 47 public:
24 MockOutputter() {} 48 MockOutputter() {}
25 MOCK_METHOD4(Trace, 49 MOCK_METHOD4(TraceDevice,
26 void(const std::string& category, const std::string& name, 50 void(const std::string& category, const std::string& name,
27 int64 start_time, int64 end_time)); 51 int64 start_time, int64 end_time));
28 52
53 MOCK_METHOD3(TraceServiceBegin,
54 void(const std::string& category, const std::string& name,
55 void* id));
56
57 MOCK_METHOD3(TraceServiceEnd,
58 void(const std::string& category, const std::string& name,
59 void* id));
60
29 protected: 61 protected:
30 ~MockOutputter() {} 62 ~MockOutputter() {}
31 }; 63 };
32 64
33 class GlFakeQueries { 65 class GlFakeQueries {
34 public: 66 public:
35 GlFakeQueries() {} 67 GlFakeQueries() {}
36 68
37 void Reset() { 69 void Reset() {
38 current_time_ = 0; 70 current_time_ = 0;
39 next_query_id_ = 23; 71 next_query_id_ = 23;
40 alloced_queries_.clear(); 72 alloced_queries_.clear();
41 query_timestamp_.clear(); 73 query_timestamp_.clear();
42 } 74 }
43 75
44 void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } 76 void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; }
77 void SetDisjoint() { disjointed_ = true; }
45 78
46 void GenQueriesARB(GLsizei n, GLuint* ids) { 79 void GenQueriesARB(GLsizei n, GLuint* ids) {
47 for (GLsizei i = 0; i < n; i++) { 80 for (GLsizei i = 0; i < n; i++) {
48 ids[i] = next_query_id_++; 81 ids[i] = next_query_id_++;
49 alloced_queries_.insert(ids[i]); 82 alloced_queries_.insert(ids[i]);
50 } 83 }
51 } 84 }
52 85
53 void DeleteQueriesARB(GLsizei n, const GLuint* ids) { 86 void DeleteQueriesARB(GLsizei n, const GLuint* ids) {
54 for (GLsizei i = 0; i < n; i++) { 87 for (GLsizei i = 0; i < n; i++) {
55 alloced_queries_.erase(ids[i]); 88 alloced_queries_.erase(ids[i]);
56 query_timestamp_.erase(ids[i]); 89 query_timestamp_.erase(ids[i]);
57 } 90 }
58 } 91 }
59 92
60 void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { 93 void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) {
61 switch (pname) { 94 switch (pname) {
62 case GL_QUERY_RESULT_AVAILABLE: { 95 case GL_QUERY_RESULT_AVAILABLE: {
63 std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); 96 std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id);
64 if (it != query_timestamp_.end() && it->second <= current_time_) 97 if (it != query_timestamp_.end() && it->second <= current_time_)
65 *params = 1; 98 *params = 1;
66 else 99 else
67 *params = 0; 100 *params = 0;
68 break; 101 break;
69 } 102 }
70 default: 103 default:
71 ASSERT_TRUE(false); 104 FAIL() << "Invalid variable passed to GetQueryObjectiv: " << pname;
72 } 105 }
73 } 106 }
74 107
75 void QueryCounter(GLuint id, GLenum target) { 108 void QueryCounter(GLuint id, GLenum target) {
76 switch (target) { 109 switch (target) {
77 case GL_TIMESTAMP: 110 case GL_TIMESTAMP:
78 ASSERT_TRUE(alloced_queries_.find(id) != alloced_queries_.end()); 111 ASSERT_TRUE(alloced_queries_.find(id) != alloced_queries_.end());
79 query_timestamp_[id] = current_time_; 112 query_timestamp_[id] = current_time_;
80 break; 113 break;
81 default: 114 default:
82 ASSERT_TRUE(false); 115 FAIL() << "Invalid variable passed to QueryCounter: " << target;
83 } 116 }
84 } 117 }
85 118
119 void GetInteger64v(GLenum pname, GLint64 * data) {
120 switch (pname) {
121 case GL_TIMESTAMP:
122 *data = current_time_;
123 break;
124 default:
125 FAIL() << "Invalid variable passed to GetInteger64v: " << pname;
126 }
127 }
128
86 void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { 129 void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) {
87 switch (pname) { 130 switch (pname) {
88 case GL_QUERY_RESULT: 131 case GL_QUERY_RESULT:
89 ASSERT_TRUE(query_timestamp_.find(id) != query_timestamp_.end()); 132 ASSERT_TRUE(query_timestamp_.find(id) != query_timestamp_.end());
90 *params = query_timestamp_.find(id)->second; 133 *params = query_timestamp_.find(id)->second;
91 break; 134 break;
92 default: 135 default:
93 ASSERT_TRUE(false); 136 FAIL() << "Invalid variable passed to GetQueryObjectui64v: " << pname;
94 } 137 }
138 }
139
140 void GetIntegerv(GLenum pname, GLint* params) {
141 switch (pname) {
142 case GL_GPU_DISJOINT_EXT:
143 *params = static_cast<GLint>(disjointed_);
144 disjointed_ = false;
145 break;
146 default:
147 FAIL() << "Invalid variable passed to GetIntegerv: " << pname;
148 }
149 }
150
151 void Finish() {
152 }
153
154 GLenum GetError() {
155 return GL_NO_ERROR;
95 } 156 }
96 157
97 protected: 158 protected:
159 bool disjointed_;
98 GLint64 current_time_; 160 GLint64 current_time_;
99 GLuint next_query_id_; 161 GLuint next_query_id_;
100 std::set<GLuint> alloced_queries_; 162 std::set<GLuint> alloced_queries_;
101 std::map<GLuint, GLint64> query_timestamp_; 163 std::map<GLuint, GLint64> query_timestamp_;
102 }; 164 };
103 165
104 class BaseGpuTracerTest : public GpuServiceTest { 166 class GPUTracerTester : public GPUTracer {
105 public: 167 public:
106 BaseGpuTracerTest() {} 168 GPUTracerTester(GpuTracerType tracer_type, gles2::GLES2Decoder* decoder)
107 169 : GPUTracer(decoder),
108 /////////////////////////////////////////////////////////////////////////// 170 tracing_enabled_(0),
171 test_tracer_type_(tracer_type) {
172 // Force tracing to be dependent on our mock variable here.
173 gpu_trace_srv_category = &tracing_enabled_;
174 gpu_trace_dev_category = &tracing_enabled_;
175 }
176
177 ~GPUTracerTester() override {}
178
179 void SetTracingEnabled(bool enabled) {
180 tracing_enabled_ = enabled ? 1 : 0;
181 }
182
183 void SetOutputter(scoped_refptr<Outputter> outputter) {
184 set_outputter_ = outputter;
185 }
186
187 void SetCPUTime(scoped_refptr<CPUTime> cputime) {
188 set_cputime_ = cputime;
189 }
190
191 protected:
192 scoped_refptr<Outputter> CreateOutputter(const std::string& name) override {
193 if (set_outputter_.get()) {
194 return set_outputter_;
195 }
196 return new MockOutputter();
197 }
198
199 scoped_refptr<CPUTime> CreateCPUTime() override {
200 if (set_cputime_.get()) {
201 return set_cputime_;
202 }
203 return new FakeCPUTime();
204 }
205
206 GpuTracerType DetermineTracerType() override {
207 return test_tracer_type_;
208 }
209
210 void PostTask() override {
211 // Process synchronously.
212 Process();
213 }
214
215 unsigned char tracing_enabled_;
216 GpuTracerType test_tracer_type_;
217
218 scoped_refptr<Outputter> set_outputter_;
219 scoped_refptr<CPUTime> set_cputime_;
220 };
221
222 class BaseGpuTest : public GpuServiceTest {
223 public:
224 BaseGpuTest(GpuTracerType test_tracer_type)
225 : test_tracer_type_(test_tracer_type) {
226 }
227
228 protected:
229 void SetUp() override {
230 GpuServiceTest::SetUp();
231 gl_fake_queries_.Reset();
232 gl_surface_ = new gfx::GLSurfaceStub();
233 gl_context_ = new gfx::GLContextStub();
234 gl_context_->MakeCurrent(gl_surface_.get());
235
236 outputter_ref_ = new MockOutputter();
237 cpu_time_ref_ = new FakeCPUTime;
238 }
239
240 void TearDown() override {
241 outputter_ref_ = NULL;
242 cpu_time_ref_ = NULL;
243
244 gl_context_->ReleaseCurrent(gl_surface_.get());
245 gl_context_ = NULL;
246 gl_surface_ = NULL;
247
248 gl_.reset();
249 gl_fake_queries_.Reset();
250 GpuServiceTest::TearDown();
251 }
252
253 void ExpectTraceQueryMocks() {
254 if (GetTracerType() != kTracerTypeInvalid) {
255 // Delegate query APIs used by GPUTrace to a GlFakeQueries
256 EXPECT_CALL(*gl_, GenQueriesARB(2, NotNull())).Times(AtLeast(1))
257 .WillRepeatedly(
258 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
259
260 EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE,
261 NotNull()))
262 .WillRepeatedly(
263 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv));
264
265 if (GetTracerType() == kTracerTypeDisjointTimer) {
266 EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _))
267 .WillRepeatedly(
268 Invoke(&gl_fake_queries_, &GlFakeQueries::GetInteger64v));
269 }
270
271 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(AtLeast(2))
272 .WillRepeatedly(
273 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter));
274
275 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
276 .WillRepeatedly(
277 Invoke(&gl_fake_queries_,
278 &GlFakeQueries::GetQueryObjectui64v));
279
280 EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull())).Times(AtLeast(1))
281 .WillRepeatedly(
282 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
283 }
284 }
285
286 void ExpectOutputterBeginMocks(MockOutputter* outputter,
287 const std::string& category,
288 const std::string& name) {
289 EXPECT_CALL(*outputter,
290 TraceServiceBegin(category, name, NotNull()));
291 }
292
293 void ExpectOutputterEndMocks(MockOutputter* outputter,
294 const std::string& category,
295 const std::string& name, int64 expect_start_time,
296 int64 expect_end_time,
297 bool trace_device) {
298 EXPECT_CALL(*outputter,
299 TraceServiceEnd(category, name, NotNull()));
300
301 if (trace_device) {
302 EXPECT_CALL(*outputter,
303 TraceDevice(category, name,
304 expect_start_time, expect_end_time))
305 .Times(Exactly(1));
306 } else {
307 EXPECT_CALL(*outputter, TraceDevice(category, name,
308 expect_start_time, expect_end_time))
309 .Times(Exactly(0));
310 }
311 }
312
313 void ExpectOutputterMocks(MockOutputter* outputter,
314 const std::string& category,
315 const std::string& name, int64 expect_start_time,
316 int64 expect_end_time) {
317 ExpectOutputterBeginMocks(outputter, category, name);
318 ExpectOutputterEndMocks(outputter, category, name,
319 expect_start_time, expect_end_time,
320 GetTracerType() != kTracerTypeInvalid);
321 }
322
323 void ExpectTracerOffsetQueryMocks() {
324 // Disjoint check should only be called by kTracerTypeDisjointTimer type.
325 if (GetTracerType() == kTracerTypeDisjointTimer) {
326 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1))
327 .WillRepeatedly(
328 Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv));
329 } else {
330 EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0));
331 }
332
333 // Timer offset calculation should only happen for the regular timer.
334 if (GetTracerType() != kTracerTypeARBTimer) {
335 EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(Exactly(0));
336 EXPECT_CALL(*gl_, Finish()).Times(Exactly(0));
337 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)).Times(Exactly(0));
338 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
339 .Times(Exactly(0));
340 EXPECT_CALL(*gl_, DeleteQueriesARB(_, NotNull())).Times(Exactly(0));
341 } else {
342 EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(AtLeast(1))
343 .WillRepeatedly(
344 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
345
346 EXPECT_CALL(*gl_, Finish()).Times(AtLeast(2))
347 .WillRepeatedly(
348 Invoke(&gl_fake_queries_, &GlFakeQueries::Finish));
349
350 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP))
351 .Times(AtLeast(1))
352 .WillRepeatedly(
353 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter));
354
355 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull()))
356 .Times(AtLeast(1))
357 .WillRepeatedly(
358 Invoke(&gl_fake_queries_,
359 &GlFakeQueries::GetQueryObjectui64v));
360
361 EXPECT_CALL(*gl_, DeleteQueriesARB(1, NotNull()))
362 .Times(AtLeast(1))
363 .WillRepeatedly(
364 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
365 }
366 }
367
368 GpuTracerType GetTracerType() { return test_tracer_type_; }
369
370 GpuTracerType test_tracer_type_;
371 GlFakeQueries gl_fake_queries_;
372
373 scoped_refptr<MockOutputter> outputter_ref_;
374 scoped_refptr<FakeCPUTime> cpu_time_ref_;
375
376 scoped_refptr<gfx::GLSurface> gl_surface_;
377 scoped_refptr<gfx::GLContext> gl_context_;
378 };
379
380 // Test GPUTrace calls all the correct gl calls.
381 class BaseGpuTraceTest : public BaseGpuTest {
382 public:
383 BaseGpuTraceTest(GpuTracerType test_tracer_type)
384 : BaseGpuTest(test_tracer_type) {
385 }
109 386
110 void DoTraceTest() { 387 void DoTraceTest() {
111 MockOutputter* outputter = new MockOutputter();
112 scoped_refptr<Outputter> outputter_ref = outputter;
113
114 SetupTimerQueryMocks();
115
116 // Expected results 388 // Expected results
117 const std::string category_name("trace_category"); 389 const std::string category_name("trace_category");
118 const std::string trace_name("trace_test"); 390 const std::string trace_name("trace_test");
119 const int64 offset_time = 3231; 391 const int64 offset_time = 3231;
120 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; 392 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
121 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; 393 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond;
122 const int64 expect_start_time = 394 const int64 expect_start_time =
123 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + 395 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) +
124 offset_time; 396 offset_time;
125 const int64 expect_end_time = 397 const int64 expect_end_time =
126 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; 398 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
127 399
128 // Expected Outputter::Trace call 400 ExpectTraceQueryMocks();
129 EXPECT_CALL(*outputter, 401 ExpectOutputterMocks(outputter_ref_.get(), category_name, trace_name,
130 Trace(category_name, trace_name, 402 expect_start_time, expect_end_time);
131 expect_start_time, expect_end_time));
132 403
133 scoped_refptr<GPUTrace> trace = 404 scoped_refptr<GPUTrace> trace =
134 new GPUTrace(outputter_ref, category_name, trace_name, 405 new GPUTrace(outputter_ref_, cpu_time_ref_, category_name, trace_name,
135 offset_time, GetTracerType()); 406 offset_time, GetTracerType());
136 407
137 gl_fake_queries_.SetCurrentGLTime(start_timestamp); 408 gl_fake_queries_.SetCurrentGLTime(start_timestamp);
138 trace->Start(true); 409 trace->Start(true);
139 410
140 // Shouldn't be available before End() call 411 // Shouldn't be available before End() call
141 gl_fake_queries_.SetCurrentGLTime(end_timestamp); 412 gl_fake_queries_.SetCurrentGLTime(end_timestamp);
142 EXPECT_FALSE(trace->IsAvailable()); 413 EXPECT_FALSE(trace->IsAvailable());
143 414
144 trace->End(true); 415 trace->End(true);
145 416
146 // Shouldn't be available until the queries complete 417 // Shouldn't be available until the queries complete
147 gl_fake_queries_.SetCurrentGLTime(end_timestamp - 418 gl_fake_queries_.SetCurrentGLTime(end_timestamp -
148 base::Time::kNanosecondsPerMicrosecond); 419 base::Time::kNanosecondsPerMicrosecond);
149 EXPECT_FALSE(trace->IsAvailable()); 420 EXPECT_FALSE(trace->IsAvailable());
150 421
151 // Now it should be available 422 // Now it should be available
152 gl_fake_queries_.SetCurrentGLTime(end_timestamp); 423 gl_fake_queries_.SetCurrentGLTime(end_timestamp);
153 EXPECT_TRUE(trace->IsAvailable()); 424 EXPECT_TRUE(trace->IsAvailable());
154 425
155 // Proces should output expected Trace results to MockOutputter 426 // Proces should output expected Trace results to MockOutputter
156 trace->Process(); 427 trace->Process();
157 } 428
158 429 outputter_ref_ = NULL;
159 protected: 430 cpu_time_ref_ = NULL;
160 void SetUp() override { 431 }
161 GpuServiceTest::SetUp(); 432 };
162 gl_fake_queries_.Reset(); 433
163 } 434 class GpuARBTimerTraceTest : public BaseGpuTraceTest {
164 435 public:
165 void TearDown() override { 436 GpuARBTimerTraceTest()
166 gl_.reset(); 437 : BaseGpuTraceTest(kTracerTypeARBTimer) {
167 gl_fake_queries_.Reset(); 438 }
168 GpuServiceTest::TearDown(); 439 };
169 } 440
170 441 class GpuDisjointTimerTraceTest : public BaseGpuTraceTest {
171 virtual void SetupTimerQueryMocks() { 442 public:
172 // Delegate query APIs used by GPUTrace to a GlFakeQueries 443 GpuDisjointTimerTraceTest()
173 EXPECT_CALL(*gl_, GenQueriesARB(_, NotNull())).Times(AtLeast(1)).WillOnce( 444 : BaseGpuTraceTest(kTracerTypeDisjointTimer) {
174 Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB)); 445 }
175 446 };
176 EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, NotNull())) 447
177 .Times(AtLeast(2)) 448 TEST_F(GpuARBTimerTraceTest, ARBTimerTraceTest) {
178 .WillRepeatedly( 449 DoTraceTest();
179 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); 450 }
180 451
181 EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)) 452 TEST_F(GpuDisjointTimerTraceTest, DisjointTimerTraceTest) {
182 .Times(AtLeast(2)) 453 DoTraceTest();
183 .WillRepeatedly( 454 }
184 Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); 455
185 456 // Test GPUTracer calls all the correct gl calls.
186 EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) 457 class BaseGpuTracerTest : public BaseGpuTest {
187 .Times(AtLeast(2)) 458 public:
188 .WillRepeatedly( 459 BaseGpuTracerTest(GpuTracerType test_tracer_type)
189 Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectui64v)); 460 : BaseGpuTest(test_tracer_type) {
190 461 }
191 EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull())) 462
192 .Times(AtLeast(1)) 463 void DoBasicTracerTest() {
193 .WillRepeatedly( 464 ExpectTracerOffsetQueryMocks();
194 Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB)); 465
195 } 466 MockGLES2Decoder decoder;
196 467 GPUTracerTester tracer(test_tracer_type_, &decoder);
197 virtual GpuTracerType GetTracerType() = 0; 468 tracer.SetTracingEnabled(true);
198 469
199 GlFakeQueries gl_fake_queries_; 470 tracer.SetOutputter(outputter_ref_);
471 tracer.SetCPUTime(cpu_time_ref_);
472
473 ASSERT_TRUE(tracer.BeginDecoding());
474 ASSERT_TRUE(tracer.EndDecoding());
475
476 outputter_ref_ = NULL;
477 cpu_time_ref_ = NULL;
478 }
479
480 void DoTracerMarkersTest() {
481 ExpectTracerOffsetQueryMocks();
482
483 EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0))
484 .WillRepeatedly(
485 Invoke(&gl_fake_queries_, &GlFakeQueries::GetError));
486
487 const std::string category_name("trace_category");
488 const std::string trace_name("trace_test");
489 const int64 offset_time = 3231;
490 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
491 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond;
492 const int64 expect_start_time =
493 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) +
494 offset_time;
495 const int64 expect_end_time =
496 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
497
498 MockGLES2Decoder decoder;
499 GPUTracerTester tracer(test_tracer_type_, &decoder);
500 tracer.SetTracingEnabled(true);
501
502 tracer.SetOutputter(outputter_ref_);
503 tracer.SetCPUTime(cpu_time_ref_);
504
505 gl_fake_queries_.SetCurrentGLTime(start_timestamp);
506 cpu_time_ref_->SetFakeCPUTime(expect_start_time);
507
508 ASSERT_TRUE(tracer.BeginDecoding());
509
510 ExpectTraceQueryMocks();
511
512 // This will test multiple marker sources which overlap one another.
513 for (int i = 0; i < NUM_TRACER_SOURCES; ++i) {
514 // Set times so each source has a different time.
515 gl_fake_queries_.SetCurrentGLTime(
516 start_timestamp +
517 (i * base::Time::kNanosecondsPerMicrosecond));
518 cpu_time_ref_->SetFakeCPUTime(expect_start_time + i);
519
520 // Each trace name should be different to differentiate.
521 const char num_char = static_cast<char>('0' + i);
522 std::string source_category = category_name + num_char;
523 std::string source_trace_name = trace_name + num_char;
524
525 ExpectOutputterBeginMocks(outputter_ref_.get(),
526 source_category, source_trace_name);
527
528 const GpuTracerSource source = static_cast<GpuTracerSource>(i);
529 ASSERT_TRUE(tracer.Begin(source_category, source_trace_name, source));
530
531 ASSERT_EQ(source_category, tracer.CurrentCategory());
532 ASSERT_EQ(source_trace_name, tracer.CurrentName());
533 }
534
535 for (int i = 0; i < NUM_TRACER_SOURCES; ++i) {
536 // Set times so each source has a different time.
537 gl_fake_queries_.SetCurrentGLTime(
538 end_timestamp +
539 (i * base::Time::kNanosecondsPerMicrosecond));
540 cpu_time_ref_->SetFakeCPUTime(expect_end_time + i);
541
542 // Each trace name should be different to differentiate.
543 const char num_char = static_cast<char>('0' + i);
544 std::string source_category = category_name + num_char;
545 std::string source_trace_name = trace_name + num_char;
546
547 ExpectOutputterEndMocks(outputter_ref_.get(), source_category,
548 source_trace_name,
549 expect_start_time + i, expect_end_time + i,
550 GetTracerType() != kTracerTypeInvalid);
551
552 const GpuTracerSource source = static_cast<GpuTracerSource>(i);
553 ASSERT_TRUE(tracer.End(source));
554 }
555
556 ASSERT_TRUE(tracer.EndDecoding());
557
558 outputter_ref_ = NULL;
559 cpu_time_ref_ = NULL;
560 }
561
562 void DoDisjointTest() {
563 // Cause a disjoint in a middle of a trace and expect no output calls.
564 ExpectTracerOffsetQueryMocks();
565
566 EXPECT_CALL(*gl_, GetError()).Times(AtLeast(0))
567 .WillRepeatedly(
568 Invoke(&gl_fake_queries_, &GlFakeQueries::GetError));
569
570 const std::string category_name("trace_category");
571 const std::string trace_name("trace_test");
572 const GpuTracerSource source = static_cast<GpuTracerSource>(0);
573 const int64 offset_time = 3231;
574 const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
575 const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond;
576 const int64 expect_start_time =
577 (start_timestamp / base::Time::kNanosecondsPerMicrosecond) +
578 offset_time;
579 const int64 expect_end_time =
580 (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time;
581
582 MockGLES2Decoder decoder;
583 GPUTracerTester tracer(test_tracer_type_, &decoder);
584 tracer.SetTracingEnabled(true);
585
586 tracer.SetOutputter(outputter_ref_);
587 tracer.SetCPUTime(cpu_time_ref_);
588
589 gl_fake_queries_.SetCurrentGLTime(start_timestamp);
590 cpu_time_ref_->SetFakeCPUTime(expect_start_time);
591
592 ASSERT_TRUE(tracer.BeginDecoding());
593
594 ExpectTraceQueryMocks();
595
596 ExpectOutputterBeginMocks(outputter_ref_.get(),
597 category_name, trace_name);
598 ASSERT_TRUE(tracer.Begin(category_name, trace_name, source));
599
600 gl_fake_queries_.SetCurrentGLTime(end_timestamp);
601 cpu_time_ref_->SetFakeCPUTime(expect_end_time);
602 gl_fake_queries_.SetDisjoint();
603
604 ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name,
605 expect_start_time, expect_end_time, false);
606
607 ASSERT_TRUE(tracer.End(source));
608 ASSERT_TRUE(tracer.EndDecoding());
609
610 outputter_ref_ = NULL;
611 cpu_time_ref_ = NULL;
612 }
613 };
614
615 class InvalidTimerTracerTest : public BaseGpuTracerTest {
616 public:
617 InvalidTimerTracerTest()
618 : BaseGpuTracerTest(kTracerTypeInvalid) {
619 }
200 }; 620 };
201 621
202 class GpuARBTimerTracerTest : public BaseGpuTracerTest { 622 class GpuARBTimerTracerTest : public BaseGpuTracerTest {
203 protected: 623 public:
204 GpuTracerType GetTracerType() override { return kTracerTypeARBTimer; } 624 GpuARBTimerTracerTest()
625 : BaseGpuTracerTest(kTracerTypeARBTimer) {
626 }
205 }; 627 };
206 628
207 class GpuDisjointTimerTracerTest : public BaseGpuTracerTest { 629 class GpuDisjointTimerTracerTest : public BaseGpuTracerTest {
208 protected: 630 public:
209 GpuTracerType GetTracerType() override { return kTracerTypeDisjointTimer; } 631 GpuDisjointTimerTracerTest()
210 }; 632 : BaseGpuTracerTest(kTracerTypeDisjointTimer) {
211 633 }
212 TEST_F(GpuARBTimerTracerTest, GPUTrace) { 634 };
213 // Test basic timer query functionality 635
214 { 636 TEST_F(InvalidTimerTracerTest, InvalidTimerBasicTracerTest) {
215 DoTraceTest(); 637 DoBasicTracerTest();
216 } 638 }
217 } 639
218 640 TEST_F(GpuARBTimerTracerTest, ARBTimerBasicTracerTest) {
219 TEST_F(GpuDisjointTimerTracerTest, GPUTrace) { 641 DoBasicTracerTest();
220 // Test basic timer query functionality 642 }
221 { 643
222 DoTraceTest(); 644 TEST_F(GpuDisjointTimerTracerTest, DisjointTimerBasicTracerTest) {
223 } 645 DoBasicTracerTest();
646 }
647
648 TEST_F(InvalidTimerTracerTest, InvalidTimerTracerMarkersTest) {
649 DoTracerMarkersTest();
650 }
651
652 TEST_F(GpuARBTimerTracerTest, ARBTimerBasicTracerMarkersTest) {
653 DoTracerMarkersTest();
654 }
655
656 TEST_F(GpuDisjointTimerTracerTest, DisjointTimerBasicTracerMarkersTest) {
657 DoTracerMarkersTest();
658 }
659
660 TEST_F(GpuDisjointTimerTracerTest, DisjointTimerDisjointTraceTest) {
661 DoDisjointTest();
662 }
663
664 // Test basic functionality of the GPUTracerTester.
665 TEST(GPUTracerTester, IsTracingTest) {
666 MockGLES2Decoder decoder;
667 GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
668 EXPECT_FALSE(tracer_tester.IsTracing());
669 tracer_tester.SetTracingEnabled(true);
670 EXPECT_TRUE(tracer_tester.IsTracing());
671 }
672
673 TEST(GPUTracerTester, DecodeTest) {
674 MockGLES2Decoder decoder;
675 GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
676 ASSERT_TRUE(tracer_tester.BeginDecoding());
677 EXPECT_FALSE(tracer_tester.BeginDecoding());
678 ASSERT_TRUE(tracer_tester.EndDecoding());
679 EXPECT_FALSE(tracer_tester.EndDecoding());
680 }
681
682 TEST(GPUTracerTester, TraceDuringDecodeTest) {
683 MockGLES2Decoder decoder;
684 GPUTracerTester tracer_tester(kTracerTypeInvalid, &decoder);
685 const std::string category_name("trace_category");
686 const std::string trace_name("trace_test");
687
688 EXPECT_FALSE(tracer_tester.Begin(category_name, trace_name,
689 kTraceGroupMarker));
690
691 ASSERT_TRUE(tracer_tester.BeginDecoding());
692 EXPECT_TRUE(tracer_tester.Begin(category_name, trace_name,
693 kTraceGroupMarker));
694 ASSERT_TRUE(tracer_tester.EndDecoding());
224 } 695 }
225 696
226 } // namespace gles2 697 } // namespace gles2
227 } // namespace gpu 698 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gpu_tracer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698