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


Общие сведения о дескрипторах

Дескрипторы создаются вызовами API и определяют ресурсы.

Дескрипторные данные

Дескриптор является относительно небольшим блоком данных, который полностью описывает объект gpu в непрозрачном формате gpu. Существует несколько различных типов дескрипторов: представления целевых объектов отрисовки (RTV), представления элементов глубины (DSV), представления ресурсов шейдера (SRV), неупорядоченные представления доступа (UAV), представления буферов констант (CBV) и примеры.

Дескрипторы различаются в зависимости от оборудования GPU. Размер SRV, UAV или CBV можно запросить, вызвав ID3D12Device::GetDescriptorHandleIncrementSize. Дескрипторы отображаются в этой документации как невидимые единицы; Вот пример.

srv, cbv, uav, and sampler

Дескрипторы создаются вызовами API и включают такие сведения, как ресурс и карты MIP, которые требуется содержать дескриптор.

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

Дескрипторы объектов не должны быть освобождены или освобождены. Драйверы не присоединяют выделения к созданию дескриптора. Дескриптор может кодировать ссылки на другие выделения, для которых приложение владеет временем существования. Например, дескриптор для SRV должен содержать виртуальный адрес ресурса D3D (например, текстуры), на который ссылается SRV. Это ответственность приложения, чтобы убедиться, что он не использует дескриптор SRV, когда базовый ресурс D3D он зависит от уничтожен или изменен (например, объявлен как нересидент).

Основным способом использования дескрипторов является размещение их в кучах дескриптора, которые создают резервную память для дескрипторов.

Дескриптор дескриптора

Дескриптор дескриптор — это уникальный адрес дескриптора. Он похож на указатель, но непрозрачный, так как его реализация относится к оборудованию. Дескриптор является уникальным в кучах дескриптора, поэтому, например, массив дескрипторов может ссылаться на дескрипторы в нескольких кучах.

Дескриптора ЦП предназначены для немедленного использования, например копирования, в котором необходимо определить источник и назначение. Сразу после использования (например, вызов ID3D12GraphicsCommandList::OMSetRenderTargets), их можно повторно использовать или их базовую кучу можно удалить.

Дескриптора GPU не предназначены для немедленного использования— они определяют расположения из списка команд для использования во время выполнения GPU. Они должны сохраняться до тех пор, пока все списки команд, ссылающиеся на них, полностью не выполняются.

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

Эти методы возвращают следующие структуры:

Так как размер дескрипторов зависит от оборудования, чтобы получить увеличение между каждым дескриптором в куче:

Это безопасно для смещения начального расположения с рядом добавок, копирования дескрипторов и передачи дескрипторов в вызовы API. Небезопасно разыменовывать дескриптор, как если бы он был допустимым указателем ЦП, а также анализировать биты в дескрипторе.

Добавлены некоторые вспомогательные структуры с элементами инициализации, чтобы упростить управление дескрипторами.

Дескрипторы NULL

При создании дескрипторов с помощью вызовов API приложения передают значение NULL для указателя ресурса в определении дескриптора, чтобы добиться эффекта ничего связанного при доступе к шейдеру.

Остальная часть дескриптора должна быть заполнена как можно больше. Например, в случае представлений ресурсов шейдера (SRV) дескриптор можно использовать для различения типа представления (Texture1D, Texture2D и т. д.). Числовые параметры в дескрипторе представления, например число mipmap, должны быть заданы значения, допустимые для ресурса.

Во многих случаях существует определенное поведение для доступа к несвязанным ресурсам, таким как SRVs, возвращающие значения по умолчанию. Они будут учитываться при доступе к дескриптору NULL, если тип доступа шейдера совместим с типом дескриптора. Например, если шейдер ожидает SRV Texture2D и обращается к SRV NULL, определенному как Texture1D, поведение не определено и может привести к сбросу устройства.

В сводке, чтобы создать дескриптор NULL, передайте для параметра pResource при создании представления с такими методами, как CreateShaderResourceView.null Для параметра описания представления pDesc задайте конфигурацию, которая будет работать, если ресурс не имеет значения NULL (в противном случае может произойти сбой на некотором оборудовании).

Однако корневые дескрипторы не должны иметь значение NULL.

На оборудовании уровня 1 (см . аппаратные уровни, все дескрипторы, привязанные (с помощью таблиц дескриптора) должны быть инициализированы как реальные дескрипторы или пустые дескрипторы, даже если доступ к оборудованию недоступен, в противном случае поведение не определено.

На оборудовании уровня 2 это относится к привязанным дескрипторам CBV и UAV, но не к дескрипторам SRV.

На оборудовании уровня 3 нет ограничений на это, если неинициализированные дескрипторы никогда не обращаются.

Дескрипторы по умолчанию

Чтобы создать дескриптор по умолчанию для определенного представления, передайте допустимый параметр pResource в метод создания представления (например, CreateShaderResourceView), но передайте значение NULL для параметра pDesc. Например, если ресурс содержал 14 mips, представление будет содержать 14 mips. По умолчанию используется наиболее очевидное сопоставление ресурса с представлением. Для этого требуется, чтобы ресурс был выделен с полным именем формата (например , DXGI_FORMAT_R8G8B8A8_UNORM_SRGB , а не DXGI_FORMAT_R8G8B8A8_TYPELESS).

Дескрипторы по умолчанию нельзя использовать с представлением структуры ускорения луча, так как предоставленный параметр pResource должен иметь значение NULL, а расположение должно передаваться через D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

Дескрипторы