API-интерфейсы ресурсов с плитками

Api, описанные в этом разделе, работают с мозаичными ресурсами и пулом плиток.

Назначение плиток из пула плиток ресурсу

API ID3D11DeviceContext2::UpdateTileMappings и ID3D11DeviceContext2::CopyTileMappings управляют сопоставлениями плиток и запрашивают их. Вызовы обновления влияют только на плитки, определенные в вызове, а другие остаются, как определено ранее.

Любая определенная плитка из пула плиток может быть сопоставлена с несколькими расположениями в ресурсе и даже с несколькими ресурсами. Это сопоставление включает плитки в ресурсе с макетом, выбранным реализацией (упаковка MIP-карты), где несколько MIP-карт упаковываются вместе в одну плитку. Загвоздка заключается в том, что если данные записываются на плитку с помощью одного сопоставления, но считываются с помощью другого настроенного сопоставления, результаты не определены. Тщательное использование этой гибкости по-прежнему может быть полезным для приложения, хотя, например, совместное использование плитки между ресурсами, которые не будут использоваться одновременно, где содержимое плитки всегда инициализируется с помощью того же сопоставления ресурсов, из которого они будут впоследствии считываться. Аналогичным образом, плитка, сопоставленная для хранения упакованных MIP-карт нескольких разных ресурсов с одинаковыми размерами поверхности, будет работать нормально— данные будут отображаться одинаковыми в обоих сопоставлениях.

Изменения в назначениях плиток для ресурса можно в любое время вносить в немедленном или отложенном контексте.

Создание запросов к ресурсам и поддержка

Чтобы запросить фрагмент ресурсов, используйте ID3D11Device2::GetResourceTiling.

Для другой поддержки плитки ресурсов используйте ID3D11Device2::CheckMultisampleQualityLevels1.

Копирование мозаичного фрагмента данных

Все методы в Direct3D для перемещения данных работают с мозаичными ресурсами так же, как если бы они не были плитками, за исключением того, что операции записи в несопоставленные области удаляются, а операции чтения из несопоставленных областей создают 0. Если операция копирования включает запись в одно и то же расположение памяти несколько раз, так как несколько расположений в целевом ресурсе сопоставлены с одной и той же памятью плитки, результирующие операции записи на многосоставные плитки являются недетерминированными и не повторяемыми. Это значит, что доступ осуществляется в любом порядке, в каком оборудование выполняет копирование.

В Direct3D 11.2 представлены методы для следующих дополнительных способов копирования:

  • Копирование между плитками в ресурсе с плитками (с степенью детализации плитки 64 КБ) и буфером в памяти графического модуля обработки (GPU) (или промежуточного ресурса) — ID3D11DeviceContext2::CopyTiles
  • Копирование из памяти, предоставленной приложением, на плитки в ресурсе с плитками — ID3D11DeviceContext2::UpdateTiles

Эти методы при необходимости swizzle/deswizzle и разрешают флаг D3D11_TILE_COPY_NO_OVERWRITE, когда вызывающий объект обещает, что целевая память не ссылается на работу GPU, которая находится в тестовом варианте.

Плитки, участвующие в копировании, не могут содержать плитки, содержащие упакованные MIP-карты или результаты которых не определены. Для передачи данных на MIP-карты, которые упаковывает оборудование, в одну плитку и обратно, необходимо использовать стандартные (не относящиеся к плитке) API копирования и обновления или ID3D11DeviceContext::GenerateMips для всей цепочки MIP.

Примечание по GenerateMips. Использование ID3D11DeviceContext::GenerateMips для ресурса с частично сопоставленными плитками приведет к получению результатов, которые просто соответствуют правилам чтения и записи NULL , применяемым к алгоритму, который драйвер оборудования и дисплея использует в GenerateMips. Таким образом, это не особенно полезно для приложения, чтобы беспокоиться об этом, если каким-то образом области с сопоставлениями NULL (и их влияние на другие mips на этапе создания) не будут иметь никаких последствий на части поверхности, о которых приложение заботится.

Копирование данных плитки из промежуточной поверхности или из памяти приложения будет способом отправки плиток, которые могли быть потоковой передачи с диска, например. Разновидность потоковой передачи с диска — это отправка некоторых сжатых данных в память GPU, а затем декодирование на GPU. Целевой объект декодирования может быть буферным ресурсом в памяти GPU, из которого CopyTiles затем копируется в фактический ресурс с плиткой. Этот шаг копирования позволяет GPU выполнять swizzle, если шаблон swizzle неизвестен. Переворачивание не требуется, если ресурс с плитками сам является буферным ресурсом (например, в отличие от Текстуры).

Расположение памяти плиток на стороне ресурса некличного буфера копии является просто линейным в памяти в пределах 64 КБ плиток, которые драйвер оборудования и дисплея будет swizzle/deswizzle для каждой плитки при переносе в ресурс плитки и из нее. Для поверхностей с сглаживания с несколькими выборками (MSAA) выборки каждого пикселя проходят в порядке выборки по индексу перед переходом к следующему пикселю. Для плиток, частично заполненных с правой стороны (для поверхности, ширина которого не кратна ширине плитки в пикселях), шаг/шаг для перемещения вниз по строке — это полный размер в байтах от количества пикселей, которое поместится по всей плитке, если плитка была заполнена. Таким образом, между каждой строкой пикселей в памяти может быть разрыв. Для простоты спецификации MIP-карты меньше плитки не упаковываются в линейный макет. Кажется, что это пустая трата памяти, но, как уже упоминалось, копирование в mips, что аппаратные пакеты вместе не допускаются через CopyTiles или UpdateTiles. Приложение может просто использовать универсальные API UpdateSubresource*() или CopySubresource*() для копирования небольших экземпляров по отдельности, хотя в случае CopySubresource*() это означает, что линейная память должна иметь тот же размер, что и ресурс с плиткой. CopySubresource*() не может копировать данные из ресурса буфера в Texture2D.

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

Операции копирования можно выполнять в немедленном или отложенном контексте.

Изменение размера пула плиток

Чтобы изменить размер пула плиток, используйте ID3D11DeviceContext2::ResizeTilePool.

Плитка барьер ресурсов

Чтобы указать ограничение порядка доступа к данным между несколькими мозаичными ресурсами, используйте ID3D11DeviceContext2::TiledResourceBarrier.

Плитки ресурсов