Я работаю над отладкой мерцания при создании окна при создании окна Allegro 5 Direct3D с включенной мультисэмплированием. Я сузил проблему до создания окна в исходном файле allegro d3d_disp.cpp. Тем не менее, я не могу получить отладочный вывод из DirectX. Мерцание происходит только в режиме D3D (не OpenGL) и только при включенной мультисэмплинге. Также следует отметить, что это происходит только при запуске программы на NVIDIA GPU, а не на моем интегрированном 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 приводит к ошибке несовместимости. В нем говорится, что subversion DirectX не совпадают между приложением и временем выполнения пикселя. Как собрать для конкретной версии DirectX dll?
Я обнаружил, что когда мультисэмплинг включен через 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
Bugsquasher