blob: c21fa6583c96265575e4eb164743c45cf5b5f1a8 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// 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 <optional>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "chrome/browser/vr/graphics_delegate.h"
#include "chrome/browser/vr/ui_test_input.h"
#include "chrome/browser/vr/vr_export.h"
#include "device/vr/public/mojom/isolated_xr_service.mojom-forward.h"
#include "device/vr/public/mojom/vr_service.mojom-forward.h"
#include "device/vr/util/sliding_average.h"
namespace base {
class TimeTicks;
} // namespace base
namespace vr {
class UiInterface;
struct RenderInfo;
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:
BrowserRenderer(std::unique_ptr<UiInterface> ui,
std::unique_ptr<GraphicsDelegate> graphics_delegate,
size_t sliding_time_size);
BrowserRenderer(const BrowserRenderer&) = delete;
BrowserRenderer& operator=(const BrowserRenderer&) = delete;
~BrowserRenderer();
void DrawBrowserFrame(base::TimeTicks current_time,
const gfx::Transform& head_pose);
void DrawWebXrFrame(base::TimeTicks current_time,
const gfx::Transform& head_pose);
// Allows passing std::nullopt in case the test is shutdown before the
// visibility notification has fired.
void WatchElementForVisibilityStatusForTesting(
std::optional<UiVisibilityState> visibility_expectation);
private:
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 DrawWebXrOverlay(const RenderInfo& render_info);
void DrawBrowserUi(const RenderInfo& render_info);
void ReportElementVisibilityStatus(const base::TimeTicks& current_time);
void ReportElementVisibilityResult(bool result);
std::unique_ptr<GraphicsDelegate> graphics_delegate_;
std::optional<UiVisibilityState> ui_visibility_state_;
device::SlidingTimeDeltaAverage ui_processing_time_;
// ui_ is using gl contexts during destruction (skia context specifically), so
// it must be destroyed before graphics_delegate_.
std::unique_ptr<UiInterface> ui_;
};
} // namespace vr
#endif // CHROME_BROWSER_VR_BROWSER_RENDERER_H_