Commit 058d8240 authored by Klaus Weidner's avatar Klaus Weidner Committed by Commit Bot

WebXR: use XRSessionDeviceConfig to simplify APIs

Passing device-specific options was getting messy in xr_system/
xr_session. Use a containing structure to simplify this, and to avoid
merge conflicts as in https://crrev.com/c/2438207 going forward.

Bug: 1135789
Change-Id: Ie26affa410a1fad8a8ff9cd6686de452d2393ee8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2440222Reviewed-by: default avatarBrandon Jones <bajones@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Klaus Weidner <klausw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816230}
parent 4ce3021a
...@@ -211,15 +211,19 @@ void GvrSchedulerDelegate::ConnectPresentingService( ...@@ -211,15 +211,19 @@ void GvrSchedulerDelegate::ConnectPresentingService(
session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote(); session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote();
session->submit_frame_sink = std::move(submit_frame_sink); session->submit_frame_sink = std::move(submit_frame_sink);
session->display_info = std::move(display_info); session->display_info = std::move(display_info);
session->supports_viewport_scaling = true;
session->device_config = device::mojom::XRSessionDeviceConfig::New();
auto* config = session->device_config.get();
config->supports_viewport_scaling = true;
// This scalar will be applied in the renderer to the recommended render // This scalar will be applied in the renderer to the recommended render
// target sizes. For WebVR it will always be applied, for WebXR it can be // target sizes. For WebVR it will always be applied, for WebXR it can be
// overridden. // overridden.
if (base::AndroidHardwareBufferCompat::IsSupportAvailable()) { if (base::AndroidHardwareBufferCompat::IsSupportAvailable()) {
session->default_framebuffer_scale = kRecommendedResolutionScale; config->default_framebuffer_scale = kRecommendedResolutionScale;
} else { } else {
session->default_framebuffer_scale = kNoSharedBufferResolutionScale; config->default_framebuffer_scale = kNoSharedBufferResolutionScale;
} }
if (CanSendWebXrVSync()) if (CanSendWebXrVSync())
......
...@@ -276,7 +276,11 @@ void ArCoreDevice::OnCreateSessionCallback( ...@@ -276,7 +276,11 @@ void ArCoreDevice::OnCreateSessionCallback(
session->data_provider = std::move(frame_data_provider); session->data_provider = std::move(frame_data_provider);
session->display_info = std::move(display_info); session->display_info = std::move(display_info);
session->submit_frame_sink = std::move(presentation_connection); session->submit_frame_sink = std::move(presentation_connection);
session->supports_viewport_scaling = true;
session->device_config = device::mojom::XRSessionDeviceConfig::New();
auto* config = session->device_config.get();
config->supports_viewport_scaling = true;
std::move(deferred_callback) std::move(deferred_callback)
.Run(std::move(session), std::move(session_controller)); .Run(std::move(session), std::move(session_controller));
......
...@@ -139,6 +139,7 @@ void VROrientationDevice::RequestSession( ...@@ -139,6 +139,7 @@ void VROrientationDevice::RequestSession(
if (display_info_) { if (display_info_) {
session->display_info = display_info_.Clone(); session->display_info = display_info_.Clone();
} }
session->device_config = device::mojom::XRSessionDeviceConfig::New();
std::move(callback).Run(std::move(session), std::move(controller)); std::move(callback).Run(std::move(session), std::move(controller));
......
...@@ -102,6 +102,25 @@ struct XRSessionOptions { ...@@ -102,6 +102,25 @@ struct XRSessionOptions {
array<XRSessionFeature> optional_features; array<XRSessionFeature> optional_features;
}; };
// This structure contains a description of the device's active configuration
// for the session being established.
struct XRSessionDeviceConfig {
// Indicates whether the device backing this session sends input events solely
// via eventing (as opposed to polling).
bool uses_input_eventing;
// The default scale that should be applied to the native framebuffer size
// unless overridden by the developer.
float default_framebuffer_scale = 1.0;
// Indicates whether the device supports dynamic viewport scaling via
// XRView.requestViewportScale which results in UpdateLayerBounds mojo calls.
// This is opt-in to avoid problems with devices that assume default bounds,
// this would result in broken rendering due to inconsistency between the
// drawn and displayed viewports.
bool supports_viewport_scaling;
};
// This structure contains all the mojo interfaces for different kinds of // This structure contains all the mojo interfaces for different kinds of
// XRSession. The only interface required by all sessions is the // XRSession. The only interface required by all sessions is the
// XRFrameDataProvider. It must always be present. Other interfaces are set as // XRFrameDataProvider. It must always be present. Other interfaces are set as
...@@ -126,20 +145,8 @@ struct XRSession { ...@@ -126,20 +145,8 @@ struct XRSession {
// runtime, and have been consented to by the user. // runtime, and have been consented to by the user.
array<XRSessionFeature> enabled_features; array<XRSessionFeature> enabled_features;
// Indicates whether the device backing this session sends input events solely // Description of the device's active configuration.
// via eventing (as opposed to polling). XRSessionDeviceConfig device_config;
bool uses_input_eventing;
// The default scale that should be applied to the native framebuffer size
// unless overridden by the developer.
float default_framebuffer_scale = 1.0;
// Indicates whether the device supports dynamic viewport scaling via
// XRView.requestViewportScale which results in UpdateLayerBounds mojo calls.
// This is opt-in to avoid problems with devices that assume default bounds,
// this would result in broken rendering due to inconsistency between the
// drawn and displayed viewports.
bool supports_viewport_scaling;
}; };
// This structure contains the infomation and interfaces needed to create a two // This structure contains the infomation and interfaces needed to create a two
......
...@@ -239,7 +239,9 @@ void XRCompositorCommon::RequestSession( ...@@ -239,7 +239,9 @@ void XRCompositorCommon::RequestSession(
auto session = device::mojom::XRSession::New(); auto session = device::mojom::XRSession::New();
session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote(); session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote();
session->submit_frame_sink = std::move(submit_frame_sink); session->submit_frame_sink = std::move(submit_frame_sink);
session->uses_input_eventing = UsesInputEventing();
session->device_config = device::mojom::XRSessionDeviceConfig::New();
session->device_config->uses_input_eventing = UsesInputEventing();
main_thread_task_runner_->PostTask( main_thread_task_runner_->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), true, std::move(session))); FROM_HERE, base::BindOnce(std::move(callback), true, std::move(session)));
......
...@@ -309,9 +309,7 @@ XRSession::XRSession( ...@@ -309,9 +309,7 @@ XRSession::XRSession(
device::mojom::blink::XRSessionMode mode, device::mojom::blink::XRSessionMode mode,
EnvironmentBlendMode environment_blend_mode, EnvironmentBlendMode environment_blend_mode,
InteractionMode interaction_mode, InteractionMode interaction_mode,
bool uses_input_eventing, device::mojom::blink::XRSessionDeviceConfigPtr device_config,
float default_framebuffer_scale,
bool supports_viewport_scaling,
bool sensorless_session, bool sensorless_session,
XRSessionFeatureSet enabled_features) XRSessionFeatureSet enabled_features)
: xr_(xr), : xr_(xr),
...@@ -326,8 +324,8 @@ XRSession::XRSession( ...@@ -326,8 +324,8 @@ XRSession::XRSession(
callback_collection_( callback_collection_(
MakeGarbageCollected<XRFrameRequestCallbackCollection>( MakeGarbageCollected<XRFrameRequestCallbackCollection>(
xr->GetExecutionContext())), xr->GetExecutionContext())),
uses_input_eventing_(uses_input_eventing), uses_input_eventing_(device_config->uses_input_eventing),
supports_viewport_scaling_(supports_viewport_scaling), supports_viewport_scaling_(device_config->supports_viewport_scaling),
sensorless_session_(sensorless_session) { sensorless_session_(sensorless_session) {
client_receiver_.Bind( client_receiver_.Bind(
std::move(client_receiver), std::move(client_receiver),
...@@ -337,9 +335,9 @@ XRSession::XRSession( ...@@ -337,9 +335,9 @@ XRSession::XRSession(
UpdateVisibilityState(); UpdateVisibilityState();
// Clamp to a reasonable min/max size for the default framebuffer scale. // Clamp to a reasonable min/max size for the default framebuffer scale.
default_framebuffer_scale_ = default_framebuffer_scale_ = base::ClampToRange(
base::ClampToRange(default_framebuffer_scale, kMinDefaultFramebufferScale, device_config->default_framebuffer_scale, kMinDefaultFramebufferScale,
kMaxDefaultFramebufferScale); kMaxDefaultFramebufferScale);
world_tracking_state_ = MakeGarbageCollected<XRWorldTrackingState>( world_tracking_state_ = MakeGarbageCollected<XRWorldTrackingState>(
IsFeatureEnabled(device::mojom::XRSessionFeature::PLANE_DETECTION)); IsFeatureEnabled(device::mojom::XRSessionFeature::PLANE_DETECTION));
......
...@@ -116,9 +116,7 @@ class XRSession final ...@@ -116,9 +116,7 @@ class XRSession final
device::mojom::blink::XRSessionMode mode, device::mojom::blink::XRSessionMode mode,
EnvironmentBlendMode environment_blend_mode, EnvironmentBlendMode environment_blend_mode,
InteractionMode interaction_mode, InteractionMode interaction_mode,
bool uses_input_eventing, device::mojom::blink::XRSessionDeviceConfigPtr device_config,
float default_framebuffer_scale,
bool supports_viewport_scaling,
bool sensorless_session, bool sensorless_session,
XRSessionFeatureSet enabled_features); XRSessionFeatureSet enabled_features);
~XRSession() override = default; ~XRSession() override = default;
......
...@@ -1423,12 +1423,11 @@ void XRSystem::OnRequestSessionReturned( ...@@ -1423,12 +1423,11 @@ void XRSystem::OnRequestSessionReturned(
enabled_features.insert(feature); enabled_features.insert(feature);
} }
XRSession* session = CreateSession( XRSession* session =
query->mode(), blend_mode, interaction_mode, CreateSession(query->mode(), blend_mode, interaction_mode,
std::move(session_ptr->client_receiver), std::move(session_ptr->client_receiver),
std::move(session_ptr->display_info), session_ptr->uses_input_eventing, std::move(session_ptr->display_info),
session_ptr->default_framebuffer_scale, std::move(session_ptr->device_config), enabled_features);
session_ptr->supports_viewport_scaling, enabled_features);
frameProvider()->OnSessionStarted(session, std::move(session_ptr)); frameProvider()->OnSessionStarted(session, std::move(session_ptr));
...@@ -1532,15 +1531,13 @@ XRSession* XRSystem::CreateSession( ...@@ -1532,15 +1531,13 @@ XRSession* XRSystem::CreateSession(
mojo::PendingReceiver<device::mojom::blink::XRSessionClient> mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
client_receiver, client_receiver,
device::mojom::blink::VRDisplayInfoPtr display_info, device::mojom::blink::VRDisplayInfoPtr display_info,
bool uses_input_eventing, device::mojom::blink::XRSessionDeviceConfigPtr device_config,
float default_framebuffer_scale,
bool supports_viewport_scaling,
XRSessionFeatureSet enabled_features, XRSessionFeatureSet enabled_features,
bool sensorless_session) { bool sensorless_session) {
XRSession* session = MakeGarbageCollected<XRSession>( XRSession* session = MakeGarbageCollected<XRSession>(
this, std::move(client_receiver), mode, blend_mode, interaction_mode, this, std::move(client_receiver), mode, blend_mode, interaction_mode,
uses_input_eventing, default_framebuffer_scale, supports_viewport_scaling, std::move(device_config), sensorless_session,
sensorless_session, std::move(enabled_features)); std::move(enabled_features));
if (display_info) if (display_info)
session->SetXRDisplayInfo(std::move(display_info)); session->SetXRDisplayInfo(std::move(display_info));
sessions_.insert(session); sessions_.insert(session);
...@@ -1552,14 +1549,14 @@ XRSession* XRSystem::CreateSensorlessInlineSession() { ...@@ -1552,14 +1549,14 @@ XRSession* XRSystem::CreateSensorlessInlineSession() {
XRSession::EnvironmentBlendMode blend_mode = XRSession::kBlendModeOpaque; XRSession::EnvironmentBlendMode blend_mode = XRSession::kBlendModeOpaque;
XRSession::InteractionMode interaction_mode = XRSession::InteractionMode interaction_mode =
XRSession::kInteractionModeScreen; XRSession::kInteractionModeScreen;
return CreateSession( device::mojom::blink::XRSessionDeviceConfigPtr device_config =
device::mojom::blink::XRSessionMode::kInline, blend_mode, device::mojom::blink::XRSessionDeviceConfig::New();
interaction_mode, mojo::NullReceiver() /* client receiver */, return CreateSession(device::mojom::blink::XRSessionMode::kInline, blend_mode,
nullptr /* display_info */, false /* uses_input_eventing */, interaction_mode,
1.0 /* default_framebuffer_scale */, mojo::NullReceiver() /* client receiver */,
false /* supports_viewport_scaling */, nullptr /* display_info */, std::move(device_config),
{device::mojom::XRSessionFeature::REF_SPACE_VIEWER}, {device::mojom::XRSessionFeature::REF_SPACE_VIEWER},
true /* sensorless_session */); true /* sensorless_session */);
} }
void XRSystem::Dispose(DisposeType dispose_type) { void XRSystem::Dispose(DisposeType dispose_type) {
......
...@@ -393,9 +393,7 @@ class XRSystem final : public EventTargetWithInlineData, ...@@ -393,9 +393,7 @@ class XRSystem final : public EventTargetWithInlineData,
mojo::PendingReceiver<device::mojom::blink::XRSessionClient> mojo::PendingReceiver<device::mojom::blink::XRSessionClient>
client_receiver, client_receiver,
device::mojom::blink::VRDisplayInfoPtr display_info, device::mojom::blink::VRDisplayInfoPtr display_info,
bool uses_input_eventing, device::mojom::blink::XRSessionDeviceConfigPtr device_config,
float default_framebuffer_scale,
bool supports_viewport_scaling,
XRSessionFeatureSet enabled_features, XRSessionFeatureSet enabled_features,
bool sensorless_session = false); bool sensorless_session = false);
......
...@@ -1016,8 +1016,10 @@ class MockRuntime { ...@@ -1016,8 +1016,10 @@ class MockRuntime {
clientReceiver: clientReceiver, clientReceiver: clientReceiver,
displayInfo: this.displayInfo_, displayInfo: this.displayInfo_,
enabledFeatures: enabled_features, enabledFeatures: enabled_features,
defaultFramebufferScale: this.defaultFramebufferScale_, deviceConfig: {
supportsViewportScaling: true defaultFramebufferScale: this.defaultFramebufferScale_,
supportsViewportScaling: true
}
} }
}); });
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment