fix device lost
This commit is contained in:
parent
a1f03ee42c
commit
181f324473
1 changed files with 29 additions and 6 deletions
|
@ -191,18 +191,28 @@ impl DirectXRenderer {
|
||||||
|
|
||||||
fn handle_device_lost(&mut self) -> Result<()> {
|
fn handle_device_lost(&mut self) -> Result<()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
ManuallyDrop::drop(&mut self.devices);
|
#[cfg(debug_assertions)]
|
||||||
|
report_live_objects(&self.devices.device)
|
||||||
|
.context("Failed to report live objects after device lost")
|
||||||
|
.log_err();
|
||||||
|
|
||||||
ManuallyDrop::drop(&mut self.resources);
|
ManuallyDrop::drop(&mut self.resources);
|
||||||
|
self.devices.device_context.OMSetRenderTargets(None, None);
|
||||||
|
self.devices.device_context.ClearState();
|
||||||
|
self.devices.device_context.Flush();
|
||||||
|
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
report_live_objects(&self.devices.device)
|
||||||
|
.context("Failed to report live objects after device lost")
|
||||||
|
.log_err();
|
||||||
|
|
||||||
|
ManuallyDrop::drop(&mut self.devices);
|
||||||
#[cfg(not(feature = "enable-renderdoc"))]
|
#[cfg(not(feature = "enable-renderdoc"))]
|
||||||
ManuallyDrop::drop(&mut self._direct_composition);
|
ManuallyDrop::drop(&mut self._direct_composition);
|
||||||
}
|
}
|
||||||
|
|
||||||
let devices =
|
let devices =
|
||||||
ManuallyDrop::new(DirectXDevices::new().context("Recreating DirectX devices")?);
|
ManuallyDrop::new(DirectXDevices::new().context("Recreating DirectX devices")?);
|
||||||
unsafe {
|
|
||||||
devices.device_context.OMSetRenderTargets(None, None);
|
|
||||||
devices.device_context.ClearState();
|
|
||||||
devices.device_context.Flush();
|
|
||||||
}
|
|
||||||
#[cfg(not(feature = "enable-renderdoc"))]
|
#[cfg(not(feature = "enable-renderdoc"))]
|
||||||
let resources =
|
let resources =
|
||||||
DirectXResources::new(&devices, self.resources.width, self.resources.height)?;
|
DirectXResources::new(&devices, self.resources.width, self.resources.height)?;
|
||||||
|
@ -908,6 +918,8 @@ struct PathSprite {
|
||||||
|
|
||||||
impl Drop for DirectXRenderer {
|
impl Drop for DirectXRenderer {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
report_live_objects(&self.devices.device).ok();
|
||||||
unsafe {
|
unsafe {
|
||||||
ManuallyDrop::drop(&mut self.devices);
|
ManuallyDrop::drop(&mut self.devices);
|
||||||
ManuallyDrop::drop(&mut self.resources);
|
ManuallyDrop::drop(&mut self.resources);
|
||||||
|
@ -1350,6 +1362,17 @@ fn set_pipeline_state(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
fn report_live_objects(device: &ID3D11Device) -> Result<()> {
|
||||||
|
use windows::core::Interface;
|
||||||
|
|
||||||
|
let debug_device: ID3D11Debug = device.cast()?;
|
||||||
|
unsafe {
|
||||||
|
debug_device.ReportLiveDeviceObjects(D3D11_RLDO_DETAIL)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
const BUFFER_COUNT: usize = 3;
|
const BUFFER_COUNT: usize = 3;
|
||||||
|
|
||||||
mod shader_resources {
|
mod shader_resources {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue