D3DERR_INVALIDCALL в d3d->CreateDevice вызывает мерцание окна при запуске в программе Allegro 5 D3D

Я работаю над отладкой мерцания создания окна при создании окна Allegro 5 Direct3D с включенной множественной выборкой. Я сузил проблему до создания окна в исходном файле allegro d3d_disp.cpp. Однако я не могу получить какие-либо отладочные данные из DirectX. Мерцание происходит только в режиме D3D (не OpenGL) и только при включении множественной выборки. Также следует отметить, что это происходит только при запуске программы на графическом процессоре NVIDIA, а не на моем встроенном процессоре Intel.

Я использую Windows 10.

Я пытался отладить это в Visual Studio 2017, но он не фиксирует вывод отладки из DX. Я установил символы отладки DirectX при установке DirectX SDK с июня 2010 года.

Я попытался перестроить allegro и связать libd3dx9d.a в gcc, но я все еще не могу перейти к вызовам функций DirectX, а символы не загружаются. Нет доступной библиотеки libd3d9d.a (обратите внимание на d для отладки) в MinGW-W64 GCC 8.1 или в DirectX SDK с июня 2010 года.

Я попытался запустить свою программу через PIX, но она выдает ошибку несовместимости, которую я не могу решить.

Вот проверяемый пример кода allegro 5:

#include <allegro5/allegro.h>
#include <allegro5/allegro_color.h>
#include <allegro5/allegro_primitives.h> 
#include <allegro5/allegro_direct3d.h>

#include <cstdio>
#include <climits>

int main(int argc, char **argv) {

    if (!al_init()) { return 1; }
    al_init_primitives_addon();
    al_install_keyboard();

    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
    if (!queue) { return 2; }
    al_register_event_source(queue, al_get_keyboard_event_source());

    al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_REQUIRE);
    al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST);

    bool use_opengl = false;
    if (use_opengl) {
        al_set_new_display_flags(ALLEGRO_OPENGL);
    }
    else {
        al_set_new_display_flags(ALLEGRO_DIRECT3D);
    }
    ALLEGRO_DISPLAY *display = al_create_display(1024, 600);
    if (!display) { return 2; }
    if (use_opengl) {
        al_set_window_title(display, "OpenGL window");
    }
    else {
        al_set_window_title(display, "Direct3D window");
    }
    al_register_event_source(queue, al_get_display_event_source(display));


    al_clear_to_color(al_color_name("black"));
    al_draw_circle(500, 300, 200, al_color_name("white"), 5.0);
    al_draw_line(200, 200, 700, 300, al_color_name("white"), 5.0);
    al_flip_display();

    bool quit = false;
    while (!quit) {
        ALLEGRO_EVENT ev;
        al_wait_for_event(queue, &ev);
        if (ev.type == ALLEGRO_EVENT_KEY_DOWN && ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { quit = true; }
        if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { quit = true; }
    }
    return 0;
}

В идеале окно не мерцает при создании. Существует множество программ, использующих Direct3D, которые не мерцают при создании окна.

Я сузил проблему до неудачных вызовов d3d->CreateDevice, возвращающих D3DERR_INVALIDCALL в этих строках в src\win\d3d_disp.cpp в исходном коде allegro здесь: https://github.com/liballeg/allegro5/blob/master/src/win/d3d_disp.cpp#L812-L837

Мне нужна помощь в получении отладочного вывода из DirectX, и пока ничего не работает. Приветствуются любые советы по отладке с помощью DirectX9, VS 2017 (и/или) MinGW-W64 GCC 8.1 и GDB или других методов.

EDIT Обновленная информация о том, что я пробовал.

Определение D3D_DEBUG_INFO перед включением d3d9.h, похоже, ничего не дало при перестроении allegro.

Включение вывода отладки DirectX в dxcpl ничего не дало.

Попытка запустить мое приложение через PIX приводит к ошибке несовместимости. В нем говорится, что подверсии DirectX не совпадают между приложением и средой выполнения pix. Как собрать для определенной версии DLL DirectX?

Я обнаружил, что когда мультисэмплинг включен через D3D_PRESENT_PARAMETERS, эффект подкачки должен быть D3DSWAPEFFECT_DISCARD. Исправил, ничего не изменилось.

Все еще получаю D3DERR_INVALIDCALL. Я не вижу в параметрах презентации ничего, что не было бы инициализировано.

Если я не могу включить отладочный вывод DirectX, я действительно не могу сказать, почему возникает эта ошибка.

Советы по отладке приветствуются. Я вижу, что создание окна несколько раз терпит неудачу, прежде чем оно удается, и поэтому окно мерцает.

EDIT2 Похоже, проблема связана с указанным BackBufferFormat, так как это единственная разница между успешным созданием окна и неудачей.

EDIT3 BackBufferFormat в порядке. Настоящая разница заключалась в уровне качества предпринятой попытки множественной выборки. Согласно

https://github.com/liballeg/allegro5/blob/master/src/win/d3d_display_formats.cpp#L95

и

CheckDeviceMultiSampleType

было отклонение на одну ошибку, из-за которой он попытался установить уровень качества, который был отключен на единицу. уровни качества указывают количество, а не максимальный индекс.

Мерцание исчезло, но необходимо провести дополнительные испытания.

Что касается дополнительного вопроса, как я могу включить отладочную информацию с DirectX? Ничто из того, что я сделал, не сработало, как указано выше. Я дам ответ любому, кто может помочь мне добиться отладочного вывода из D3D и DX.

@Gull_Code Если хотите, вы можете клонировать мою тестовую вилку allegro здесь:

https://github.com/EdgarReynaldo/allegro5/tree/test

Багсквошер


person BugSquasher    schedule 15.04.2019    source источник


Ответы (1)


Каждый поиск, который я делал по этой теме, возвращал одни и те же 3 решения:
-Плохой драйвер, обновление или понижение версии
-Плохая установка DirectX, на форумах Microsoft они попросили парня удалить DirectX, удалить корневую запись реестра для это, переустановите directx
-Многие указывали на то, что это происходит, когда структура D3D частично инициализируется, не предоставляя полностью инициализированную структуру...

Я вернусь, если у меня будет дополнительная информация.

person Gull_Code    schedule 29.04.2019
comment
Эй, Галли, спасибо, у тебя есть какие-нибудь ссылки, по которым можно перейти? @Gull_Code - person BugSquasher; 29.04.2019
comment
Структура обнулена и инициализирована afaics, но кто знает, может быть, ей нужно указать другое значение - person BugSquasher; 29.04.2019
comment
Это первые 10 ссылок, которые я получил при поиске D3DERR_INVALIDCALL в Duckduckgo. В одном из них говорилось, что буфер 1x1 может не поддерживаться, здесь: > stackoverflow.com/questions/9526428/ - person Gull_Code; 01.05.2019
comment
Я перешел по большинству ссылок, и ничего из того, что я пробовал, пока не помогло. См. мое редактирование выше. - person BugSquasher; 08.05.2019
comment
Я прочитал правки. Дело с бэкбуфером может быть подсказкой. Попробую нырнуть в первоисточник, когда вернусь домой (на праздники банкомат и с дрянной лапушкой) - person Gull_Code; 10.05.2019