我使用以下代码锁定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.所有驱动程序都更新到最新版本。如果您需要任何信息,请告诉我。谢谢!