Commit 3dc4fb53 authored by Klaus Weidner's avatar Klaus Weidner Committed by Commit Bot

WebXR: use fence status change time for timing

Using wallclock time for render completion can overestimate GPU usage if
the fence client wait is called on an already-completed fence.

Use the fence status change time instead to get a more accurate
measurement. It's technically best-effort, with fallback to wallclock
time, but in practice seems to be reliably available.

Bug: 1136276
Change-Id: I29c2830220de1dbac053cfeec8e4494f6d2eb42e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2461959
Auto-Submit: Klaus Weidner <klausw@chromium.org>
Commit-Queue: Klaus Weidner <klausw@chromium.org>
Commit-Queue: Piotr Bialecki <bialpio@chromium.org>
Reviewed-by: default avatarPiotr Bialecki <bialpio@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815241}
parent a383d292
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "ui/gl/android/surface_texture.h" #include "ui/gl/android/surface_texture.h"
#include "ui/gl/gl_bindings.h" #include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h" #include "ui/gl/gl_context.h"
#include "ui/gl/gl_fence_android_native_fence_sync.h"
#include "ui/gl/gl_fence_egl.h" #include "ui/gl/gl_fence_egl.h"
#include "ui/gl/gl_image_ahardwarebuffer.h" #include "ui/gl/gl_image_ahardwarebuffer.h"
#include "ui/gl/gl_surface.h" #include "ui/gl/gl_surface.h"
...@@ -529,9 +530,20 @@ void ArCoreGl::GetRenderedFrameStats() { ...@@ -529,9 +530,20 @@ void ArCoreGl::GetRenderedFrameStats() {
DCHECK(webxr_->HaveRenderingFrame()); DCHECK(webxr_->HaveRenderingFrame());
vr::WebXrFrame* frame = webxr_->GetRenderingFrame(); vr::WebXrFrame* frame = webxr_->GetRenderingFrame();
DCHECK(frame->render_completion_fence);
base::TimeTicks completion_time =
static_cast<gl::GLFenceAndroidNativeFenceSync*>(
frame->render_completion_fence.get())
->GetStatusChangeTime();
if (completion_time.is_null()) {
// The fence status change time is best effort and may be unavailable.
// In that case, use wallclock time.
DVLOG(3) << __func__ << ": got null completion time, using wallclock";
completion_time = base::TimeTicks::Now();
}
base::TimeDelta pose_to_submit = frame->time_js_submit - frame->time_pose; base::TimeDelta pose_to_submit = frame->time_js_submit - frame->time_pose;
base::TimeDelta submit_to_swap = base::TimeDelta submit_to_swap = completion_time - frame->time_js_submit;
base::TimeTicks::Now() - frame->time_js_submit;
TRACE_COUNTER2("gpu", "WebXR frame time (ms)", "javascript", TRACE_COUNTER2("gpu", "WebXR frame time (ms)", "javascript",
pose_to_submit.InMilliseconds(), "processing", pose_to_submit.InMilliseconds(), "processing",
submit_to_swap.InMilliseconds()); submit_to_swap.InMilliseconds());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment