为什么directx9 AddDirtyRect会导致Intel integrated graphics内存冲突?

为什么directx9 AddDirtyRect会导致Intel integrated graphics内存冲突?,graphics,directx,driver,direct3d,directx-9,Graphics,Directx,Driver,Direct3d,Directx 9,我使用以下代码锁定IDirect3DTexture9进行更新。这段代码在我的NVidia图形卡(NVidia GeForce GTX 970M)上运行良好,但在英特尔集成图形卡(英特尔高清图形530)上会导致内存冲突,甚至纹理会立即解锁,锁定区域上也不会写入任何数据。x、 y、w和h参数远离边界条件,因此锁定的矩形完全位于纹理内部 void InnerLock(int x, int y, int w, int h, D3DLOCKED_RECT *lr) { int left, righ

我使用以下代码锁定IDirect3DTexture9进行更新。这段代码在我的NVidia图形卡(NVidia GeForce GTX 970M)上运行良好,但在英特尔集成图形卡(英特尔高清图形530)上会导致内存冲突,甚至纹理会立即解锁,锁定区域上也不会写入任何数据。x、 y、w和h参数远离边界条件,因此锁定的矩形完全位于纹理内部

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中(我不确定错误确切发生在哪里,可能是在draw调用中)

我第一次发现错误是在使用带有零标志的LockRect时。程序在某个rect参数上崩溃(在我的例子中,错误发生在rect的y值足够大,但仍然小于纹理高度时)。然后我使用D3DLOCK_NO_DIRTY_UPDATE并手动添加DIRTY rect。该错误仅在调用AddDirtyRect时发生


此错误会在另一个使用英特尔图形卡的用户上重现。我的操作系统是Windows 10。所有驱动程序均更新至最新版本。如果你需要任何信息,请告诉我。谢谢大家!

在Windows 8.x或Windows 10上开发Direct3D 9是一项相当具有挑战性的工作。这是一个遗留API,专门用于appcompat,而不是今天应该使用Direct3D 11或Direct3D 12的开发。支持Direct3D 9调试设备(又称Direct3D开发人员运行时)的上一个Windows版本是Windows 7。这里可能有一个驱动程序错误,因为像这样肮脏的矩形使用非常罕见。@ChuckWalbourn谢谢你的回复。我已经发现Direct3D调试设备在Windows 10上无法工作。但我的程序是一个遗留游戏框架的实现,旨在支持一些旧系统。我想知道是否有任何方法和工具可以帮助调试和修复此类问题。你所说的“一些旧系统”到底是什么意思?多少岁?要真正进行Direct3D 9调试,您需要一个Windows 7系统或虚拟机。@ChuckWalbourn这是Windows 2000或XP。我将安装一个VM进行调试。谢谢。你真的需要在最低限度支持的硬件和操作系统平台上以及新的平台上开发和测试东西(尽管在较新的系统中缺乏支持,但使用较新的硬件很容易意外地依赖以前不存在的功能)。但你真的需要2000、XP或Vista吗?没有多少人使用这些,而且份额只会下降。即使性能不重要,使用7+版的现代D3D11 API也会让您更轻松。