Поскольку я сам столкнулся с этой проблемой и нашел предыдущий ответ немного тусклым, я хочу дать более подробное решение, теперь, когда у меня это работает:
Все вызовы 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));