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


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

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

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

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

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

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

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

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

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

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 и т. д.).

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

Следующее сообщение об ошибке указывает, что ресурс с именем Main Color Buffer был обращений в шейдере в качестве ресурса шейдера, но находился в состоянии неупорядоченного доступа, когда шейдер работал на 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 и обратитесь к методам следующих интерфейсов:

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