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 a48ac0939a7bafeda1e58d54603928c2ff819005..4df6b3c461fda71183faf4f08a5ba9a5dcaa7409 100644 |
| --- a/chrome/browser/android/vr_shell/vr_shell.cc |
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc |
| @@ -141,7 +141,6 @@ blink::WebMouseEvent MakeMouseEvent(WebInputEvent::Type type, |
| return mouse_event; |
| } |
| - |
| } // namespace |
| namespace vr_shell { |
| @@ -214,7 +213,7 @@ void VrShell::SetDelegate(JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& delegate) { |
| base::AutoLock lock(gvr_init_lock_); |
| delegate_ = VrShellDelegate::GetNativeDelegate(env, delegate); |
| - if (gvr_api_) { |
| + if (swap_chain_.get()) { |
| main_thread_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&device::GvrDeviceProvider::OnGvrDelegateReady, |
| delegate_->GetDeviceProvider(), |
| @@ -232,8 +231,6 @@ enum class ViewerType { |
| void VrShell::GvrInit(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jlong native_gvr_api) { |
| - base::AutoLock lock(gvr_init_lock_); |
| - |
| // set the initial webvr state |
| metrics_helper_->SetVRActive(true); |
| @@ -269,6 +266,7 @@ void VrShell::InitializeGl(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jint content_texture_handle, |
| jint ui_texture_handle) { |
| + base::AutoLock lock(gvr_init_lock_); |
| CHECK(gl::GetGLImplementation() != gl::kGLImplementationNone || |
| gl::init::InitializeGLOneOff()); |
| @@ -344,6 +342,13 @@ void VrShell::InitializeGl(JNIEnv* env, |
| buffer_viewport_list_->GetBufferViewport(GVR_RIGHT_EYE, |
| webvr_right_viewport_.get()); |
| webvr_right_viewport_->SetSourceBufferIndex(kFramePrimaryBuffer); |
| + |
| + if (delegate_) { |
| + main_thread_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&device::GvrDeviceProvider::OnGvrDelegateReady, |
| + delegate_->GetDeviceProvider(), |
| + weak_ptr_factory_.GetWeakPtr())); |
| + } |
| } |
| void VrShell::UpdateController(const gvr::Vec3f& forward_vector) { |
| @@ -462,7 +467,7 @@ void VrShell::UpdateController(const gvr::Vec3f& forward_vector) { |
| closest_element_distance = distance_to_plane; |
| Rectf pixel_rect; |
| if (plane->content_quad) { |
| - pixel_rect = {0, 0, content_tex_width_, content_tex_height_}; |
| + pixel_rect = {0, 0, content_tex_css_width_, content_tex_css_height_}; |
| } else { |
| pixel_rect = {plane->copy_rect.x, plane->copy_rect.y, |
| plane->copy_rect.width, plane->copy_rect.height}; |
| @@ -700,7 +705,7 @@ gvr::Sizei VrShell::GetWebVRCompositorSurfaceSize() { |
| // This is a stopgap while we're using the WebVR compositor rendering path. |
| // TODO(klausw,crbug.com/655722): Remove this method and member once we're |
| // using a separate WebVR render surface. |
| - return content_tex_pixels_for_webvr_; |
| + return content_tex_physical_size_; |
| } |
| @@ -746,12 +751,12 @@ void VrShell::DrawElements( |
| copy_rect = {0, 0, 1, 1}; |
| texture_handle = content_texture_id_; |
| } else { |
| - copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_width_; |
| - copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_height_; |
| + copy_rect.x = static_cast<float>(rect->copy_rect.x) / ui_tex_css_width_; |
| + copy_rect.y = static_cast<float>(rect->copy_rect.y) / ui_tex_css_height_; |
| copy_rect.width = static_cast<float>(rect->copy_rect.width) / |
| - ui_tex_width_; |
| + ui_tex_css_width_; |
| copy_rect.height = static_cast<float>(rect->copy_rect.height) / |
| - ui_tex_height_; |
| + ui_tex_css_height_; |
| texture_handle = ui_texture_id_; |
| } |
| gvr::Mat4f transform = MatrixMul(render_matrix, rect->transform.to_world); |
| @@ -922,46 +927,38 @@ gvr::GvrApi* VrShell::gvr_api() { |
| return gvr_api_.get(); |
| } |
| -void VrShell::ContentSurfaceChanged(JNIEnv* env, |
| - const JavaParamRef<jobject>& object, |
| - jint width, |
| - jint height, |
| - const JavaParamRef<jobject>& surface) { |
| - TRACE_EVENT0("gpu", "VrShell::ContentSurfaceChanged"); |
| - // If we have a delegate, must trigger "ready" callback one time only. |
| - // Do so the first time we got a nonzero size. (This assumes it doesn't |
| - // change, but once we get resize ability we'll no longer need this hack.) |
| - // TODO(klausw,crbug.com/655722): remove when we have surface support. |
| - bool delegate_not_ready = delegate_ && !content_tex_pixels_for_webvr_.width; |
| - |
| - content_compositor_->SurfaceChanged((int)width, (int)height, surface); |
| - content_tex_pixels_for_webvr_.width = width; |
| - content_tex_pixels_for_webvr_.height = height; |
| - float scale_factor = display::Screen::GetScreen() |
| - ->GetPrimaryDisplay().device_scale_factor(); |
| - content_tex_width_ = width / scale_factor; |
| - content_tex_height_ = height / scale_factor; |
| - |
| - // TODO(klausw,crbug.com/655722): move this back to GvrInit once we have |
| - // our own WebVR surface. |
| - if (delegate_ && delegate_not_ready) { |
| - main_thread_task_runner_->PostTask( |
| - FROM_HERE, base::Bind(&device::GvrDeviceProvider::OnGvrDelegateReady, |
| - delegate_->GetDeviceProvider(), |
| - weak_ptr_factory_.GetWeakPtr())); |
| - } |
| +void VrShell::SurfacesChanged(JNIEnv* env, |
| + const JavaParamRef<jobject>& object, |
| + const JavaParamRef<jobject>& content_surface, |
| + const JavaParamRef<jobject>& ui_surface) { |
| + content_compositor_->SurfaceChanged(content_surface); |
| + ui_compositor_->SurfaceChanged(ui_surface); |
| } |
| -void VrShell::UiSurfaceChanged(JNIEnv* env, |
| - const JavaParamRef<jobject>& object, |
| - jint width, |
| - jint height, |
| - const JavaParamRef<jobject>& surface) { |
| - ui_compositor_->SurfaceChanged((int)width, (int)height, surface); |
| - float scale_factor = display::Screen::GetScreen() |
| - ->GetPrimaryDisplay().device_scale_factor(); |
| - ui_tex_width_ = width / scale_factor; |
| - ui_tex_height_ = height / scale_factor; |
| +void VrShell::ContentBoundsChanged(JNIEnv* env, |
| + const JavaParamRef<jobject>& object, |
| + jint width, jint height, jfloat dpr) { |
| + TRACE_EVENT0("gpu", "VrShell::ContentBoundsChanged"); |
| + content_tex_physical_size_.width = width; |
| + content_tex_physical_size_.height = height; |
| + content_tex_css_width_ = width / dpr; |
| + content_tex_css_height_ = height / dpr; |
| + |
| + content_compositor_->SetWindowBounds(width, height); |
| + main_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost() |
| + ->WasResized(); |
| +} |
| + |
| +void VrShell::UIBoundsChanged(JNIEnv* env, |
| + const JavaParamRef<jobject>& object, |
| + jint width, jint height, jfloat dpr) { |
| + // TODO(mthiesse): Synchronize these values changing with the renderer |
| + // actually sending us a texture with the updated size somehow. |
|
bshe
2016/11/30 23:00:46
This TODO is confusing. Do you mean you want to sy
mthiesse
2016/11/30 23:25:05
Moved into MainFrameWasResized, and updated the co
|
| + ui_tex_css_width_ = width / dpr; |
| + ui_tex_css_height_ = height / dpr; |
| + |
| + ui_compositor_->SetWindowBounds(width, height); |
| + ui_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->WasResized(); |
| } |
| UiScene* VrShell::GetScene() { |
| @@ -1028,6 +1025,17 @@ void VrShell::RenderViewHostChanged(content::RenderViewHost* old_host, |
| new_host->GetWidget()->GetView()->SetBackgroundColor(SK_ColorTRANSPARENT); |
| } |
| +void VrShell::SetContentCssSize(float width, float height, float dpr) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + Java_VrShellImpl_setContentCssSize(env, j_vr_shell_.obj(), width, height, |
| + dpr); |
| +} |
| + |
| +void VrShell::SetUiCssSize(float width, float height, float dpr) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + Java_VrShellImpl_setUiCssSize(env, j_vr_shell_.obj(), width, height, dpr); |
| +} |
| + |
| // ---------------------------------------------------------------------------- |
| // Native JNI methods |
| // ---------------------------------------------------------------------------- |