| Index: third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| diff --git a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| index 5122c99d42d313daa98f7a7ad95c259908966e61..3201ab4b09aef52ea62219a363d4ac17c5b6a456 100644
|
| --- a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| +++ b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp
|
| @@ -523,7 +523,9 @@ void VRDisplay::submitFrame() {
|
| return;
|
| }
|
|
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::Flush_1");
|
| context_gl_->Flush();
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::Flush_1");
|
|
|
| // Check if the canvas got resized, if yes send a bounds update.
|
| int current_width = rendering_context_->drawingBufferWidth();
|
| @@ -560,8 +562,10 @@ void VRDisplay::submitFrame() {
|
| }
|
| }
|
|
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::GetImage");
|
| RefPtr<Image> image_ref = rendering_context_->GetImage(
|
| kPreferAcceleration, kSnapshotReasonCreateImageBitmap);
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::GetImage");
|
|
|
| // Hardware-accelerated rendering should always be texture backed,
|
| // as implemented by AcceleratedStaticBitmapImage. Ensure this is
|
| @@ -578,7 +582,9 @@ void VRDisplay::submitFrame() {
|
| // image until the mailbox was consumed.
|
| StaticBitmapImage* static_image =
|
| static_cast<StaticBitmapImage*>(image_ref.Get());
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::EnsureMailbox");
|
| static_image->EnsureMailbox();
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::EnsureMailbox");
|
|
|
| if (wait_for_previous_transfer_to_finish) {
|
| // Save a reference to the image to keep it alive until next frame,
|
| @@ -587,9 +593,22 @@ void VRDisplay::submitFrame() {
|
| previous_image_ = std::move(image_ref);
|
| }
|
|
|
| + // Create mailbox and sync token for transfer.
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::GetMailbox");
|
| + auto mailbox = static_image->GetMailbox();
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::GetMailbox");
|
| + // Flush to avoid black screen flashes which appear to be related to
|
| + // "fence sync must be flushed before generating sync token" GL errors.
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::Flush_2");
|
| + context_gl_->Flush();
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::Flush_2");
|
| + auto sync_token = static_image->GetSyncToken();
|
| +
|
| // Wait for the previous render to finish, to avoid losing frames in the
|
| // Android Surface / GLConsumer pair. TODO(klausw): make this tunable?
|
| - // Other devices may have different preferences.
|
| + // Other devices may have different preferences. Do this step as late
|
| + // as possible before SubmitFrame to ensure we can do as much work as
|
| + // possible in parallel with the previous frame's rendering.
|
| {
|
| TRACE_EVENT0("gpu", "waitForPreviousRenderToFinish");
|
| while (pending_previous_frame_render_) {
|
| @@ -602,10 +621,11 @@ void VRDisplay::submitFrame() {
|
|
|
| pending_previous_frame_render_ = true;
|
| pending_submit_frame_ = true;
|
| - display_->SubmitFrame(
|
| - vr_frame_id_,
|
| - gpu::MailboxHolder(static_image->GetMailbox(),
|
| - static_image->GetSyncToken(), GL_TEXTURE_2D));
|
| +
|
| + TRACE_EVENT_BEGIN0("gpu", "VRDisplay::SubmitFrame");
|
| + display_->SubmitFrame(vr_frame_id_,
|
| + gpu::MailboxHolder(mailbox, sync_token, GL_TEXTURE_2D));
|
| + TRACE_EVENT_END0("gpu", "VRDisplay::SubmitFrame");
|
|
|
| // If preserveDrawingBuffer is false, must clear now. Normally this
|
| // happens as part of compositing, but that's not active while
|
|
|