Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: third_party/WebKit/Source/modules/vr/VRDisplay.cpp

Issue 2420743003: mojo VR interface simplified (Closed)
Patch Set: Address bajones@ comments and some clean up Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/vr/VRDisplay.h" 5 #include "modules/vr/VRDisplay.h"
6 6
7 #include "core/dom/DOMException.h" 7 #include "core/dom/DOMException.h"
8 #include "core/dom/Fullscreen.h" 8 #include "core/dom/Fullscreen.h"
9 #include "core/frame/UseCounter.h" 9 #include "core/frame/UseCounter.h"
10 #include "core/inspector/ConsoleMessage.h" 10 #include "core/inspector/ConsoleMessage.h"
(...skipping 28 matching lines...) Expand all
39 : m_navigatorVR(navigatorVR), 39 : m_navigatorVR(navigatorVR),
40 m_displayId(0), 40 m_displayId(0),
41 m_isConnected(false), 41 m_isConnected(false),
42 m_isPresenting(false), 42 m_isPresenting(false),
43 m_canUpdateFramePose(true), 43 m_canUpdateFramePose(true),
44 m_capabilities(new VRDisplayCapabilities()), 44 m_capabilities(new VRDisplayCapabilities()),
45 m_eyeParametersLeft(new VREyeParameters()), 45 m_eyeParametersLeft(new VREyeParameters()),
46 m_eyeParametersRight(new VREyeParameters()), 46 m_eyeParametersRight(new VREyeParameters()),
47 m_depthNear(0.01), 47 m_depthNear(0.01),
48 m_depthFar(10000.0), 48 m_depthFar(10000.0),
49 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck) {} 49 m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck),
50 m_binding(this) {}
50 51
51 VRDisplay::~VRDisplay() {} 52 VRDisplay::~VRDisplay() {}
52 53
53 VRController* VRDisplay::controller() { 54 VRController* VRDisplay::controller() {
54 return m_navigatorVR->controller(); 55 return m_navigatorVR->controller();
55 } 56 }
56 57
57 void VRDisplay::update(const device::blink::VRDisplayPtr& display) { 58 void VRDisplay::update(const device::blink::VRDisplayPtr& display) {
58 m_displayId = display->index; 59 m_displayId = display->index;
59 m_displayName = display->displayName; 60 m_displayName = display->displayName;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 if (!m_framePose) 103 if (!m_framePose)
103 return nullptr; 104 return nullptr;
104 105
105 VRPose* pose = VRPose::create(); 106 VRPose* pose = VRPose::create();
106 pose->setPose(m_framePose); 107 pose->setPose(m_framePose);
107 return pose; 108 return pose;
108 } 109 }
109 110
110 void VRDisplay::updatePose() { 111 void VRDisplay::updatePose() {
111 if (m_canUpdateFramePose) { 112 if (m_canUpdateFramePose) {
112 m_framePose = controller()->getPose(m_displayId); 113 if (!m_service)
114 return;
115 device::blink::VRPosePtr pose;
116 m_service->GetPose(&pose);
117 m_framePose = std::move(pose);
113 if (m_isPresenting) 118 if (m_isPresenting)
114 m_canUpdateFramePose = false; 119 m_canUpdateFramePose = false;
115 } 120 }
116 } 121 }
117 122
118 void VRDisplay::resetPose() { 123 void VRDisplay::resetPose() {
119 controller()->resetPose(m_displayId); 124 if (!m_service)
125 return;
126
127 m_service->ResetPose();
120 } 128 }
121 129
122 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) { 130 VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) {
123 switch (stringToVREye(whichEye)) { 131 switch (stringToVREye(whichEye)) {
124 case VREyeLeft: 132 case VREyeLeft:
125 return m_eyeParametersLeft; 133 return m_eyeParametersLeft;
126 case VREyeRight: 134 case VREyeRight:
127 return m_eyeParametersRight; 135 return m_eyeParametersRight;
128 default: 136 default:
129 return nullptr; 137 return nullptr;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 Fullscreen::requestFullscreen(*m_layer.source(), 240 Fullscreen::requestFullscreen(*m_layer.source(),
233 Fullscreen::UnprefixedRequest); 241 Fullscreen::UnprefixedRequest);
234 242
235 // Check to see if the canvas is still the current fullscreen 243 // Check to see if the canvas is still the current fullscreen
236 // element once per second. 244 // element once per second.
237 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE); 245 m_fullscreenCheckTimer.startRepeating(1.0, BLINK_FROM_HERE);
238 } 246 }
239 247
240 if (firstPresent) { 248 if (firstPresent) {
241 bool secureContext = scriptState->getExecutionContext()->isSecureContext(); 249 bool secureContext = scriptState->getExecutionContext()->isSecureContext();
242 controller()->requestPresent(resolver, m_displayId, secureContext); 250 if (!m_service) {
251 DOMException* exception = DOMException::create(
252 InvalidStateError, "The service is no longer active.");
253 resolver->reject(exception);
254 return promise;
255 }
256 m_service->RequestPresent(
257 secureContext, convertToBaseCallback(WTF::bind(
258 &VRDisplay::onPresentComplete, wrapPersistent(this),
259 wrapPersistent(resolver))));
243 } else { 260 } else {
244 updateLayerBounds(); 261 updateLayerBounds();
245 resolver->resolve(); 262 resolver->resolve();
246 } 263 }
247 264
248 return promise; 265 return promise;
249 } 266 }
250 267
268 void VRDisplay::onPresentComplete(ScriptPromiseResolver* resolver,
269 bool success) {
270 if (success) {
271 this->beginPresent(resolver);
272 } else {
273 this->forceExitPresent();
274 DOMException* exception = DOMException::create(
275 NotAllowedError, "Presentation request was denied.");
276 resolver->reject(exception);
277 }
278 }
279
251 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) { 280 ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) {
252 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 281 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
253 ScriptPromise promise = resolver->promise(); 282 ScriptPromise promise = resolver->promise();
254 283
255 if (!m_isPresenting) { 284 if (!m_isPresenting) {
256 // Can't stop presenting if we're not presenting. 285 // Can't stop presenting if we're not presenting.
257 DOMException* exception = 286 DOMException* exception =
258 DOMException::create(InvalidStateError, "VRDisplay is not presenting."); 287 DOMException::create(InvalidStateError, "VRDisplay is not presenting.");
259 resolver->reject(exception); 288 resolver->reject(exception);
260 return promise; 289 return promise;
261 } 290 }
262 291
263 controller()->exitPresent(m_displayId); 292 if (!m_service) {
293 DOMException* exception =
294 DOMException::create(InvalidStateError, "VRService is not available.");
295 resolver->reject(exception);
296 return promise;
297 }
298 m_service->ExitPresent();
264 299
265 resolver->resolve(); 300 resolver->resolve();
266 301
267 forceExitPresent(); 302 forceExitPresent();
268 303
269 return promise; 304 return promise;
270 } 305 }
271 306
272 void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) { 307 void VRDisplay::beginPresent(ScriptPromiseResolver* resolver) {
273 if (m_capabilities->hasExternalDisplay()) { 308 if (m_capabilities->hasExternalDisplay()) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 rightBounds->width = m_layer.rightBounds()[2]; 368 rightBounds->width = m_layer.rightBounds()[2];
334 rightBounds->height = m_layer.rightBounds()[3]; 369 rightBounds->height = m_layer.rightBounds()[3];
335 } else { 370 } else {
336 // Right eye defaults 371 // Right eye defaults
337 rightBounds->left = 0.5f; 372 rightBounds->left = 0.5f;
338 rightBounds->top = 0.0f; 373 rightBounds->top = 0.0f;
339 rightBounds->width = 0.5f; 374 rightBounds->width = 0.5f;
340 rightBounds->height = 1.0f; 375 rightBounds->height = 1.0f;
341 } 376 }
342 377
343 controller()->updateLayerBounds(m_displayId, std::move(leftBounds), 378 if (!m_service)
344 std::move(rightBounds)); 379 return;
380
381 m_service->UpdateLayerBounds(std::move(leftBounds), std::move(rightBounds));
345 } 382 }
346 383
347 HeapVector<VRLayer> VRDisplay::getLayers() { 384 HeapVector<VRLayer> VRDisplay::getLayers() {
348 HeapVector<VRLayer> layers; 385 HeapVector<VRLayer> layers;
349 386
350 if (m_isPresenting) { 387 if (m_isPresenting) {
351 layers.append(m_layer); 388 layers.append(m_layer);
352 } 389 }
353 390
354 return layers; 391 return layers;
(...skipping 26 matching lines...) Expand all
381 gl->ClearColor((idx & 255) / 255.0f, ((idx >> 8) & 255) / 255.0f, 418 gl->ClearColor((idx & 255) / 255.0f, ((idx >> 8) & 255) / 255.0f,
382 ((idx >> 16) & 255) / 255.0f, 1.0f); 419 ((idx >> 16) & 255) / 255.0f, 1.0f);
383 gl->Clear(GL_COLOR_BUFFER_BIT); 420 gl->Clear(GL_COLOR_BUFFER_BIT);
384 421
385 // Set the GL state back to what was set by the WebVR application. 422 // Set the GL state back to what was set by the WebVR application.
386 m_renderingContext->restoreScissorEnabled(); 423 m_renderingContext->restoreScissorEnabled();
387 m_renderingContext->restoreScissorBox(); 424 m_renderingContext->restoreScissorBox();
388 m_renderingContext->restoreColorMask(); 425 m_renderingContext->restoreColorMask();
389 m_renderingContext->restoreClearColor(); 426 m_renderingContext->restoreClearColor();
390 427
391 controller()->submitFrame(m_displayId, m_framePose.Clone()); 428 if (!m_service)
429 return;
430
431 m_service->SubmitFrame(m_framePose.Clone());
392 m_canUpdateFramePose = true; 432 m_canUpdateFramePose = true;
393 } 433 }
394 434
435 void VRDisplay::OnDisplayChanged(device::blink::VRDisplayPtr display) {
436 update(display);
437 }
438
439 void VRDisplay::OnExitPresent() {
440 forceExitPresent();
441 }
442
443 void VRDisplay::OnDisplayConnected(device::blink::VRDisplayPtr display) {
444 update(display);
445
446 m_navigatorVR->fireVREvent(VRDisplayEvent::create(
447 EventTypeNames::vrdisplayconnect, true, false, this, "connect"));
448 }
449
450 void VRDisplay::OnDisplayDisconnected() {
451 m_navigatorVR->fireVREvent(VRDisplayEvent::create(
452 EventTypeNames::vrdisplaydisconnect, true, false, this, "disconnect"));
453 }
454
395 void VRDisplay::onFullscreenCheck(TimerBase*) { 455 void VRDisplay::onFullscreenCheck(TimerBase*) {
396 // TODO: This is a temporary measure to track if fullscreen mode has been 456 // TODO: This is a temporary measure to track if fullscreen mode has been
397 // exited by the UA. If so we need to end VR presentation. Soon we won't 457 // exited by the UA. If so we need to end VR presentation. Soon we won't
398 // depend on the Fullscreen API to fake VR presentation, so this will 458 // depend on the Fullscreen API to fake VR presentation, so this will
399 // become unnessecary. Until that point, though, this seems preferable to 459 // become unnessecary. Until that point, though, this seems preferable to
400 // adding a bunch of notification plumbing to Fullscreen. 460 // adding a bunch of notification plumbing to Fullscreen.
401 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) { 461 if (!Fullscreen::isCurrentFullScreenElement(*m_layer.source())) {
402 m_isPresenting = false; 462 m_isPresenting = false;
403 m_navigatorVR->fireVRDisplayPresentChange(this); 463 m_navigatorVR->fireVRDisplayPresentChange(this);
404 m_fullscreenCheckTimer.stop(); 464 m_fullscreenCheckTimer.stop();
405 controller()->exitPresent(m_displayId); 465 if (!m_service)
466 return;
467 m_service->ExitPresent();
406 } 468 }
407 } 469 }
408 470
471 void VRDisplay::RegisterDisplayService() {
472 m_service->RegisterDisplayService(m_binding.CreateInterfacePtrAndBind());
leonhsl(Using Gerrit) 2016/10/17 09:03:29 As mentioned before, m_binding can only be bound o
shaobo.yan 2016/10/18 01:10:48 Yes. Will update it.
473 }
474
475 void VRDisplay::shutdownMessagePipe() {
476 m_binding.Close();
477 }
478
409 DEFINE_TRACE(VRDisplay) { 479 DEFINE_TRACE(VRDisplay) {
410 visitor->trace(m_navigatorVR); 480 visitor->trace(m_navigatorVR);
411 visitor->trace(m_capabilities); 481 visitor->trace(m_capabilities);
412 visitor->trace(m_stageParameters); 482 visitor->trace(m_stageParameters);
413 visitor->trace(m_eyeParametersLeft); 483 visitor->trace(m_eyeParametersLeft);
414 visitor->trace(m_eyeParametersRight); 484 visitor->trace(m_eyeParametersRight);
415 visitor->trace(m_layer); 485 visitor->trace(m_layer);
416 visitor->trace(m_renderingContext); 486 visitor->trace(m_renderingContext);
417 } 487 }
418 488
419 } // namespace blink 489 } // namespace blink
OLDNEW
« device/vr/vr_service_impl.cc ('K') | « third_party/WebKit/Source/modules/vr/VRDisplay.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698