D3DERR_INVALIDCALL в d3d-> CreateDevice вызывает мерцание окна при запуске в программе Allegro 5 D3D - PullRequest
4 голосов
/ 15 апреля 2019

Я работаю над отладкой мерцания при создании окна при создании окна 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

1 Ответ

1 голос
/ 29 апреля 2019

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

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

...