Почему DirectX9 AddDirtyRect вызывает нарушение памяти на интегрированной графике Intel? - PullRequest
0 голосов
/ 24 апреля 2018

Я использую следующий код для блокировки IDirect3DTexture9 для обновления. Этот фрагмент кода отлично работает на моей графической карте NVidia (NVidia GeForce GTX 970M), но вызывает нарушение памяти на встроенной графической карте Intel (Intel HD Graphics 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 (я не уверен, где именно происходит ошибка, возможно, при вызове отрисовки).

Впервые я обнаружил ошибку при использовании LockRect с нулевым флагом. В программе произошел сбой по некоторому параметру rect (в моем случае ошибка произошла, когда значение y прямоугольника достаточно велико, но все же меньше высоты текстуры). Затем я использовал D3DLOCK_NO_DIRTY_UPDATE и вручную добавил грязный прямоугольник. Ошибка возникает только при вызове AddDirtyRect.

Эта ошибка воспроизводится другим пользователем с видеокартой Intel. Моя операционная система Windows 10. Все драйверы обновлены до последней версии. Если вам нужна какая-либо информация, пожалуйста, сообщите мне. Спасибо!

...