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


Сопоставления находятся в пуле плиток

При создании ресурса с флагом D3D11_RESOURCE_MISC_TILED плитки, составляющие ресурс, приходят из расположения в пуле плиток. Пул плиток — это пул памяти (на основе одного или нескольких выделений за кулисами — незамеченный приложением). Операционная система и драйвер отображения управляют этим пулом памяти, и объем памяти легко понимается приложением. Плитка ресурсов сопоставляет регионы 64 КБ, указывая на расположения в пуле плиток. Одним из вариантов этой установки является возможность совместного использования нескольких ресурсов и повторного использования одинаковых плиток, а также повторного использования одинаковых плиток в разных расположениях в ресурсе при необходимости.

Затраты на гибкость заполнения плиток для ресурса из пула плиток заключается в том, что ресурс должен выполнять работу по определению и поддержанию сопоставления плиток в пуле плиток, представляющих плитки, необходимые для ресурса. Сопоставления плиток можно изменить. Кроме того, не все плитки в ресурсе должны быть сопоставлены одновременно; Ресурс может иметь сопоставления NULL. Сопоставление NULL определяет плитку как недоступную с точки зрения доступа к ресурсу.

Можно создать несколько пулов плиток, и любое количество плиток может сопоставляться с любым заданным пулом плиток одновременно. Пулы плиток также можно выращивать или сужать. Дополнительные сведения см. в разделе изменение размера пула плиток. Одно ограничение, которое существует для упрощения реализации драйвера отображения и среды выполнения, заключается в том, что заданный ресурс с плитками может иметь сопоставления только в один пул плиток одновременно (в отличие от одновременного сопоставления с несколькими пулами плиток).

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

Пул плиток можно рассматривать как полностью программную абстракцию, которая позволяет приложениям Direct3D эффективно программировать таблицы страниц на графическом модуле обработки (GPU) без необходимости знать сведения о реализации низкого уровня (или напрямую обращаться с адресами указателя). Пулы плиток не применяют дополнительные уровни косвенного обращения к оборудованию. Оптимизация одноуровневой таблицы страницы с помощью таких конструкций, как каталоги страниц, не зависят от концепции пула плиток.

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

Предположим, что каждая запись таблицы страницы составляет 64 бита.

Для наихудшего размера таблицы страницы для одной поверхности, учитывая ограничения ресурсов в Direct3D 11, предположим, что плитка создается с форматом 128 бит на элемент (например, rgbA float), поэтому плитка 64 КБ содержит только 4096 пикселей. Максимальный поддерживаемый размер Texture2DArray размером 16384*16384*2048 (но только с одним mipmap) потребуется около 1 ГБ хранилища в таблице страниц, если они полностью заполнены (не включая mipmap) с использованием 64-разрядных записей таблицы. Добавление mipmap увеличит полностью сопоставленное (худшее) хранилище таблиц страницы примерно на треть до около 1,3 ГБ.

В этом случае будет предоставляться доступ к примерно 10,6 терабайтам адресной памяти. Однако может быть ограничение на объем адресной памяти, что приведет к сокращению этих объемов, возможно, к диапазону терабайтов.

Еще одним вариантом является один ресурс Texture2D плитки 16384*16384 с 32-разрядным форматом элементов, включая mipmapы. Пространство, необходимое в полно заполненной таблице страницы, будет примерно 170 КБ с 64-разрядными записями таблицы.

Наконец, рассмотрим пример с использованием формата BC, например BC7 с 128 битами на плитку 4x4 пикселей. Это один байт на пиксель. Texture2DArray 16384*16384*2048, включая mipmaps, потребуется примерно 85 МБ для полного заполнения этой памяти в таблице страниц. Это не плохо, учитывая, что в этом случае один ресурс с плитками может охватывать 550 гигапикселей (512 ГБ памяти).

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

Начальное содержимое таблицы страницы null для всех записей. Приложения также не могут передавать исходные данные для содержимого памяти поверхности, так как оно начинается без резервной копии памяти.

В этом разделе

Тема Описание
создания пула плиток
Пул плиток создается с помощью API ID3D11Device::CreateBuffer путем передачи флага D3D11_RESOURCE_MISC_TILE_POOL в элементе MiscFlags элемент структуры D3D11_BUFFER_DESC, на которую указывает параметр pDe sc.
изменение размера пула плиток
Используйте API ID3D11DeviceContext2::ResizeTilePool для роста пула плиток, если приложению нужен более рабочий набор для сопоставления ресурсов с плитками или сжатие, если требуется меньше места.
отслеживания рисков и ресурсов пула плиток
Для ресурсов, не относящихся к плиткам, Direct3D может предотвратить определенные опасные условия во время отрисовки, но поскольку отслеживание рисков будет находиться на уровне плитки для ресурсов с плитками, отслеживание условий опасности во время отрисовки плиток ресурсов может оказаться слишком дорогостоящим.

Создание плиток ресурсов