簡體   English   中英

D3D設備過早失效或損壞

[英]D3D device invalidated or destroyed prematurely

Windows 10更新后,我的軟件的至少一個用戶遇到了非常奇怪的崩潰。 此崩潰總是發生在同一位置,並且看起來好像IDirect3DDevice9在上一次調用期間已被破壞或以某種方式失效。

程序中沒有其他東西會過早釋放或破壞此設備,並且沒有其他線程可能會干擾。 用戶曾說過更新視頻驅動程序不能解決問題,其圖形卡是Nvidia GTX 1060 6GB,因此稍舊一些,但絕不是土豆。

IDirect3DSurface9 *s;
HRESULT hr = m_d3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&s);
if(FAILED(hr)) {
    ...
    return;
}

// crash happens here, when pushing m_d3dDevice to the stack before the call
m_d3dDevice->SetRenderTarget(0,s);

上面的代碼在校准SetRenderTarget之前崩潰。 m_d3dDevice值從成功讀取this ,但是當指針再次取消引用得到vftable,程序崩潰。 這是反匯編:

mov     eax, [edi+1Ch]      ; read m_d3dDevice
push    [ebp+var_E0]        ; push s
push    0                   ; push 0
mov     ecx, [eax]          ; load vftable; crashes here
push    eax                 ; push m_d3dDevice (this)
call    dword ptr [ecx+94h] ; call SetRenderTarget

在此之前,對GetBackBuffer()的調用已成功完成。 沒有成功完成,它將無法使用該功能。 在這段時間內,我的代碼中沒有其他任何東西可以破壞設備或該代碼所屬的對象。

另外,我應該提到的是,此代碼位於最終的演示程序中,通常僅在其他渲染步驟完成后才調用該代碼。 (在SetRenderTarget()之后,在調用Present()之前,使用特殊的着色器將用於所有繪圖的臨時表面渲染到后台緩沖區以進行放大)。就在調用此代碼之前,已確認設備通過TestCooperativeLevel()仍處於活動狀態,因此如果設備不准備執行任何此操作,則不會到達此代碼。

據我所知,並不是每個用戶都會發生此崩潰,而是只有部分用戶(一個已確認,可能兩個)會發生此崩潰。 問題是否可能,甚至可能在系統上存在其他程序? 我不知道為什么即使出現這種情況也會顯得出乎意料,但是我不知道為什么在第二次呼叫發生時設備被破壞/無效,而在第一次呼叫中卻完全有效。

對此問題的更新:報告此問題的用戶正在使用MSI Afterburner,這顯然是造成此問題的原因。 關閉Afterburner后,該應用程序正確運行。 我是正確的,外部程序正在干擾,盡管仍然不清楚為什么Windows 10更新會影響它。 這表明Afterburner執行了一些DirectX掛鈎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM