blob: b3c532d784ac10772ef62fcf4de0411c78e8f493 [file] [log] [blame]
// Copyright 2015 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.
module device.mojom;
import "mojo/common/time.mojom";
import "gpu/ipc/common/mailbox_holder.mojom";
import "gpu/ipc/common/sync_token.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";
import "ui/gfx/mojo/gpu_fence_handle.mojom";
// A field of view, given by 4 degrees describing the view from a center point.
struct VRFieldOfView {
float upDegrees;
float downDegrees;
float leftDegrees;
float rightDegrees;
};
// A display's position, orientation, velocity, and acceleration state at the
// given timestamp.
struct VRPose {
array<float, 4>? orientation;
array<float, 3>? position;
array<float, 3>? angularVelocity;
array<float, 3>? linearVelocity;
array<float, 3>? angularAcceleration;
array<float, 3>? linearAcceleration;
};
struct VRDisplayCapabilities {
bool hasPosition;
bool hasExternalDisplay;
// Indicates whether the display can actively show imagery on a headset.
bool canPresent;
};
// Information about the optical properties for an eye in a VRDisplay.
struct VREyeParameters {
VRFieldOfView fieldOfView;
array<float, 3> offset;
uint32 renderWidth;
uint32 renderHeight;
};
struct VRStageParameters {
array<float, 16> standingTransform;
float sizeX;
float sizeZ;
};
struct VRDisplayInfo {
uint32 index;
string displayName;
VRDisplayCapabilities capabilities;
VRStageParameters? stageParameters;
// Parameters required to distort a scene for viewing in a VR headset. Only
// required for devices which have the canPresent capability.
VREyeParameters? leftEye;
VREyeParameters? rightEye;
};
// Options supplied by the Renderer when requesting presentation.
struct VRRequestPresentOptions {
// If true, must use a render path that can preserve drawing buffer
// contents across frames. If false, each frame is drawn independently.
bool preserve_drawing_buffer;
};
// Frame transport method from the Renderer's point of view.
enum VRDisplayFrameTransportMethod {
NONE = 0,
// Renderer should create a new texture handle (Windows) or
// texture mailbox (Android Surface path) containing the
// frame's image and supply that as a submitFrame argument.
SUBMIT_AS_TEXTURE_HANDLE = 1,
SUBMIT_AS_MAILBOX_HOLDER = 2,
// Not yet implemented: Renderer should draw directly into
// a texture mailbox provided for each frame in OnVSync.
// DRAW_INTO_TEXTURE_MAILBOX = 3,
};
struct VRDisplayFrameTransportOptions {
VRDisplayFrameTransportMethod transport_method;
// Booleans indicating which of the VRSubmitFrameClient callbacks
// are in use. Default is false, the device implementation should set
// the ones to true that it needs and can ignore the rest.
bool wait_for_transfer_notification;
bool wait_for_render_notification;
bool wait_for_gpu_fence;
};
enum VRDisplayEventReason {
NONE = 0,
NAVIGATION = 1,
MOUNTED = 2,
UNMOUNTED = 3
};
// TODO(shaobo.yan@intel.com) : Add comments to describe these interfaces about
// how to use and where they live.
interface VRService {
// TODO(shaobo.yan@intel.com, crbug/701027): Use a factory function which
// takes a VRServiceClient so we will never have a half-initialized VRService.
SetClient(VRServiceClient client) => ();
// Inform the service that the page is listening for vrdisplayactivate events.
// TODO(mthiesse): Move SetListeningForActivate onto VRDisplay.
SetListeningForActivate(bool listening);
};
interface VRServiceClient {
OnDisplayConnected(VRMagicWindowProvider magic_window_provider,
VRDisplayHost display, VRDisplayClient& request,
VRDisplayInfo display_info);
};
// After submitting a frame, the VRPresentationProvider will notify the client
// about several stages of the render pipeline. This allows pipelining
// efficiency. Following VRPresentationProvider::Submit*, the submitted frame
// will be transferred (read from, perhaps copied to another texture), and then
// rendered (submitted to the underlying VR API).
// The client lives in the render process, implemented by VRDisplay.
//
// See VRDisplayFrameTransportConfiguration which configures which of these
// callbacks are in use.
interface VRSubmitFrameClient {
// The VRPresentationProvider calls this to indicate that the submitted frame
// has been transferred, so the backing data (mailbox or GpuMemoryBuffer) can
// be reused or discarded. Note that this is a convenience/optimization
// feature, not a security feature - if a site discards the data early we may
// drop a frame, but nothing will otherwise misbehave.
// When the frame wasn't successfully transferred, the client should create a
// new mailbox/GpuMemoryBuffer rather than reusing an existing one to recover
// for subsequent frames.
OnSubmitFrameTransferred(bool success);
// The VRPresentationProvider calls this after the frame was handed off to the
// underlying VR API. This allows some pipelining of CPU/GPU work, while
// delaying expensive tasks for a subsequent frame until the current frame has
// completed.
OnSubmitFrameRendered();
// This callback provides a GpuFence corresponding to the previous frame's
// rendering completion, intended for use with a server wait issued before
// the following wait to prevent its rendering work from competing with
// the previous frame.
OnSubmitFrameGpuFence(gfx.mojom.GpuFenceHandle gpu_fence_handle);
};
// Provides a communication channel from the renderer to the browser-side host
// of a (device/) VrDisplayImpl.
interface VRDisplayHost {
// The returned transport_options is marked optional: it's null for
// a failure result but must be non-null for a success result.
RequestPresent(VRSubmitFrameClient client,
VRPresentationProvider& request,
VRRequestPresentOptions options) => (
bool success,
VRDisplayFrameTransportOptions? transport_options);
ExitPresent();
};
// Provides the necessary functionality for a non-presenting WebVR page to draw
// magic window content.
interface VRMagicWindowProvider {
GetPose() => (VRPose? pose);
};
// Provides the necessary functionality for a presenting WebVR page to draw
// frames for a VrDisplay.
// This interface is hosted in the Browser process, but will move to a sandboxed
// utility process on Windows. The render process communicates with it.
interface VRPresentationProvider {
enum VSyncStatus { SUCCESS, CLOSING };
// The frameId maps a VSync to a frame arriving from the compositor. IDs will
// be reused after the frame arrives from the compositor. Negative IDs imply
// no mapping.
GetVSync() => (VRPose? pose, mojo.common.mojom.TimeDelta time, int16 frame_id,
VSyncStatus status);
UpdateLayerBounds(int16 frame_id, gfx.mojom.RectF left_bounds,
gfx.mojom.RectF right_bounds, gfx.mojom.Size source_size);
// VRDisplayFrameTransportMethod SUBMIT_AS_MAILBOX_HOLDER
SubmitFrame(int16 frame_id, gpu.mojom.MailboxHolder mailbox_holder,
mojo.common.mojom.TimeDelta time_waited);
// VRDisplayFrameTransportMethod SUBMIT_AS_TEXTURE_HANDLE
// TODO(https://crbug.com/676224): Support preprocessing of mojom files, since
// this is Windows only.
SubmitFrameWithTextureHandle(int16 frameId, handle texture);
};
interface VRDisplayClient {
OnChanged(VRDisplayInfo display);
OnExitPresent();
OnBlur();
OnFocus();
OnActivate(VRDisplayEventReason reason) => (bool will_not_present);
OnDeactivate(VRDisplayEventReason reason);
};