blob: 950dbc99a6482064679aca3b31a67e2754e768a9 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/vr/vr_gl_thread.h"
#include <string>
#include <utility>
#include "base/functional/bind.h"
#include "base/task/single_thread_task_runner.h"
#include "chrome/browser/android/vr/metrics_util_android.h"
#include "chrome/browser/android/vr/ui_factory.h"
#include "chrome/browser/android/vr/vr_shell.h"
#include "chrome/browser/vr/browser_renderer.h"
#include "chrome/browser/vr/browser_ui_interface.h"
#include "chrome/browser/vr/ui_test_input.h"
#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gl/android/surface_texture.h"
namespace vr {
VrGLThread::VrGLThread(
const base::WeakPtr<VrShell>& weak_vr_shell,
scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
gvr_context* gvr_api,
const UiInitialState& ui_initial_state,
bool reprojected_rendering,
bool daydream_support,
base::WaitableEvent* gl_surface_created_event,
base::OnceCallback<gfx::AcceleratedWidget()> surface_callback)
: base::android::JavaHandlerThread("VrShellGL"),
weak_vr_shell_(weak_vr_shell),
main_thread_task_runner_(std::move(main_thread_task_runner)),
gvr_api_(gvr::GvrApi::WrapNonOwned(gvr_api)),
factory_params_(std::make_unique<BrowserRendererFactory::Params>(
gvr_api_.get(),
ui_initial_state,
reprojected_rendering,
gvr_api_->GetViewerType() ==
gvr::ViewerType::GVR_VIEWER_TYPE_CARDBOARD,
gl_surface_created_event,
std::move(surface_callback))) {
MetricsUtilAndroid::LogVrViewerType(gvr_api_->GetViewerType());
}
VrGLThread::~VrGLThread() {
Stop();
}
base::WeakPtr<BrowserRenderer> VrGLThread::GetBrowserRenderer() {
return browser_renderer_->GetWeakPtr();
}
void VrGLThread::Init() {
ui_factory_ = CreateUiFactory();
browser_renderer_ = BrowserRendererFactory::Create(
this, ui_factory_.get(), std::move(factory_params_));
weak_browser_ui_ = browser_renderer_->GetBrowserUiWeakPtr();
}
void VrGLThread::CleanUp() {
browser_renderer_.reset();
}
void VrGLThread::GvrDelegateReady() {
DCHECK(OnGlThread());
main_thread_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&VrShell::GvrDelegateReady, weak_vr_shell_));
}
void VrGLThread::SendRequestPresentReply(device::mojom::XRSessionPtr session) {
DCHECK(OnGlThread());
main_thread_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&VrShell::SendRequestPresentReply,
weak_vr_shell_, std::move(session)));
}
void VrGLThread::ForceExitVr() {
DCHECK(OnGlThread());
main_thread_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&VrShell::ForceExitVr, weak_vr_shell_));
}
void VrGLThread::ExitPresent() {
DCHECK(OnGlThread());
main_thread_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&VrShell::ExitPresent, weak_vr_shell_));
browser_renderer_->OnExitPresent();
}
void VrGLThread::ToggleCardboardGamepad(bool enabled) {}
void VrGLThread::SetCapturingState(
const CapturingStateModel& active_capturing,
const CapturingStateModel& background_capturing,
const CapturingStateModel& potential_capturing) {}
void VrGLThread::SetVisibleExternalPromptNotification(
ExternalPromptNotificationType prompt) {
// Not reached on Android.
NOTREACHED();
}
void VrGLThread::ReportUiOperationResultForTesting(
const UiTestOperationType& action_type,
const UiTestOperationResult& result) {}
bool VrGLThread::OnMainThread() const {
return main_thread_task_runner_->BelongsToCurrentThread();
}
bool VrGLThread::OnGlThread() const {
return task_runner()->BelongsToCurrentThread();
}
} // namespace vr