blob: 1fa9bde1d13a65281328081a55f28866493b4418 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_BROWSER_RENDERER_H_
#define CHROME_BROWSER_VR_BROWSER_RENDERER_H_
#include <memory>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/vr/gl_texture_location.h"
#include "chrome/browser/vr/graphics_delegate.h"
#include "chrome/browser/vr/scheduler_browser_renderer_interface.h"
#include "chrome/browser/vr/vr_export.h"
#include "device/vr/public/mojom/isolated_xr_service.mojom.h"
#include "device/vr/public/mojom/vr_service.mojom.h"
#include "device/vr/util/sliding_average.h"
namespace base {
class TimeDelta;
class TimeTicks;
} // namespace base
namespace vr {
enum class UiTestOperationResult;
class BrowserUiInterface;
class InputDelegate;
class PlatformInputHandler;
class PlatformUiInputDelegate;
class BrowserRendererBrowserInterface;
class SchedulerDelegate;
class UiInterface;
struct ControllerTestInput;
struct RenderInfo;
struct UiTestActivityExpectation;
struct VisibilityChangeExpectation;
struct UiTestState;
struct UiVisibilityState;
// The BrowserRenderer handles all input/output activities during a frame.
// This includes head movement, controller movement and input, audio output and
// rendering of the frame.
class VR_EXPORT BrowserRenderer : public SchedulerBrowserRendererInterface {
public:
BrowserRenderer(std::unique_ptr<UiInterface> ui,
std::unique_ptr<SchedulerDelegate> scheduler_delegate,
std::unique_ptr<GraphicsDelegate> graphics_delegate,
std::unique_ptr<InputDelegate> input_delegate,
BrowserRendererBrowserInterface* browser,
size_t sliding_time_size);
~BrowserRenderer() override;
void OnPause();
void OnResume();
void OnExitPresent();
void OnTriggerEvent(bool pressed);
void SetWebXrMode(bool enabled);
void EnableAlertDialog(PlatformInputHandler* input_handler,
float width,
float height);
void DisableAlertDialog();
void SetAlertDialogSize(float width, float height);
void ResumeContentRendering();
void BufferBoundsChanged(const gfx::Size& content_buffer_size,
const gfx::Size& overlay_buffer_size);
base::WeakPtr<BrowserRenderer> GetWeakPtr();
base::WeakPtr<BrowserUiInterface> GetBrowserUiWeakPtr();
void PerformControllerActionForTesting(ControllerTestInput controller_input);
void SetUiExpectingActivityForTesting(
UiTestActivityExpectation ui_expectation);
void SaveNextFrameBufferToDiskForTesting(std::string filepath_base);
void WatchElementForVisibilityStatusForTesting(
VisibilityChangeExpectation visibility_expectation);
void AcceptDoffPromptForTesting();
void SetBrowserRendererBrowserInterfaceForTesting(
BrowserRendererBrowserInterface* interface_ptr);
void ConnectPresentingService(
device::mojom::VRDisplayInfoPtr display_info,
device::mojom::XRRuntimeSessionOptionsPtr options);
private:
// SchedulerBrowserRendererInterface implementation.
void DrawBrowserFrame(base::TimeTicks current_time) override;
void DrawWebXrFrame(base::TimeTicks current_time,
const gfx::Transform& head_pose) override;
void ProcessControllerInputForWebXr(base::TimeTicks current_time) override;
void Draw(FrameType frame_type,
base::TimeTicks current_time,
const gfx::Transform& head_pose);
// Position, hide and/or show UI elements, process input and update textures.
// Returns true if the scene changed.
void UpdateUi(const RenderInfo& render_info,
base::TimeTicks currrent_time,
FrameType frame_type);
void DrawWebXr();
void DrawWebXrOverlay(const RenderInfo& render_info);
void DrawContentQuad();
void DrawBrowserUi(const RenderInfo& render_info);
base::TimeDelta ProcessControllerInput(const RenderInfo& render_info,
base::TimeTicks current_time);
void ReportUiStatusForTesting(const base::TimeTicks& current_time,
bool ui_updated);
void ReportUiActivityResultForTesting(UiTestOperationResult result);
void ReportFrameBufferDumpForTesting();
void ReportElementVisibilityStatusForTesting(
const base::TimeTicks& current_time);
void ReportElementVisibilityResultForTesting(UiTestOperationResult result);
std::unique_ptr<SchedulerDelegate> scheduler_delegate_;
std::unique_ptr<GraphicsDelegate> graphics_delegate_;
std::unique_ptr<InputDelegate> input_delegate_;
std::unique_ptr<InputDelegate> input_delegate_for_testing_;
bool using_input_delegate_for_testing_ = false;
std::string frame_buffer_dump_filepath_base_;
std::unique_ptr<PlatformUiInputDelegate> vr_dialog_input_delegate_;
BrowserRendererBrowserInterface* browser_;
std::unique_ptr<UiTestState> ui_test_state_;
std::unique_ptr<UiVisibilityState> ui_visibility_state_;
device::SlidingTimeDeltaAverage ui_processing_time_;
device::SlidingTimeDeltaAverage ui_controller_update_time_;
// ui_ is using gl contexts during destruction (skia context specifically), so
// it must be destroyed before graphics_delegate_.
std::unique_ptr<UiInterface> ui_;
base::WeakPtrFactory<BrowserRenderer> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BrowserRenderer);
};
} // namespace vr
#endif // CHROME_BROWSER_VR_BROWSER_RENDERER_H_