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

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

Issue 2508703002: WebVR: Use content CVC size for compositor rendering (Closed)
Patch Set: Undo VrShellImpl changes, use native-side values. Created 4 years, 1 month 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
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 881af78ea80ad4fa08807c50d1e987647f6b70f0..9334877d83edcc23a523470254a8dafa1098d16a 100644
--- a/chrome/browser/android/vr_shell/vr_shell.cc
+++ b/chrome/browser/android/vr_shell/vr_shell.cc
@@ -251,30 +251,51 @@ void VrShell::InitializeGl(JNIEnv* env,
content_texture_id_ = content_texture_handle;
ui_texture_id_ = ui_texture_handle;
+ // While WebVR is going through the compositor path, it shares
+ // the same texture ID. This will change once it gets its own
+ // surface, but store it separately to avoid future confusion.
+ webvr_texture_id_ = content_texture_id_;
+
gvr_api_->InitializeGl();
std::vector<gvr::BufferSpec> specs;
+ // For kFramePrimaryBuffer (primary VrShell and WebVR content)
specs.push_back(gvr_api_->CreateBufferSpec());
- render_size_ = specs[0].GetSize();
+ render_size_primary_ = specs[kFramePrimaryBuffer].GetSize();
- // For WebVR content
+ // For kFrameHeadlockedBuffer (for WebVR insecure content warning).
+ // Set this up at fixed resolution, the (smaller) FOV gets set below.
specs.push_back(gvr_api_->CreateBufferSpec());
+ specs[specs.size() - 1].SetSize(1024, 1024);
mthiesse 2016/11/16 21:30:41 magic numbers to constants with comment
mthiesse 2016/11/16 21:30:41 nit: specs.back()
klausw 2016/11/16 23:37:39 Done.
klausw 2016/11/16 23:37:39 Done: // Pixel dimensions and field of view for t
+ render_size_headlocked_ = specs[kFrameHeadlockedBuffer].GetSize();
swap_chain_.reset(new gvr::SwapChain(gvr_api_->CreateSwapChain(specs)));
vr_shell_renderer_.reset(new VrShellRenderer());
+
+ // Allocate a buffer viewport for use in UI drawing. This isn't
+ // initialized at this point, it'll be set from other viewport list
+ // entries as needed.
+ buffer_viewport_.reset(
+ new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
+
+ // Set up main content viewports. The list has two elements, 0=left
+ // eye and 1=right eye.
buffer_viewport_list_.reset(
new gvr::BufferViewportList(gvr_api_->CreateEmptyBufferViewportList()));
buffer_viewport_list_->SetToRecommendedBufferViewports();
- buffer_viewport_.reset(
- new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
-
+ // Set up head-locked UI viewports, these will be elements 2=left eye
+ // and 3=right eye. For now, use a hardcoded 20-degree-from-center FOV
+ // frustum to reduce rendering cost for this overlay. This fits the
+ // current content, but will need to be adjusted once there's more dynamic
+ // head-locked content that could be larger.
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_left_viewport_->SetSourceFov({20.f, 20.f, 20.f, 20.f});
headlocked_right_viewport_.reset(
new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
@@ -282,7 +303,10 @@ void VrShell::InitializeGl(JNIEnv* env,
headlocked_right_viewport_.get());
headlocked_right_viewport_->SetSourceBufferIndex(kFrameHeadlockedBuffer);
headlocked_right_viewport_->SetReprojection(GVR_REPROJECTION_NONE);
+ headlocked_right_viewport_->SetSourceFov({20.f, 20.f, 20.f, 20.f});
+ // Save copies of the first two viewport items for use by WebVR, it
+ // sets its own UV bounds.
webvr_left_viewport_.reset(
new gvr::BufferViewport(gvr_api_->CreateBufferViewport()));
buffer_viewport_list_->GetBufferViewport(GVR_LEFT_EYE,
@@ -498,6 +522,15 @@ uint32_t GetPixelEncodedPoseIndex() {
void VrShell::DrawFrame(JNIEnv* env, const JavaParamRef<jobject>& obj) {
buffer_viewport_list_->SetToRecommendedBufferViewports();
+ if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) {
mthiesse 2016/11/16 21:30:41 Do you need to undo this when not in webVR?
klausw 2016/11/16 23:37:38 I don't think so, I added this comment: // If
klausw 2016/11/16 23:50:04 On second thought this isn't hard to fix to make i
klausw 2016/11/17 00:07:42 Done, though it doesn't currently seem to work rig
+ if (render_size_primary_.width != webvr_width_ ||
+ render_size_primary_.height != webvr_height_) {
+ render_size_primary_.width = webvr_width_;
+ render_size_primary_.height = webvr_height_;
+ swap_chain_->ResizeBuffer(kFramePrimaryBuffer, render_size_primary_);
+ }
+ }
+
gvr::Frame frame = swap_chain_->AcquireFrame();
gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow();
target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos;
@@ -574,28 +607,43 @@ void VrShell::DrawVrShell(const gvr::Mat4f& head_pose,
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
- DrawUiView(&head_pose, world_elements);
+ DrawUiView(&head_pose, world_elements, render_size_primary_, 0);
bajones 2016/11/16 21:23:52 Would prefer that this used something like kPrimar
klausw 2016/11/16 23:37:39 Done, using kViewportListPrimaryOffset.
if (!head_locked_elements.empty()) {
// Switch to head-locked viewports.
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_);
+ if (last_viewport <= 2) {
bajones 2016/11/16 21:23:52 Not an issue with this patch, but I'm curious: Did
klausw 2016/11/16 23:37:39 I don't think it was a problem, SetToRecommendedBu
+ 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);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- DrawUiView(nullptr, head_locked_elements);
+ DrawUiView(nullptr, head_locked_elements, render_size_headlocked_, 2);
bajones 2016/11/16 21:23:52 Same magic number concern here: kHeadlockedViewpor
klausw 2016/11/16 23:37:38 Done, using kViewportListHeadlockedOffset
}
}
+void VrShell::SetWebVRRenderSurfaceSize(int width, int height) {
+ webvr_width_ = width;
+ webvr_height_ = height;
+ // TODO(klausw): set the WebVR render surface size here once we have that.
+}
+
+gvr::Sizei VrShell::GetWebVRCompositorSurfaceSize() {
+ return render_size_primary_;
+}
+
+
void VrShell::DrawUiView(const gvr::Mat4f* head_pose,
- const std::vector<const ContentRectangle*>& elements) {
+ const std::vector<const ContentRectangle*>& elements,
+ const gvr::Sizei& render_size, int viewport_offset) {
for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) {
- buffer_viewport_list_->GetBufferViewport(eye, buffer_viewport_.get());
+ buffer_viewport_list_->GetBufferViewport(
+ eye + viewport_offset, buffer_viewport_.get());
gvr::Mat4f view_matrix = gvr_api_->GetEyeFromHeadMatrix(eye);
if (head_pose != nullptr) {
@@ -603,7 +651,7 @@ void VrShell::DrawUiView(const gvr::Mat4f* head_pose,
}
gvr::Recti pixel_rect =
- CalculatePixelSpaceRect(render_size_, buffer_viewport_->GetSourceUv());
+ CalculatePixelSpaceRect(render_size, buffer_viewport_->GetSourceUv());
glViewport(pixel_rect.left, pixel_rect.bottom,
pixel_rect.right - pixel_rect.left,
pixel_rect.top - pixel_rect.bottom);
@@ -728,11 +776,13 @@ void VrShell::DrawWebVr() {
glDisable(GL_BLEND);
glDisable(GL_POLYGON_OFFSET_FILL);
- glViewport(0, 0, render_size_.width, render_size_.height);
- vr_shell_renderer_->GetWebVrRenderer()->Draw(content_texture_id_);
+ glViewport(0, 0, render_size_primary_.width, render_size_primary_.height);
+ vr_shell_renderer_->GetWebVrRenderer()->Draw(webvr_texture_id_);
- buffer_viewport_list_->SetBufferViewport(0, *webvr_left_viewport_);
- buffer_viewport_list_->SetBufferViewport(1, *webvr_right_viewport_);
+ buffer_viewport_list_->SetBufferViewport(GVR_LEFT_EYE,
+ *webvr_left_viewport_);
+ buffer_viewport_list_->SetBufferViewport(GVR_RIGHT_EYE,
+ *webvr_right_viewport_);
}
void VrShell::OnTriggerEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) {
@@ -784,6 +834,7 @@ void VrShell::SetWebVrMode(JNIEnv* env,
void VrShell::SetWebVRSecureOrigin(bool secure_origin) {
html_interface_->SetSecureOrigin(secure_origin);
+ webvr_needs_ui_ = !secure_origin;
bajones 2016/11/16 21:23:52 Doesn't look like this is actually used anywhere?
klausw 2016/11/16 23:37:38 Correct, removed here and in the .h file. This us
}
void VrShell::SubmitWebVRFrame() {

Powered by Google App Engine
This is Rietveld 408576698