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

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell.cc

Issue 2428383006: Decouple VR Shell DPR and CSS size from Physical Displays. (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/vr_shell/vr_shell.h" 5 #include "chrome/browser/android/vr_shell/vr_shell.h"
6 6
7 #include "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "chrome/browser/android/vr_shell/ui_elements.h" 8 #include "chrome/browser/android/vr_shell/ui_elements.h"
9 #include "chrome/browser/android/vr_shell/ui_scene.h" 9 #include "chrome/browser/android/vr_shell/ui_scene.h"
10 #include "chrome/browser/android/vr_shell/vr_compositor.h" 10 #include "chrome/browser/android/vr_shell/vr_compositor.h"
11 #include "chrome/browser/android/vr_shell/vr_controller.h" 11 #include "chrome/browser/android/vr_shell/vr_controller.h"
12 #include "chrome/browser/android/vr_shell/vr_gesture.h" 12 #include "chrome/browser/android/vr_shell/vr_gesture.h"
13 #include "chrome/browser/android/vr_shell/vr_gl_util.h" 13 #include "chrome/browser/android/vr_shell/vr_gl_util.h"
14 #include "chrome/browser/android/vr_shell/vr_input_manager.h" 14 #include "chrome/browser/android/vr_shell/vr_input_manager.h"
15 #include "chrome/browser/android/vr_shell/vr_shell_delegate.h" 15 #include "chrome/browser/android/vr_shell/vr_shell_delegate.h"
16 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" 16 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h"
17 #include "content/public/browser/navigation_controller.h" 17 #include "content/public/browser/navigation_controller.h"
18 #include "content/public/browser/render_widget_host.h" 18 #include "content/public/browser/render_widget_host.h"
19 #include "content/public/browser/render_widget_host_view.h" 19 #include "content/public/browser/render_widget_host_view.h"
20 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
21 #include "content/public/common/referrer.h" 21 #include "content/public/common/referrer.h"
22 #include "content/public/common/screen_info.h" 22 #include "content/public/common/screen_info.h"
23 #include "jni/VrShellImpl_jni.h" 23 #include "jni/VrShellImpl_jni.h"
24 #include "third_party/WebKit/public/web/WebInputEvent.h" 24 #include "third_party/WebKit/public/web/WebInputEvent.h"
25 #include "ui/android/view_android.h" 25 #include "ui/android/view_android.h"
26 #include "ui/android/window_android.h" 26 #include "ui/android/window_android.h"
27 #include "ui/base/page_transition_types.h" 27 #include "ui/base/page_transition_types.h"
28 #include "ui/display/android/screen_android.h"
29 #include "ui/display/display.h"
30 #include "ui/gfx/android/device_display_info.h"
28 #include "ui/gl/gl_bindings.h" 31 #include "ui/gl/gl_bindings.h"
29 #include "ui/gl/init/gl_factory.h" 32 #include "ui/gl/init/gl_factory.h"
30 33
31 using base::android::JavaParamRef; 34 using base::android::JavaParamRef;
35 using base::android::ScopedJavaLocalRef;
32 36
33 namespace { 37 namespace {
34 // Constant taken from treasure_hunt demo. 38 // Constant taken from treasure_hunt demo.
35 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000; 39 static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000;
36 40
37 static constexpr float kZNear = 0.1f; 41 static constexpr float kZNear = 0.1f;
38 static constexpr float kZFar = 1000.0f; 42 static constexpr float kZFar = 1000.0f;
39 43
40 static constexpr gvr::Vec3f kDesktopPositionDefault = {0.0f, 0.0f, -2.0f}; 44 static constexpr gvr::Vec3f kDesktopPositionDefault = {0.0f, 0.0f, -2.0f};
41 static constexpr float kDesktopHeightDefault = 1.6f; 45 static constexpr float kDesktopHeightDefault = 1.6f;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 // into geometry (they ignore the Z buffer), leading to odd effects 86 // into geometry (they ignore the Z buffer), leading to odd effects
83 // if they are far away. 87 // if they are far away.
84 static constexpr vr_shell::Recti kWebVrWarningTransientRect = { 88 static constexpr vr_shell::Recti kWebVrWarningTransientRect = {
85 0, 128, 512, 256}; 89 0, 128, 512, 256};
86 static constexpr vr_shell::Recti kWebVrWarningPermanentRect = {0, 0, 512, 128}; 90 static constexpr vr_shell::Recti kWebVrWarningPermanentRect = {0, 0, 512, 128};
87 static constexpr float kWebVrWarningDistance = 0.7f; // meters 91 static constexpr float kWebVrWarningDistance = 0.7f; // meters
88 static constexpr float kWebVrWarningPermanentAngle = 16.3f; // degrees up 92 static constexpr float kWebVrWarningPermanentAngle = 16.3f; // degrees up
89 // How long the transient warning needs to be displayed. 93 // How long the transient warning needs to be displayed.
90 static constexpr int64_t kWebVrWarningSeconds = 30; 94 static constexpr int64_t kWebVrWarningSeconds = 30;
91 95
96 static constexpr int kContentDisplayId = 1;
97 static constexpr int kUiDisplayId = 2;
98
92 vr_shell::VrShell* g_instance; 99 vr_shell::VrShell* g_instance;
93 100
94 static const char kVrShellUIURL[] = "chrome://vr-shell-ui"; 101 static const char kVrShellUIURL[] = "chrome://vr-shell-ui";
95 102
96 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) { 103 float Distance(const gvr::Vec3f& vec1, const gvr::Vec3f& vec2) {
97 float xdiff = (vec1.x - vec2.x); 104 float xdiff = (vec1.x - vec2.x);
98 float ydiff = (vec1.y - vec2.y); 105 float ydiff = (vec1.y - vec2.y);
99 float zdiff = (vec1.z - vec2.z); 106 float zdiff = (vec1.z - vec2.z);
100 float scale = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff; 107 float scale = xdiff * xdiff + ydiff * ydiff + zdiff * zdiff;
101 return std::sqrt(scale); 108 return std::sqrt(scale);
(...skipping 15 matching lines...) Expand all
117 quat.qw = 0.0f; 124 quat.qw = 0.0f;
118 } else { 125 } else {
119 quat.qx = vec.y; 126 quat.qx = vec.y;
120 quat.qy = -vec.x; 127 quat.qy = -vec.x;
121 quat.qz = 0.0f; 128 quat.qz = 0.0f;
122 vr_shell::NormalizeQuat(quat); 129 vr_shell::NormalizeQuat(quat);
123 } 130 }
124 return quat; 131 return quat;
125 } 132 }
126 133
134 void populateDisplayWithDefaults(display::Display& display, float dpr,
135 gfx::Rect bounds) {
136 gfx::DeviceDisplayInfo device_info;
137 display.SetScaleAndBounds(dpr, bounds);
138 display.SetRotationAsDegree(device_info.GetRotationDegrees());
139 display.set_color_depth(device_info.GetBitsPerPixel());
140 display.set_depth_per_component(device_info.GetBitsPerComponent());
141 display.set_is_monochrome(device_info.GetBitsPerComponent() == 0);
142 }
143
127 } // namespace 144 } // namespace
128 145
129 namespace vr_shell { 146 namespace vr_shell {
130 147
131 VrShell::VrShell(JNIEnv* env, jobject obj, 148 VrShell::VrShell(JNIEnv* env, jobject obj,
132 content::WebContents* main_contents, 149 content::WebContents* main_contents,
133 ui::WindowAndroid* content_window, 150 ui::WindowAndroid* content_window,
134 content::WebContents* ui_contents, 151 content::WebContents* ui_contents,
135 ui::WindowAndroid* ui_window) 152 ui::WindowAndroid* ui_window)
136 : desktop_screen_tilt_(kDesktopScreenTiltDefault), 153 : desktop_screen_tilt_(kDesktopScreenTiltDefault),
(...skipping 20 matching lines...) Expand all
157 174
158 gvr::Mat4f identity; 175 gvr::Mat4f identity;
159 SetIdentityM(identity); 176 SetIdentityM(identity);
160 webvr_head_pose_.resize(kPoseRingBufferSize, identity); 177 webvr_head_pose_.resize(kPoseRingBufferSize, identity);
161 } 178 }
162 179
163 void VrShell::UpdateCompositorLayers(JNIEnv* env, 180 void VrShell::UpdateCompositorLayers(JNIEnv* env,
164 const JavaParamRef<jobject>& obj) { 181 const JavaParamRef<jobject>& obj) {
165 content_compositor_->SetLayer(main_contents_); 182 content_compositor_->SetLayer(main_contents_);
166 ui_compositor_->SetLayer(ui_contents_); 183 ui_compositor_->SetLayer(ui_contents_);
184
185 // TODO(mthiesse): These are temporary placeholders until the UI js is
186 // updated to call these functions.
187 SetUiCssSize(1920, 1080, 1.0);
188 SetContentCssSize(1280, 720, 1.0);
167 } 189 }
168 190
169 void VrShell::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 191 void VrShell::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
170 delete this; 192 delete this;
171 } 193 }
172 194
173 void VrShell::LoadUIContent() { 195 void VrShell::LoadUIContent() {
174 GURL url(kVrShellUIURL); 196 GURL url(kVrShellUIURL);
175 ui_contents_->GetController().LoadURL( 197 ui_contents_->GetController().LoadURL(
176 url, content::Referrer(), 198 url, content::Referrer(),
177 ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string("")); 199 ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string(""));
178 } 200 }
179 201
180 bool RegisterVrShell(JNIEnv* env) { 202 bool RegisterVrShell(JNIEnv* env) {
181 return RegisterNativesImpl(env); 203 return RegisterNativesImpl(env);
182 } 204 }
183 205
184 VrShell::~VrShell() { 206 VrShell::~VrShell() {
207 display::ScreenAndroid* screen = reinterpret_cast<display::ScreenAndroid*>(
208 display::Screen::GetScreen());
209 screen->ClearDisplayForWindow(ui_contents_->GetNativeView());
210 screen->ClearDisplayForWindow(main_contents_->GetNativeView());
185 g_instance = nullptr; 211 g_instance = nullptr;
186 gl::init::ClearGLBindings(); 212 gl::init::ClearGLBindings();
187 } 213 }
188 214
189 void VrShell::SetDelegate(JNIEnv* env, 215 void VrShell::SetDelegate(JNIEnv* env,
190 const base::android::JavaParamRef<jobject>& obj, 216 const base::android::JavaParamRef<jobject>& obj,
191 const base::android::JavaParamRef<jobject>& delegate) { 217 const base::android::JavaParamRef<jobject>& delegate) {
192 delegate_ = VrShellDelegate::getNativeDelegate(env, delegate); 218 delegate_ = VrShellDelegate::getNativeDelegate(env, delegate);
193 } 219 }
194 220
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 void VrShell::UpdateWebVRTextureBounds( 800 void VrShell::UpdateWebVRTextureBounds(
775 int eye, float left, float top, float width, float height) { 801 int eye, float left, float top, float width, float height) {
776 gvr::Rectf bounds = { left, top, width, height }; 802 gvr::Rectf bounds = { left, top, width, height };
777 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds); 803 vr_shell_renderer_->GetWebVrRenderer()->UpdateTextureBounds(eye, bounds);
778 } 804 }
779 805
780 gvr::GvrApi* VrShell::gvr_api() { 806 gvr::GvrApi* VrShell::gvr_api() {
781 return gvr_api_.get(); 807 return gvr_api_.get();
782 } 808 }
783 809
784 void VrShell::ContentSurfaceChanged(JNIEnv* env, 810 void VrShell::SurfacesChanged(JNIEnv* env,
785 const JavaParamRef<jobject>& object, 811 const JavaParamRef<jobject>& object,
786 jint width, 812 const JavaParamRef<jobject>& content_surface,
787 jint height, 813 const JavaParamRef<jobject>& ui_surface) {
788 const JavaParamRef<jobject>& surface) { 814 content_compositor_->SurfaceChanged(content_surface);
789 content_compositor_->SurfaceChanged((int)width, (int)height, surface); 815 ui_compositor_->SurfaceChanged(ui_surface);
790 content::ScreenInfo result;
791 main_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->
792 GetScreenInfo(&result);
793 float dpr = result.device_scale_factor;
794 scene_->GetUiElementById(kBrowserUiElementId)->copy_rect =
795 { 0, 0, width / dpr, height / dpr };
796 } 816 }
797 817
798 void VrShell::UiSurfaceChanged(JNIEnv* env, 818 void VrShell::ContentBoundsChanged(JNIEnv* env,
799 const JavaParamRef<jobject>& object, 819 const JavaParamRef<jobject>& object,
800 jint width, 820 jint width, jint height) {
801 jint height, 821 content_compositor_->SetWindowBounds(width, height);
802 const JavaParamRef<jobject>& surface) { 822 main_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()
803 ui_compositor_->SurfaceChanged((int)width, (int)height, surface); 823 ->WasResized();
804 content::ScreenInfo result; 824 }
805 ui_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->GetScreenInfo( 825
806 &result); 826 void VrShell::UIBoundsChanged(JNIEnv* env,
807 ui_tex_width_ = width / result.device_scale_factor; 827 const JavaParamRef<jobject>& object,
808 ui_tex_height_ = height / result.device_scale_factor; 828 jint width,
829 jint height) {
830 ui_compositor_->SetWindowBounds(width, height);
831 ui_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->WasResized();
809 } 832 }
810 833
811 UiScene* VrShell::GetScene() { 834 UiScene* VrShell::GetScene() {
812 return scene_.get(); 835 return scene_.get();
813 } 836 }
814 837
815 void VrShell::QueueTask(base::Callback<void()>& callback) { 838 void VrShell::QueueTask(base::Callback<void()>& callback) {
816 base::AutoLock lock(task_queue_lock_); 839 base::AutoLock lock(task_queue_lock_);
817 task_queue_.push(callback); 840 task_queue_.push(callback);
818 } 841 }
(...skipping 30 matching lines...) Expand all
849 controller.Reload(false); 872 controller.Reload(false);
850 break; 873 break;
851 case ZOOM_OUT: // Not handled yet. 874 case ZOOM_OUT: // Not handled yet.
852 case ZOOM_IN: // Not handled yet. 875 case ZOOM_IN: // Not handled yet.
853 break; 876 break;
854 default: 877 default:
855 NOTREACHED(); 878 NOTREACHED();
856 } 879 }
857 } 880 }
858 881
882 void VrShell::SetContentCssSize(float width, float height, float dpr) {
883 const gfx::Rect bounds_in_pixels = gfx::Rect(gfx::ScaleToCeiledSize(
884 gfx::Size(width, height), dpr));
885 display::Display display(kContentDisplayId);
886
887 populateDisplayWithDefaults(display, dpr, bounds_in_pixels);
888
889 display::ScreenAndroid* screen = reinterpret_cast<display::ScreenAndroid*>(
890 display::Screen::GetScreen());
891 screen->SetDisplayForWindow(main_contents_->GetNativeView(), display);
892
893 JNIEnv* env = base::android::AttachCurrentThread();
894 Java_VrShellImpl_setContentCssSize(env, j_vr_shell_.obj(), width, height,
895 dpr);
896
897 scene_->GetUiElementById(kBrowserUiElementId)->copy_rect =
898 { 0, 0, width, height };
899 }
900
901 void VrShell::SetUiCssSize(float width, float height, float dpr) {
902 const gfx::Rect bounds_in_pixels = gfx::Rect(gfx::ScaleToCeiledSize(
903 gfx::Size(width, height), dpr));
904 display::Display display(kUiDisplayId);
905
906 populateDisplayWithDefaults(display, dpr, bounds_in_pixels);
907
908 display::ScreenAndroid* screen = reinterpret_cast<display::ScreenAndroid*>(
909 display::Screen::GetScreen());
910 screen->SetDisplayForWindow(ui_contents_->GetNativeView(), display);
911
912 JNIEnv* env = base::android::AttachCurrentThread();
913 Java_VrShellImpl_setUiCssSize(env, j_vr_shell_.obj(), width, height, dpr);
914
915 ui_tex_width_ = width;
916 ui_tex_height_ = height;
917 }
918
859 // ---------------------------------------------------------------------------- 919 // ----------------------------------------------------------------------------
860 // Native JNI methods 920 // Native JNI methods
861 // ---------------------------------------------------------------------------- 921 // ----------------------------------------------------------------------------
862 922
863 jlong Init(JNIEnv* env, 923 jlong Init(JNIEnv* env,
864 const JavaParamRef<jobject>& obj, 924 const JavaParamRef<jobject>& obj,
865 const JavaParamRef<jobject>& content_web_contents, 925 const JavaParamRef<jobject>& content_web_contents,
866 jlong content_window_android, 926 jlong content_window_android,
867 const JavaParamRef<jobject>& ui_web_contents, 927 const JavaParamRef<jobject>& ui_web_contents,
868 jlong ui_window_android) { 928 jlong ui_window_android) {
869 return reinterpret_cast<intptr_t>(new VrShell( 929 return reinterpret_cast<intptr_t>(new VrShell(
870 env, obj, content::WebContents::FromJavaWebContents(content_web_contents), 930 env, obj, content::WebContents::FromJavaWebContents(content_web_contents),
871 reinterpret_cast<ui::WindowAndroid*>(content_window_android), 931 reinterpret_cast<ui::WindowAndroid*>(content_window_android),
872 content::WebContents::FromJavaWebContents(ui_web_contents), 932 content::WebContents::FromJavaWebContents(ui_web_contents),
873 reinterpret_cast<ui::WindowAndroid*>(ui_window_android))); 933 reinterpret_cast<ui::WindowAndroid*>(ui_window_android)));
874 } 934 }
875 935
876 } // namespace vr_shell 936 } // namespace vr_shell
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698