Commit e04d87f3 authored by Minoru Chikamune's avatar Minoru Chikamune Committed by Commit Bot

Migrate XRFrameProvider to use GC mojo wrappers.

No behavior change. This CL reduces potential risks of use-after-free bugs.

Bug: 1049056
Change-Id: Ib2821bb00948dbbb84f037a33f9ac452d6bcb964
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2208783Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771233}
parent 8d6554d3
...@@ -56,6 +56,8 @@ XRFrameProvider::XRFrameProvider(XRSystem* xr) ...@@ -56,6 +56,8 @@ XRFrameProvider::XRFrameProvider(XRSystem* xr)
xr->GetExecutionContext(), xr->GetExecutionContext(),
xr->GetExecutionContext()->GetTaskRunner( xr->GetExecutionContext()->GetTaskRunner(
TaskType::kMiscPlatformAPI))), TaskType::kMiscPlatformAPI))),
immersive_data_provider_(xr->GetExecutionContext()),
immersive_presentation_provider_(xr->GetExecutionContext()),
last_has_focus_(xr->IsFrameFocused()) {} last_has_focus_(xr->IsFrameFocused()) {}
void XRFrameProvider::OnSessionStarted( void XRFrameProvider::OnSessionStarted(
...@@ -71,13 +73,16 @@ void XRFrameProvider::OnSessionStarted( ...@@ -71,13 +73,16 @@ void XRFrameProvider::OnSessionStarted(
immersive_session_ = session; immersive_session_ = session;
immersive_data_provider_.Bind(std::move(session_ptr->data_provider)); immersive_data_provider_.Bind(
std::move(session_ptr->data_provider),
xr_->GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI));
immersive_data_provider_.set_disconnect_handler( immersive_data_provider_.set_disconnect_handler(
WTF::Bind(&XRFrameProvider::OnProviderConnectionError, WTF::Bind(&XRFrameProvider::OnProviderConnectionError,
WrapWeakPersistent(this), WrapWeakPersistent(session))); WrapWeakPersistent(this), WrapWeakPersistent(session)));
immersive_presentation_provider_.Bind( immersive_presentation_provider_.Bind(
std::move(session_ptr->submit_frame_sink->provider)); std::move(session_ptr->submit_frame_sink->provider),
xr_->GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI));
immersive_presentation_provider_.set_disconnect_handler( immersive_presentation_provider_.set_disconnect_handler(
WTF::Bind(&XRFrameProvider::OnProviderConnectionError, WTF::Bind(&XRFrameProvider::OnProviderConnectionError,
WrapWeakPersistent(this), WrapWeakPersistent(session))); WrapWeakPersistent(this), WrapWeakPersistent(session)));
...@@ -94,13 +99,18 @@ void XRFrameProvider::OnSessionStarted( ...@@ -94,13 +99,18 @@ void XRFrameProvider::OnSessionStarted(
return; return;
} }
mojo::Remote<device::mojom::blink::XRFrameDataProvider> data_provider; HeapMojoRemote<device::mojom::blink::XRFrameDataProvider,
data_provider.Bind(std::move(session_ptr->data_provider)); HeapMojoWrapperMode::kWithoutContextObserver>
data_provider(xr_->GetExecutionContext());
data_provider.Bind(
std::move(session_ptr->data_provider),
xr_->GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI));
data_provider.set_disconnect_handler( data_provider.set_disconnect_handler(
WTF::Bind(&XRFrameProvider::OnProviderConnectionError, WTF::Bind(&XRFrameProvider::OnProviderConnectionError,
WrapWeakPersistent(this), WrapWeakPersistent(session))); WrapWeakPersistent(this), WrapWeakPersistent(session)));
non_immersive_data_providers_.insert(session, std::move(data_provider)); non_immersive_data_providers_.insert(
session, WrapDisallowNew(std::move(data_provider)));
} }
} }
...@@ -358,7 +368,7 @@ void XRFrameProvider::RequestNonImmersiveFrameData(XRSession* session) { ...@@ -358,7 +368,7 @@ void XRFrameProvider::RequestNonImmersiveFrameData(XRSession* session) {
if (provider == non_immersive_data_providers_.end()) { if (provider == non_immersive_data_providers_.end()) {
request->value = nullptr; request->value = nullptr;
} else { } else {
auto& data_provider = provider->value; auto& data_provider = provider->value->Value();
auto options = device::mojom::blink::XRFrameDataRequestOptions::New( auto options = device::mojom::blink::XRFrameDataRequestOptions::New(
session->worldTrackingState()->planeDetectionState()->enabled(), session->worldTrackingState()->planeDetectionState()->enabled(),
session->LightEstimationEnabled()); session->LightEstimationEnabled());
...@@ -568,7 +578,7 @@ void XRFrameProvider::SubmitWebGLLayer(XRWebGLLayer* layer, bool was_changed) { ...@@ -568,7 +578,7 @@ void XRFrameProvider::SubmitWebGLLayer(XRWebGLLayer* layer, bool was_changed) {
// the moment. Will need an overhaul when we get more robust layering support. // the moment. Will need an overhaul when we get more robust layering support.
void XRFrameProvider::UpdateWebGLLayerViewports(XRWebGLLayer* layer) { void XRFrameProvider::UpdateWebGLLayerViewports(XRWebGLLayer* layer) {
DCHECK(layer->session() == immersive_session_); DCHECK(layer->session() == immersive_session_);
DCHECK(immersive_presentation_provider_); DCHECK(immersive_presentation_provider_.is_bound());
XRViewport* left = layer->GetViewportForEye(XRView::kEyeLeft); XRViewport* left = layer->GetViewportForEye(XRView::kEyeLeft);
XRViewport* right = layer->GetViewportForEye(XRView::kEyeRight); XRViewport* right = layer->GetViewportForEye(XRView::kEyeRight);
...@@ -611,6 +621,8 @@ void XRFrameProvider::Trace(Visitor* visitor) const { ...@@ -611,6 +621,8 @@ void XRFrameProvider::Trace(Visitor* visitor) const {
visitor->Trace(xr_); visitor->Trace(xr_);
visitor->Trace(frame_transport_); visitor->Trace(frame_transport_);
visitor->Trace(immersive_session_); visitor->Trace(immersive_session_);
visitor->Trace(immersive_data_provider_);
visitor->Trace(immersive_presentation_provider_);
visitor->Trace(non_immersive_data_providers_); visitor->Trace(non_immersive_data_providers_);
visitor->Trace(requesting_sessions_); visitor->Trace(requesting_sessions_);
} }
......
...@@ -6,10 +6,13 @@ ...@@ -6,10 +6,13 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_PROVIDER_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_PROVIDER_H_
#include "device/vr/public/mojom/vr_service.mojom-blink.h" #include "device/vr/public/mojom/vr_service.mojom-blink.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/geometry/int_size.h" #include "third_party/blink/renderer/platform/geometry/int_size.h"
#include "third_party/blink/renderer/platform/heap/disallow_new_wrapper.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
#include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
namespace blink { namespace blink {
...@@ -77,16 +80,20 @@ class XRFrameProvider final : public GarbageCollected<XRFrameProvider> { ...@@ -77,16 +80,20 @@ class XRFrameProvider final : public GarbageCollected<XRFrameProvider> {
// Immersive session state // Immersive session state
Member<XRSession> immersive_session_; Member<XRSession> immersive_session_;
Member<XRFrameTransport> frame_transport_; Member<XRFrameTransport> frame_transport_;
mojo::Remote<device::mojom::blink::XRFrameDataProvider> HeapMojoRemote<device::mojom::blink::XRFrameDataProvider,
HeapMojoWrapperMode::kWithoutContextObserver>
immersive_data_provider_; immersive_data_provider_;
mojo::Remote<device::mojom::blink::XRPresentationProvider> HeapMojoRemote<device::mojom::blink::XRPresentationProvider,
HeapMojoWrapperMode::kWithoutContextObserver>
immersive_presentation_provider_; immersive_presentation_provider_;
device::mojom::blink::VRPosePtr immersive_frame_pose_; device::mojom::blink::VRPosePtr immersive_frame_pose_;
bool is_immersive_frame_position_emulated_ = false; bool is_immersive_frame_position_emulated_ = false;
// Non-immersive session state // Non-immersive session state
HeapHashMap<Member<XRSession>, HeapHashMap<Member<XRSession>,
mojo::Remote<device::mojom::blink::XRFrameDataProvider>> Member<DisallowNewWrapper<HeapMojoRemote<
device::mojom::blink::XRFrameDataProvider,
HeapMojoWrapperMode::kWithoutContextObserver>>>>
non_immersive_data_providers_; non_immersive_data_providers_;
HeapHashMap<Member<XRSession>, device::mojom::blink::XRFrameDataPtr> HeapHashMap<Member<XRSession>, device::mojom::blink::XRFrameDataPtr>
requesting_sessions_; requesting_sessions_;
......
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