From 487ef58ee76b1f95e46be76819b1d32755f59325 Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Fri, 7 Oct 2016 02:39:35 -0400 Subject: [PATCH] libobs-d3d11: Log GetDeviceRemovedReason When DirectX throws error 0x887A0005 (DXGI_ERROR_DEVICE_REMOVED), Microsoft recommends calling ID3D11Device::GetDeviceRemovedReason to retrieve a more precise error code. Closes jp9000/obs-studio#652 --- libobs-d3d11/d3d11-subsystem.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 08a733733..9e2e401af 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -33,6 +33,16 @@ struct UnsupportedHWError : HRError { #pragma warning (disable : 4316) #endif +static inline void LogD3D11ErrorDetails(HRError error, gs_device_t *device) +{ + if (error.hr == DXGI_ERROR_DEVICE_REMOVED) { + HRESULT DeviceRemovedReason = + device->device->GetDeviceRemovedReason(); + blog(LOG_ERROR, " Device Removed Reason: %08lX", + DeviceRemovedReason); + } +} + static const IID dxgiFactory2 = {0x50c83a1c, 0xe072, 0x4c48, {0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0}}; @@ -612,6 +622,7 @@ gs_swapchain_t *device_swapchain_create(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_swapchain_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return swap; @@ -641,6 +652,7 @@ void device_resize(gs_device_t *device, uint32_t cx, uint32_t cy) } catch (HRError error) { blog(LOG_ERROR, "device_resize (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } } @@ -688,6 +700,7 @@ gs_texture_t *device_texture_create(gs_device_t *device, uint32_t width, } catch (HRError error) { blog(LOG_ERROR, "device_texture_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_texture_create (D3D11): %s", error); } @@ -708,6 +721,7 @@ gs_texture_t *device_cubetexture_create(gs_device_t *device, uint32_t size, blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s", error); @@ -743,6 +757,7 @@ gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, } catch (HRError error) { blog(LOG_ERROR, "device_zstencil_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return zstencil; @@ -759,6 +774,7 @@ gs_stagesurf_t *device_stagesurface_create(gs_device_t *device, uint32_t width, blog(LOG_ERROR, "device_stagesurface_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return surf; @@ -774,6 +790,7 @@ gs_samplerstate_t *device_samplerstate_create(gs_device_t *device, blog(LOG_ERROR, "device_samplerstate_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return ss; @@ -791,6 +808,7 @@ gs_shader_t *device_vertexshader_create(gs_device_t *device, blog(LOG_ERROR, "device_vertexshader_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (ShaderError error) { const char *buf = (const char*)error.errors->GetBufferPointer(); @@ -820,6 +838,7 @@ gs_shader_t *device_pixelshader_create(gs_device_t *device, blog(LOG_ERROR, "device_pixelshader_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (ShaderError error) { const char *buf = (const char*)error.errors->GetBufferPointer(); @@ -847,6 +866,7 @@ gs_vertbuffer_t *device_vertexbuffer_create(gs_device_t *device, blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s", error); @@ -865,6 +885,7 @@ gs_indexbuffer_t *device_indexbuffer_create(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_indexbuffer_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return buffer; @@ -1308,6 +1329,7 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode, } catch (HRError error) { blog(LOG_ERROR, "device_draw (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); return; } @@ -1964,6 +1986,7 @@ extern "C" EXPORT gs_texture_t *device_texture_create_gdi(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s", error); } @@ -2018,6 +2041,7 @@ extern "C" EXPORT gs_texture_t *device_texture_open_shared(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s", error); }