Closed Bug 1352376 Opened 7 years ago Closed 7 years ago

Failed to create ContentDevice in content process after device reset

Categories

(Core :: Graphics, enhancement, P3)

enhancement

Tracking

()

RESOLVED FIXED
mozilla55
Tracking Status
firefox55 --- fixed

People

(Reporter: kechen, Assigned: kechen)

References

(Blocks 1 open bug)

Details

Attachments

(1 file, 1 obsolete file)

With GPU process enabled, the program cannot create ContentDevice in content process after device reset.
This is not an expected behavior since we've already successfully created devices in compositor side.
Attached patch Update device status (obsolete) — Splinter Review
The thing is that when creating content device and get the DXGI adapter, we will compare the adapter we get from system and the adapter information from mDeviceStatus[1].

The information in mDeviceStatus should be updated in [2] which will sync the information with GPU process through chrome process; however, the mGPUReady flag blocks the update.

We should reset the flag when device reset happened.

[1] https://dxr.mozilla.org/mozilla-central/rev/8df9fabf2587b7020889755acb9e75b664fe13cf/gfx/thebes/DeviceManagerDx.cpp#228
[2] https://dxr.mozilla.org/mozilla-central/rev/8df9fabf2587b7020889755acb9e75b664fe13cf/gfx/thebes/gfxWindowsPlatform.cpp#445
Attachment #8853367 - Flags: feedback?(dvander)
Assignee: nobody → kechen
Comment on attachment 8853367 [details] [diff] [review]
Update device status

Okay, so if I understand correctly: the content process synchronously requests new device initialization data from the chrome process. The chrome process thinks the GPU is ready, so it doesn't bother blocking on a new device being available.

The callstack for RemoteCompositorSession::Reset looks like:
 RemoteCompositorSession::Reset
 nsBaseWidget::OnRenderingDeviceReset
 RemoteCompositorSession::NotifyDeviceReset (or nsWindow::OnPaint if in-process)
 GPUProcessManager::OnProcessDeviceReset(GPUProcessHost* aHost)
 GPUChild::RecvNotifyDeviceReset()
 [-- IPC --]
 GPUParent::NotifyDeviceReset()

Could we, instead, send the new device information in that NotifyDeviceReset IPC message? Then we don't need to change the GPUReady state or block on the GPU process again.
Attachment #8853367 - Flags: feedback?(dvander)
Attachment #8853367 - Attachment is obsolete: true
Comment on attachment 8854731 [details]
Bug 1352376 - Update device data while processing device reset;

https://reviewboard.mozilla.org/r/126702/#review130026

Thanks! r=me with the aforementioned change removed or split out.

::: gfx/thebes/DeviceManagerDx.cpp:175
(Diff revision 1)
>  
>    // We should have been assigned a DeviceStatus from the parent process,
>    // GPU process, or the same process if using in-process compositing.
>    MOZ_ASSERT(mDeviceStatus);
>  
> -  if (CreateContentDevice() == FeatureStatus::CrashedInHandler) {
> +  if (CreateContentDevice() != FeatureStatus::Available) {

Is this change intended? If so, it should get a separate bug/patch with an explanation, since DisableD3D11AfterCrash() is intended to be called after SEH triggers.
Attachment #8854731 - Flags: review?(dvander) → review+
(In reply to David Anderson [:dvander] from comment #4)
> Comment on attachment 8854731 [details]
> Bug 1352376 - Update device data while processing device reset.
> 
> https://reviewboard.mozilla.org/r/126702/#review130026
> 
> Thanks! r=me with the aforementioned change removed or split out.
> 
> ::: gfx/thebes/DeviceManagerDx.cpp:175
> (Diff revision 1)
> >  
> >    // We should have been assigned a DeviceStatus from the parent process,
> >    // GPU process, or the same process if using in-process compositing.
> >    MOZ_ASSERT(mDeviceStatus);
> >  
> > -  if (CreateContentDevice() == FeatureStatus::CrashedInHandler) {
> > +  if (CreateContentDevice() != FeatureStatus::Available) {
> 
> Is this change intended? If so, it should get a separate bug/patch with an
> explanation, since DisableD3D11AfterCrash() is intended to be called after
> SEH triggers.

I was intended to handle the creation failure of the content device, we only handle FeatureStatus::CrashedInHandler here[1].
But it might be appropriate to discuss this in other bug, so I remove this change.

[1] https://dxr.mozilla.org/mozilla-central/rev/fdd53f7d454d15a0b0d82d6bdae2c4fed837d048/gfx/thebes/DeviceManagerDx.cpp#175
Pushed by dmu@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/b147ce9b3241
Update device data while processing device reset; r=dvander
Blocks: 1160157
https://hg.mozilla.org/mozilla-central/rev/b147ce9b3241
Status: NEW → RESOLVED
Closed: 7 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla55
Blocks: 1188006
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: