Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Unified Diff: chrome/browser/android/vr_shell/vr_shell.cc

Issue 2430543002: Draw WebVR security overlay with a non-reprojected viewport (Closed)
Patch Set: Rebase, Overlay->Headlocked Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698