为什么directx9 AddDirtyRect会导致英特尔集成显卡出现内存冲突?

时间:2018-04-24 13:26:05

标签: graphics directx driver direct3d directx-9

我使用以下代码锁定IDirect3DTexture9以进行更新。这段代码在我的NVidia显卡(NVidia GeForce GTX 970M)上工作正常,但在Intel集成显卡(Intel HD Graphics 530)上导致内存违规,即使纹理立即解锁,也没有数据写入锁定区域。 x,y,w和h参数远离边界条件,因此锁定的rect完全位于纹理内部。

void InnerLock(int x, int y, int w, int h, D3DLOCKED_RECT *lr)
{
    int left, right, top, bottom;
    left = clamp(x, 0, Width() - 1);
    top = clamp(y, 0, Height() - 1);
    right = clamp(x + w, left + 1, Width());
    bottom = clamp(y + h, top + 1, Height());
    RECT rc = { left, top, right, bottom };

    texture->LockRect(0, lr, &rc, D3DLOCK_NO_DIRTY_UPDATE);
    // this line returns zero but causes an exception on igdumdim32.dll later
    texture->AddDirtyRect(&rc)

    // everything become all right when I set the whole texture as dirty region
    //RECT fc = { 0, 0, Width(), Height() };
    //texture->AddDirtyRect(&fc);
}

AddDirtyRect运算符返回正确的值,但稍后在igdumdim32.dll中发生错误(我不确定错误的确切位置,也许在绘制调用中)。

使用带有零标志的LockRect时,我首先发现了错误。程序崩溃了一些rect参数(在我的情况下,当rect的y值足够大但仍然小于纹理高度时发生错误)。然后我使用D3DLOCK_NO_DIRTY_UPDATE并手动添加脏rect。只有在调用AddDirtyRect时才会出现错误。

此错误在使用intel显卡的其他用户上重现。我的操作系统是Windows 10.所有驱动程序都更新到最新版本。如果您需要任何信息,请告诉我。谢谢!

0 个答案:

没有答案