Поделиться через


Проверка на основе GPU и уровень отладки Direct3D 12

В этом разделе описывается, как лучше использовать уровень отладки Direct3D 12. Проверка на основе GPU (GBV) включает сценарии проверки на временной шкале GPU, которые недоступны во время вызовов API на ЦП. GBV доступен начиная с юбилейного обновления Windows 10.

Назначение проверки на основе GPU

Проверка на основе GPU помогает выявить следующие ошибки:

  • Использование неинициализированных или несовместимых дескрипторов в шейдере.
  • Использование дескрипторов, ссылающихся на удаленные ресурсы в шейдере.
  • Проверка повышенного состояния ресурсов и распада состояния ресурса.
  • Индексирование за пределами кучи дескриптора в шейдере.
  • Шейдер обращается к ресурсам в несовместимом состоянии.
  • Использование неинициализированных или несовместимых примеров в шейдере.

GBV работает путем создания исправленных шейдеров, которые добавили проверку непосредственно в шейдер. Исправленные шейдеры проверяют корневые аргументы и ресурсы, к ним обращаются во время выполнения шейдера и сообщают об ошибках в буфер журнала. GBV также внедряет дополнительные операции и вызовы диспетчера в списки команд приложения для проверки и отслеживания изменений состояния ресурсов, введенных списком команд на временной шкале GPU.

Так как ДЛЯ ГБV требуется возможность выполнения шейдеров, списки команд COPY эмулируются списком команд COMPUTE. Это может изменить способ выполнения аппаратных копий, хотя конечный результат не должен быть изменен. Приложение по-прежнему будет воспринимать эти списки команд COPY, а уровень отладки будет проверять их таким образом.

Включение проверки на основе GPU

GBV можно принудительно использовать панель управления DirectX (DXCPL), принудив уровень отладки Direct3D 12 и дополнительно принудив проверку на основе GPU (новая вкладка на панели управления). После включения GBV будет включен до тех пор, пока устройство Direct3D 12 не будет выпущено. Кроме того, до создания устройства Direct3D 12 можно включить ГБV программным способом:

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

Как правило, код следует запускать с включенным уровнем отладки большую часть времени. Тем не менее, GBV может замедлить вещи вниз много. Разработчики могут рассмотреть возможность включения GBV с меньшими наборами данных (например, демонстрации обработчиков или небольших игровых уровней с меньшим количеством ресурсов PSO) или во время раннего запуска приложения для снижения производительности. При использовании большего объема содержимого рекомендуется включить GBV на одном или двух тестовых компьютерах в ночной тестовый проход.

Отладка выходных данных

GBV создает выходные данные отладки после вызова ExecuteCommandLists завершает выполнение на GPU. Так как это происходит на временной шкале GPU, выходные данные отладки могут быть асинхронными с другой проверкой временной шкалы ЦП. Разработчикам приложений может потребоваться внедрить собственные результаты ожидания после выполнения, чтобы синхронизировать выходные данные отладки.

Выходные данные GBV определяют, где произошла ошибка в шейдере, а также текущее число рисования и отправки и удостоверения связанных объектов (например, список команд, очередь, PSO и т. д.).

Пример сообщения отладки

Следующее сообщение об ошибке указывает, что ресурс с именем "Основной буфер цвета" был доступ к шейдеру в качестве ресурса шейдера, но был в состоянии неупорядоченного доступа при запуске шейдера на GPU. Дополнительные сведения, такие как расположение в источнике шейдера, имя списка команд и счетчика рисования (индекс рисования), а также имена связанных объектов интерфейса D3D также предоставляются.

D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer', 
Subresource Index: [0], 
Descriptor heap index: [0], 
Binding Type In Descriptor: SRV, 
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8), 
Shader Stage: PIXEL, 
Root Parameter Index: [0], 
Draw Index: [0], 
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59), 
Asm Instruction Range: [0x138-0x16b], 
Asm Operand Index: [3], 
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object', 
Sampler Descriptor Heap: <not set>, 
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',  
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]

API уровня отладки

Чтобы включить уровень отладки, вызовите EnableDebugLayer.

Чтобы включить проверку на основе GPU, вызовите SetEnableGPUBasedValidationи обратитесь к методам следующих интерфейсов:

Ознакомьтесь со следующими перечислениями и структурами: