Строки ошибок захвата слоя отладки DirectX 11 - PullRequest
0 голосов
/ 02 декабря 2018

У меня работает DirectX Debug Layer, и он выводит ошибки и предупреждения в окно вывода в Visual Studio.Вот, например, это (не фактическая проблема, с которой я сталкиваюсь):

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]

У меня есть специальная система регистрации, которая сохраняет файлы и распечатывает их в других окнах.Я хотел бы захватить строки сообщения отладки и отобразить их по-своему.Это поддерживается?Если да, то как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 05 августа 2019

Поскольку я сам столкнулся с этой проблемой и нашел предыдущий ответ немного тусклым, я хочу дать более подробное решение, теперь, когда у меня это работает:

Все вызовы API, на которые я буду ссылаться, могут бытьнайдено здесь

Можно получить сообщения из DirectX11, прочитав их из внутренней очереди сообщений, доступ к которой можно получить, вызвав ID3D11InfoQueue :: GetMessage , который принимаетиндекс получаемого сообщения и заполняет предоставленный буфер структурой D3D11_MESSAGE , которая содержит всю необходимую информацию (серьезность, категорию, идентификатор и текст).

Однако я обнаружил, что этобуфер был пуст (вызвав ID3D11InfoQueue :: GetNumStoredMessages ), когда я попытался перебрать его.Похоже, это произошло из-за некоторой фильтрации.Чтобы среда выполнения фактически заполнила этот буфер, мне сначала нужно было вызвать ID3D11InfoQueue :: PushEmptyStorageFilter , который выдвигает фильтр, который не отфильтровывает никаких сообщений:

//HANDLE_HRESULT is just a macro of mine to check for S_OK return value
HANDLE_HRESULT(debug_info_queue->PushEmptyStorageFilter());

ЭтоФильтрация - это та часть, которая на самом деле обсуждается в посте блога, на который ссылается ответ Чака Уолборна (несмотря на то, что ссылка только направляет меня на главную страницу, реальное сообщение в блоге - здесь ).Хотя он не содержит никакой информации о том, как перенаправить сообщения.

После того, как сообщения сгенерированы, вы можете перебирать их так:

UINT64 message_count = debug_info_queue->GetNumStoredMessages();

for(UINT64 i = 0; i < message_count; i++){
    SIZE_T message_size = 0;
    debug_info_queue->GetMessage(i, nullptr, &message_size); //get the size of the message

    D3D11_MESSAGE* message = (D3D11_MESSAGE*) malloc(message_size); //allocate enough space
    HANDLE_HRESULT(debug_info_queue->GetMessage(i, message, &message_size)); //get the actual message

    //do whatever you want to do with it
    printf("Directx11: %.*s", message->DescriptionByteLength, message->pDescription);

    free(message);
}

debug_info_queue->ClearStoredMessages();

debug_info_queue ID3D11InfoQueue интерфейс и может быть получено так:

ID3D11InfoQueue* debug_info_queue;
HANDLE_HRESULT(device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)&debug_info_queue));
0 голосов
/ 03 декабря 2018

Вы используете интерфейс ID3D11InfoQueue для реализации собственного вывода отладочного сообщения.

using Microsoft::WRL::ComPtr;

ComPtr<ID3D11Debug> d3dDebug;
if (SUCCEEDED(device.As(&d3dDebug)))
{
    ComPtr<ID3D11InfoQueue> d3dInfoQueue;
    if (SUCCEEDED(d3dDebug.As(&d3dInfoQueue)))
    {

См. это сообщение в блоге

...