Я работаю над отладкой мерцания создания окна при создании окна 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
и
было отклонение на одну ошибку, из-за которой он попытался установить уровень качества, который был отключен на единицу. уровни качества указывают количество, а не максимальный индекс.
Мерцание исчезло, но необходимо провести дополнительные испытания.
Что касается дополнительного вопроса, как я могу включить отладочную информацию с DirectX? Ничто из того, что я сделал, не сработало, как указано выше. Я дам ответ любому, кто может помочь мне добиться отладочного вывода из D3D и DX.
@Gull_Code Если хотите, вы можете клонировать мою тестовую вилку allegro здесь:
https://github.com/EdgarReynaldo/allegro5/tree/test
Багсквошер