Index: chrome/browser/android/vr_shell/vr_shell.cc |
diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc |
index ab3b67ac4529a57e6708f2c6ea1ef9543128f90a..5c1a15db2154610fc4861d439cb3fb031837918c 100644 |
--- a/chrome/browser/android/vr_shell/vr_shell.cc |
+++ b/chrome/browser/android/vr_shell/vr_shell.cc |
@@ -36,6 +36,7 @@ |
#include "content/public/common/referrer.h" |
#include "device/vr/android/gvr/gvr_device.h" |
#include "device/vr/android/gvr/gvr_device_provider.h" |
+#include "gpu/command_buffer/common/mailbox.h" |
#include "jni/VrShellImpl_jni.h" |
#include "third_party/WebKit/public/platform/WebInputEvent.h" |
#include "ui/android/view_android.h" |
@@ -324,14 +325,57 @@ void VrShell::SetWebVRSecureOrigin(bool secure_origin) { |
html_interface_->SetWebVRSecureOrigin(secure_origin); |
} |
-void VrShell::SubmitWebVRFrame() {} |
+void VrShell::SubmitWebVRFrame( |
+ int16_t frame_index, |
+ const gpu::MailboxHolder& mailbox, |
+ device::mojom::VRSubmitFrameClientPtr submit_client) { |
+ TRACE_EVENT1("gpu", "SubmitWebVRFrame", "frame", frame_index); |
+ |
+ // Save the submit completion client for later, we'll call the |
+ // next lifecycle stages on it later. Use extra boolean maps |
+ // to track when they get called since they could potentially |
+ // be out of order, do cleanup once both were called. |
+ webvr_submit_clients_.insert( |
+ std::make_pair(frame_index, std::move(submit_client))); |
+ webvr_submit_client_transferring_.insert({frame_index, true}); |
+ webvr_submit_client_rendering_.insert({frame_index, true}); |
+ |
+ PostToGlThreadWhenReady(base::Bind(&VrShellGl::SubmitWebVRFrame, |
+ gl_thread_->GetVrShellGl(), frame_index, |
+ mailbox)); |
+} |
+ |
+void VrShell::OnSubmitWebVRFrameTransferred(int frame_index) { |
+ DCHECK(webvr_submit_clients_.find(frame_index) != |
+ webvr_submit_clients_.end()); |
+ webvr_submit_clients_[frame_index]->OnSubmitFrameTransferred(); |
+ webvr_submit_client_transferring_[frame_index] = false; |
+ if (!webvr_submit_client_rendering_[frame_index]) { |
+ webvr_submit_clients_.erase(frame_index); |
+ webvr_submit_client_transferring_.erase(frame_index); |
+ webvr_submit_client_rendering_.erase(frame_index); |
+ } |
+} |
+ |
+void VrShell::OnSubmitWebVRFrameRendered(int frame_index) { |
+ DCHECK(webvr_submit_clients_.find(frame_index) != |
+ webvr_submit_clients_.end()); |
+ webvr_submit_clients_[frame_index]->OnSubmitFrameRendered(); |
+ webvr_submit_client_rendering_[frame_index] = false; |
+ if (!webvr_submit_client_transferring_[frame_index]) { |
+ webvr_submit_clients_.erase(frame_index); |
+ webvr_submit_client_transferring_.erase(frame_index); |
+ webvr_submit_client_rendering_.erase(frame_index); |
+ } |
+} |
void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, |
const gvr::Rectf& left_bounds, |
- const gvr::Rectf& right_bounds) { |
+ const gvr::Rectf& right_bounds, |
+ const gvr::Sizei& source_size) { |
PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds, |
gl_thread_->GetVrShellGl(), frame_index, |
- left_bounds, right_bounds)); |
+ left_bounds, right_bounds, source_size)); |
} |
bool VrShell::SupportsPresentation() { |
@@ -623,7 +667,7 @@ device::mojom::VRPosePtr VrShell::VRPosePtrFromGvrPose(gvr::Mat4f head_mat) { |
device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( |
gvr::GvrApi* gvr_api, |
- gvr::Sizei compositor_size, |
+ gvr::Sizei recommended_size, |
uint32_t device_id) { |
TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); |
@@ -652,8 +696,8 @@ device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( |
(eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye; |
eye_params->fieldOfView = device::mojom::VRFieldOfView::New(); |
eye_params->offset.resize(3); |
- eye_params->renderWidth = compositor_size.width / 2; |
- eye_params->renderHeight = compositor_size.height; |
+ eye_params->renderWidth = recommended_size.width / 2; |
+ eye_params->renderHeight = recommended_size.height; |
gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); |
gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport); |