blob: 72a46c4c3dec6dde72131f0b2bdff06c1236a6e9 [file] [log] [blame]
// Copyright 2016 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 VRDisplay_h
#define VRDisplay_h
#include "bindings/core/v8/ScriptWrappable.h"
#include "core/dom/Document.h"
#include "core/dom/FrameRequestCallback.h"
#include "device/vr/vr_service.mojom-blink.h"
#include "modules/vr/VRDisplayCapabilities.h"
#include "modules/vr/VRLayer.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "platform/Timer.h"
#include "platform/heap/Handle.h"
#include "public/platform/WebGraphicsContext3DProvider.h"
#include "wtf/Forward.h"
#include "wtf/text/WTFString.h"
namespace gpu {
namespace gles2 {
class GLES2Interface;
}
}
namespace blink {
class NavigatorVR;
class ScriptedAnimationController;
class VRController;
class VREyeParameters;
class VRFrameData;
class VRStageParameters;
class VRPose;
class WebGLRenderingContextBase;
enum VREye { VREyeNone, VREyeLeft, VREyeRight };
class VRDisplay final : public GarbageCollectedFinalized<VRDisplay>,
public device::mojom::blink::VRDisplayClient,
public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO();
USING_PRE_FINALIZER(VRDisplay, dispose);
public:
~VRDisplay();
unsigned displayId() const { return m_displayId; }
const String& displayName() const { return m_displayName; }
VRDisplayCapabilities* capabilities() const { return m_capabilities; }
VRStageParameters* stageParameters() const { return m_stageParameters; }
bool isConnected() const { return m_isConnected; }
bool isPresenting() const { return m_isPresenting; }
bool getFrameData(VRFrameData*);
VRPose* getPose();
void resetPose();
double depthNear() const { return m_depthNear; }
double depthFar() const { return m_depthFar; }
void setDepthNear(double value) { m_depthNear = value; }
void setDepthFar(double value) { m_depthFar = value; }
VREyeParameters* getEyeParameters(const String&);
int requestAnimationFrame(FrameRequestCallback*);
void cancelAnimationFrame(int id);
void serviceScriptedAnimations(double monotonicAnimationStartTime);
ScriptPromise requestPresent(ScriptState*, const HeapVector<VRLayer>& layers);
ScriptPromise exitPresent(ScriptState*);
HeapVector<VRLayer> getLayers();
void submitFrame();
DECLARE_VIRTUAL_TRACE();
protected:
friend class VRController;
VRDisplay(NavigatorVR*,
device::mojom::blink::VRDisplayPtr,
device::mojom::blink::VRDisplayClientRequest);
void update(const device::mojom::blink::VRDisplayInfoPtr&);
void updatePose();
void beginPresent(ScriptPromiseResolver*);
void forceExitPresent();
void updateLayerBounds();
void disconnected();
VRController* controller();
private:
void onFullscreenCheck(TimerBase*);
void onPresentComplete(ScriptPromiseResolver*, bool);
void onConnected();
void onDisconnected();
void OnPresentChange();
// VRDisplayClient
void OnChanged(device::mojom::blink::VRDisplayInfoPtr) override;
void OnExitPresent() override;
void OnBlur() override;
void OnFocus() override;
void OnActivate(device::mojom::blink::VRDisplayEventReason) override;
void OnDeactivate(device::mojom::blink::VRDisplayEventReason) override;
ScriptedAnimationController& ensureScriptedAnimationController(Document*);
Member<NavigatorVR> m_navigatorVR;
unsigned m_displayId;
String m_displayName;
bool m_isConnected;
bool m_isPresenting;
bool m_canUpdateFramePose;
Member<VRDisplayCapabilities> m_capabilities;
Member<VRStageParameters> m_stageParameters;
Member<VREyeParameters> m_eyeParametersLeft;
Member<VREyeParameters> m_eyeParametersRight;
device::mojom::blink::VRPosePtr m_framePose;
VRLayer m_layer;
double m_depthNear;
double m_depthFar;
void dispose();
Timer<VRDisplay> m_fullscreenCheckTimer;
gpu::gles2::GLES2Interface* m_contextGL;
Member<WebGLRenderingContextBase> m_renderingContext;
Member<ScriptedAnimationController> m_scriptedAnimationController;
bool m_animationCallbackRequested;
bool m_inAnimationFrame;
bool m_displayBlurred;
device::mojom::blink::VRDisplayPtr m_display;
mojo::Binding<device::mojom::blink::VRDisplayClient> m_binding;
};
using VRDisplayVector = HeapVector<Member<VRDisplay>>;
enum class PresentationResult {
Requested = 0,
Success = 1,
SuccessAlreadyPresenting = 2,
VRDisplayCannotPresent = 3,
PresentationNotSupportedByDisplay = 4,
VRDisplayNotFound = 5,
NotInitiatedByUserGesture = 6,
InvalidNumberOfLayers = 7,
InvalidLayerSource = 8,
LayerSourceMissingWebGLContext = 9,
InvalidLayerBounds = 10,
ServiceInactive = 11,
RequestDenied = 12,
PresentationResultMax, // Must be last member of enum.
};
void ReportPresentationResult(PresentationResult);
} // namespace blink
#endif // VRDisplay_h