| 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..2fd9f730c536a514ad4cf731b339ef1b83d3de2f 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,32 @@ 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;
 | 
| +  // TODO(mthiesse): Synchronize with GL thread, and update tex css size in
 | 
| +  // response to MainFrameWasResized, not here.
 | 
| +  content_tex_css_width_ = width / dpr;
 | 
| +  content_tex_css_height_ = height / dpr;
 | 
| +
 | 
| +  content_compositor_->SetWindowBounds(width, height);
 | 
| +}
 | 
| +
 | 
| +void VrShell::UIBoundsChanged(JNIEnv* env,
 | 
| +                              const JavaParamRef<jobject>& object,
 | 
| +                              jint width, jint height, jfloat dpr) {
 | 
| +  ui_compositor_->SetWindowBounds(width, height);
 | 
|  }
 | 
|  
 | 
|  UiScene* VrShell::GetScene() {
 | 
| @@ -1028,6 +1019,25 @@ void VrShell::RenderViewHostChanged(content::RenderViewHost* old_host,
 | 
|    new_host->GetWidget()->GetView()->SetBackgroundColor(SK_ColorTRANSPARENT);
 | 
|  }
 | 
|  
 | 
| +void VrShell::MainFrameWasResized(bool width_changed) {
 | 
| +  display::Display display = display::Screen::GetScreen()
 | 
| +      ->GetDisplayNearestWindow(ui_contents_->GetNativeView());
 | 
| +  // TODO(mthiesse): Synchronize with GL thread.
 | 
| +  ui_tex_css_width_ = display.size().width();
 | 
| +  ui_tex_css_height_ = display.size().height();
 | 
| +}
 | 
| +
 | 
| +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
 | 
|  // ----------------------------------------------------------------------------
 | 
| 
 |