Chromium Code Reviews| 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 9f1bb69260ffe0abdcdd3bbe6189d19fcd743a16..805518b30be686a6ec996319c4540d8164ba9343 100644 |
| --- a/chrome/browser/android/vr_shell/vr_shell.cc |
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc |
| @@ -82,13 +82,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 kFrameOverlayBuffer = 1; |
|
klausw
2016/10/21 18:32:42
rename to kFrameHeadLockedBuffer ?
|
| + |
| vr_shell::VrShell* g_instance; |
| static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; |
| @@ -245,13 +248,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())); |
| + |
| + overlay_left_viewport_.reset( |
|
bshe
2016/10/21 19:00:04
nit: if you rename the above constexpr to HeadLock
|
| + new gvr::BufferViewport(gvr_api_->CreateBufferViewport())); |
| + buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE, |
| + overlay_left_viewport_.get()); |
| + overlay_left_viewport_->SetSourceBufferIndex(kFrameOverlayBuffer); |
| + overlay_left_viewport_->SetReprojection(GVR_REPROJECTION_NONE); |
| + |
| + overlay_right_viewport_.reset( |
| + new gvr::BufferViewport(gvr_api_->CreateBufferViewport())); |
| + buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE, |
| + overlay_right_viewport_.get()); |
| + overlay_right_viewport_->SetSourceBufferIndex(kFrameOverlayBuffer); |
| + overlay_right_viewport_->SetReprojection(GVR_REPROJECTION_NONE); |
| } |
| void VrShell::UpdateController(const gvr::Vec3f& forward_vector) { |
| @@ -416,12 +439,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++, |
| + *overlay_left_viewport_); |
| + buffer_viewport_list_->SetBufferViewport(last_viewport++, |
| + *overlay_right_viewport_); |
| + |
| + // Bind the non-reprojected overlay framebuffer. |
| + frame.BindBuffer(kFrameOverlayBuffer); |
| DrawWebVrOverlay(target_time.monotonic_system_time_nanos); |
| } |
| @@ -500,7 +533,7 @@ void VrShell::DrawEye(const gvr::Mat4f& view_matrix, |
| } |
| 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) { |
| @@ -639,6 +672,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); |
| @@ -749,6 +784,8 @@ void VrShell::OnDomContentsLoaded() { |
| // should fix. |
| ui_contents_->GetRenderWidgetHostView()->SetBackgroundColor( |
| SK_ColorTRANSPARENT); |
| + |
| + dom_contents_loaded_ = true; |
|
klausw
2016/10/21 17:50:47
I'm a bit fuzzy about how the life cycle works, do
cjgrant
2016/10/21 18:29:02
See previous comments. Native state changes (like
|
| } |
| void VrShell::SetWebVrMode(JNIEnv* env, |