| 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 e2bf855a12fcc5de0bd388ffe30efb376760f296..547a059ed77381d6eae2210603297c22bccf05d2 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc
|
| @@ -83,13 +83,16 @@ static constexpr int kBrowserUiElementId = 0;
|
| // into geometry (they ignore the Z buffer), leading to odd effects
|
| // if they are far away.
|
| static constexpr vr_shell::Recti kWebVrWarningTransientRect = {
|
| - 0, 128, 512, 256};
|
| + 0, 128, 512, 250};
|
| static constexpr vr_shell::Recti kWebVrWarningPermanentRect = {0, 0, 512, 128};
|
| static constexpr float kWebVrWarningDistance = 0.7f; // meters
|
| static constexpr float kWebVrWarningPermanentAngle = 16.3f; // degrees up
|
| // How long the transient warning needs to be displayed.
|
| static constexpr int64_t kWebVrWarningSeconds = 30;
|
|
|
| +static constexpr int kFramePrimaryBuffer = 0;
|
| +static constexpr int kFrameHeadlockedBuffer = 1;
|
| +
|
| vr_shell::VrShell* g_instance;
|
|
|
| static const char kVrShellUIURL[] = "chrome://vr-shell-ui";
|
| @@ -247,13 +250,33 @@ void VrShell::InitializeGl(JNIEnv* env,
|
| std::vector<gvr::BufferSpec> specs;
|
| specs.push_back(gvr_api_->CreateBufferSpec());
|
| render_size_ = specs[0].GetSize();
|
| +
|
| + // For WebVR content
|
| + specs.push_back(gvr_api_->CreateBufferSpec());
|
| +
|
| swap_chain_.reset(new gvr::SwapChain(gvr_api_->CreateSwapChain(specs)));
|
|
|
| vr_shell_renderer_.reset(new VrShellRenderer());
|
| buffer_viewport_list_.reset(
|
| new gvr::BufferViewportList(gvr_api_->CreateEmptyBufferViewportList()));
|
| + buffer_viewport_list_->SetToRecommendedBufferViewports();
|
| +
|
| buffer_viewport_.reset(
|
| new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
|
| +
|
| + headlocked_left_viewport_.reset(
|
| + new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
|
| + buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE,
|
| + headlocked_left_viewport_.get());
|
| + headlocked_left_viewport_->SetSourceBufferIndex(kFrameHeadlockedBuffer);
|
| + headlocked_left_viewport_->SetReprojection(GVR_REPROJECTION_NONE);
|
| +
|
| + headlocked_right_viewport_.reset(
|
| + new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
|
| + buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE,
|
| + headlocked_right_viewport_.get());
|
| + headlocked_right_viewport_->SetSourceBufferIndex(kFrameHeadlockedBuffer);
|
| + headlocked_right_viewport_->SetReprojection(GVR_REPROJECTION_NONE);
|
| }
|
|
|
| void VrShell::UpdateController(const gvr::Vec3f& forward_vector) {
|
| @@ -418,12 +441,22 @@ void VrShell::DrawFrame(JNIEnv* env, const JavaParamRef<jobject>& obj) {
|
| gvr_api_->ApplyNeckModel(head_pose, 1.0f);
|
| }
|
|
|
| - // Bind back to the default framebuffer.
|
| - frame.BindBuffer(0);
|
| + // Bind the primary framebuffer.
|
| + frame.BindBuffer(kFramePrimaryBuffer);
|
|
|
| if (webvr_mode_) {
|
| DrawWebVr();
|
| - if (!webvr_secure_origin_) {
|
| + // Wait for the DOM contents to be loaded before rendering to avoid drawing
|
| + // white rectangles with no content.
|
| + if (!webvr_secure_origin_ && IsUiTextureReady()) {
|
| + size_t last_viewport = buffer_viewport_list_->GetSize();
|
| + buffer_viewport_list_->SetBufferViewport(last_viewport++,
|
| + *headlocked_left_viewport_);
|
| + buffer_viewport_list_->SetBufferViewport(last_viewport++,
|
| + *headlocked_right_viewport_);
|
| +
|
| + // Bind the headlocked framebuffer.
|
| + frame.BindBuffer(kFrameHeadlockedBuffer);
|
| DrawWebVrOverlay(target_time.monotonic_system_time_nanos);
|
| }
|
|
|
| @@ -503,7 +536,7 @@ void VrShell::DrawEye(gvr::Eye eye,
|
| }
|
|
|
| bool VrShell::IsUiTextureReady() {
|
| - return ui_tex_width_ > 0 && ui_tex_height_ > 0;
|
| + return ui_tex_width_ > 0 && ui_tex_height_ > 0 && dom_contents_loaded_;
|
| }
|
|
|
| Rectf VrShell::MakeUiGlCopyRect(Recti pixel_rect) {
|
| @@ -645,6 +678,8 @@ void VrShell::DrawWebVrOverlay(int64_t present_time_nanos) {
|
| gvr::Mat4f right_eye_view_matrix =
|
| gvr_api_->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
|
|
|
| + glClear(GL_COLOR_BUFFER_BIT);
|
| +
|
| buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE,
|
| buffer_viewport_.get());
|
| DrawWebVrEye(left_eye_view_matrix, *buffer_viewport_, present_time_nanos);
|
| @@ -756,6 +791,7 @@ void VrShell::OnDomContentsLoaded() {
|
| ui_contents_->GetRenderWidgetHostView()->SetBackgroundColor(
|
| SK_ColorTRANSPARENT);
|
| html_interface_->OnDomContentsLoaded();
|
| + dom_contents_loaded_ = true;
|
| }
|
|
|
| void VrShell::SetWebVrMode(JNIEnv* env,
|
|
|