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

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

Issue 586503003: Fixed issue where disjoint timer offsets were incorrectly calculated. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 3 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 | « no previous file | ui/gl/generate_bindings.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/gpu_tracer.h" 5 #include "gpu/command_buffer/service/gpu_tracer.h"
6 6
7 #include <deque> 7 #include <deque>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 } 95 }
96 96
97 void GPUTrace::Start() { 97 void GPUTrace::Start() {
98 TRACE_EVENT_COPY_ASYNC_BEGIN0( 98 TRACE_EVENT_COPY_ASYNC_BEGIN0(
99 TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this); 99 TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this);
100 100
101 switch (tracer_type_) { 101 switch (tracer_type_) {
102 case kTracerTypeInvalid: 102 case kTracerTypeInvalid:
103 break; 103 break;
104 104
105 case kTracerTypeDisjointTimer:
106 // For the disjoint timer, GPU idle time does not seem to increment the
107 // internal counter. We must calculate the offset before any query. The
108 // good news is any device that supports disjoint timer will also support
109 // glGetInteger64v, so we can query it directly unlike the ARBTimer case.
110 // The "offset_" variable will always be 0 during normal use cases, only
111 // under the unit tests will it be set to specific test values.
112 if (offset_ == 0) {
113 GLint64 gl_now = 0;
114 glGetInteger64v(GL_TIMESTAMP, &gl_now);
115 offset_ = base::TimeTicks::NowFromSystemTraceTime().ToInternalValue() -
116 gl_now / base::Time::kNanosecondsPerMicrosecond;
117 }
118 // Intentionally fall through to kTracerTypeARBTimer case.xs
105 case kTracerTypeARBTimer: 119 case kTracerTypeARBTimer:
106 case kTracerTypeDisjointTimer:
107 // GL_TIMESTAMP and GL_TIMESTAMP_EXT both have the same value. 120 // GL_TIMESTAMP and GL_TIMESTAMP_EXT both have the same value.
108 glQueryCounter(queries_[0], GL_TIMESTAMP); 121 glQueryCounter(queries_[0], GL_TIMESTAMP);
109 break; 122 break;
110 } 123 }
111 } 124 }
112 125
113 void GPUTrace::End() { 126 void GPUTrace::End() {
114 end_requested_ = true; 127 end_requested_ = true;
115 switch (tracer_type_) { 128 switch (tracer_type_) {
116 case kTracerTypeInvalid: 129 case kTracerTypeInvalid:
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 } 348 }
336 349
337 // Clear pending traces if there were are any errors 350 // Clear pending traces if there were are any errors
338 GLenum err = glGetError(); 351 GLenum err = glGetError();
339 if (err != GL_NO_ERROR) 352 if (err != GL_NO_ERROR)
340 traces_.clear(); 353 traces_.clear();
341 } 354 }
342 355
343 void GPUTracer::CalculateTimerOffset() { 356 void GPUTracer::CalculateTimerOffset() {
344 if (tracer_type_ != kTracerTypeInvalid) { 357 if (tracer_type_ != kTracerTypeInvalid) {
345 // If GPU device category is off, invalidate timing sync.
346 if (*gpu_trace_dev_category == '\0') { 358 if (*gpu_trace_dev_category == '\0') {
359 // If GPU device category is off, invalidate timing sync.
347 gpu_timing_synced_ = false; 360 gpu_timing_synced_ = false;
348 return; 361 return;
362 } else if (tracer_type_ == kTracerTypeDisjointTimer) {
363 // Disjoint timers offsets should be calculated before every query.
364 gpu_timing_synced_ = true;
365 timer_offset_ = 0;
349 } 366 }
350 367
351 if (gpu_timing_synced_) 368 if (gpu_timing_synced_)
352 return; 369 return;
353 370
354 TRACE_EVENT0("gpu", "GPUTracer::CalculateTimerOffset"); 371 TRACE_EVENT0("gpu", "GPUTracer::CalculateTimerOffset");
355 372
356 // NOTE(vmiura): It would be better to use glGetInteger64v, however 373 // NOTE(vmiura): It would be better to use glGetInteger64v, however
357 // it's not available everywhere. 374 // it's not available everywhere.
358 GLuint64 gl_now = 0; 375 GLuint64 gl_now = 0;
359 GLuint query; 376 GLuint query;
360 GLint disjoint_value = 0;
361 377
362 if (tracer_type_ == kTracerTypeDisjointTimer) { 378 glGenQueriesARB(1, &query);
363 // Clear the disjoint bit before we do any queries.
364 glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
365 }
366 379
367 glFinish(); 380 glFinish();
368 glGenQueriesARB(1, &query);
369 glQueryCounter(query, GL_TIMESTAMP); 381 glQueryCounter(query, GL_TIMESTAMP);
370 glFinish(); 382 glFinish();
371 383
372 glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now); 384 glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now);
373 glDeleteQueriesARB(1, &query); 385 glDeleteQueriesARB(1, &query);
374 386
375 if (tracer_type_ == kTracerTypeDisjointTimer) {
376 glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
377 if (disjoint_value)
378 return;
379 }
380
381 base::TimeTicks system_now = base::TimeTicks::NowFromSystemTraceTime(); 387 base::TimeTicks system_now = base::TimeTicks::NowFromSystemTraceTime();
382 388
383 gl_now /= base::Time::kNanosecondsPerMicrosecond; 389 gl_now /= base::Time::kNanosecondsPerMicrosecond;
384 timer_offset_ = system_now.ToInternalValue() - gl_now; 390 timer_offset_ = system_now.ToInternalValue() - gl_now;
385 gpu_timing_synced_ = true; 391 gpu_timing_synced_ = true;
386 } 392 }
387 } 393 }
388 394
389 void GPUTracer::IssueProcessTask() { 395 void GPUTracer::IssueProcessTask() {
390 if (traces_.empty() || process_posted_) 396 if (traces_.empty() || process_posted_)
391 return; 397 return;
392 398
393 process_posted_ = true; 399 process_posted_ = true;
394 base::MessageLoop::current()->PostDelayedTask( 400 base::MessageLoop::current()->PostDelayedTask(
395 FROM_HERE, 401 FROM_HERE,
396 base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)), 402 base::Bind(&GPUTracer::Process, base::AsWeakPtr(this)),
397 base::TimeDelta::FromMilliseconds(kProcessInterval)); 403 base::TimeDelta::FromMilliseconds(kProcessInterval));
398 } 404 }
399 405
400 } // namespace gles2 406 } // namespace gles2
401 } // namespace gpu 407 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | ui/gl/generate_bindings.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698