blob: ffae49adc5875e8cbc9814f5d827f9720e3cc037 [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 "base/version.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/assets_loader.h"
#include "chrome/browser/vr/browser_renderer.h"
#include "chrome/browser/vr/browser_ui_interface.h"
#include "chrome/browser/vr/model/assets.h"
#include "chrome/browser/vr/model/location_bar_state.h"
#include "chrome/browser/vr/model/omnibox_suggestions.h"
#include "chrome/browser/vr/sounds_manager_audio_delegate.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::SetFullscreen(bool enabled) {}
void VrGLThread::SetIncognito(bool incognito) {}
void VrGLThread::SetHistoryButtonsEnabled(bool can_go_back,
bool can_go_forward) {}
void VrGLThread::SetLoadProgress(float progress) {}
void VrGLThread::SetLoading(bool loading) {}
void VrGLThread::SetLocationBarState(const LocationBarState& state) {}
void VrGLThread::SetWebVrMode(bool enabled) {
DCHECK(OnMainThread());
task_runner()->PostTask(FROM_HERE,
base::BindOnce(&BrowserUiInterface::SetWebVrMode,
weak_browser_ui_, enabled));
}
void VrGLThread::SetCapturingState(
const CapturingStateModel& active_capturing,
const CapturingStateModel& background_capturing,
const CapturingStateModel& potential_capturing) {}
void VrGLThread::ShowExitVrPrompt(UiUnsupportedMode reason) {}
void VrGLThread::SetHasOrCanRequestRecordAudioPermission(
bool const has_or_can_request_record_audio) {}
void VrGLThread::SetSpeechRecognitionEnabled(bool enabled) {}
void VrGLThread::SetRecognitionResult(const std::u16string& result) {}
void VrGLThread::OnSpeechRecognitionStateChanged(int new_state) {}
void VrGLThread::SetOmniboxSuggestions(
std::vector<OmniboxSuggestion> suggestions) {}
void VrGLThread::OnAssetsLoaded(AssetsLoadStatus status,
std::unique_ptr<Assets> assets,
const base::Version& component_version) {}
void VrGLThread::OnAssetsUnavailable() {}
void VrGLThread::WaitForAssets() {}
void VrGLThread::SetRegularTabsOpen(bool open) {}
void VrGLThread::SetIncognitoTabsOpen(bool open) {}
void VrGLThread::SetOverlayTextureEmpty(bool empty) {}
void VrGLThread::ShowSoftInput(bool show) {}
void VrGLThread::UpdateWebInputIndices(int selection_start,
int selection_end,
int composition_start,
int composition_end) {}
void VrGLThread::SetDialogLocation(float x, float y) {}
void VrGLThread::SetDialogFloating(bool floating) {}
void VrGLThread::ShowPlatformToast(const std::u16string& text) {}
void VrGLThread::CancelPlatformToast() {}
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