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, |