Ограничения доступа к плитке с повторяющимися сопоставлениями

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

Копирование потоковых ресурсов с перекрывающимся источником и назначением

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

Копирование в ресурс потоковой передачи с повторяющимися плитками в области назначения

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

UAV обращается к сопоставлениям повторяющихся плиток

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

Отрисовка после изменений сопоставления плиток или обновлений содержимого из внешних сопоставлений

Если сопоставления плиток ресурса потоковой передачи изменились или содержимое сопоставленных плиток пула изменилось с помощью сопоставлений другого ресурса потоковой передачи, а ресурс потоковой передачи будет отображаться с помощью целевого представления отрисовки или представления трафарета глубины, приложение должно очистить (с помощью фиксированной функции Очистить API) или полностью скопировать с помощью API Копирования*/Обновления* плитки, которые были изменены в области отображения (сопоставляются или нет).

Если приложение в этих случаях не очистит и не скопирует плитки, структуры оптимизации оборудования для представления целевого объекта отрисовки или представления "глубина-трафарет" будут устаревшими, на некотором оборудовании будет отрисовываться мусор, а результаты для различного оборудования будут нестабильными. Эти скрытые структуры данных оптимизации, используемые оборудованием, могут быть локальными для отдельных сопоставлений и недоступны другим сопоставлениям одной и той же памяти.

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

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

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

Отрисовка для плиток, общих за пределами области отрисовки

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

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

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

Отрисовка общих плиток внутри области отрисовки

Если область в потоковом ресурсе отрисовывается внутри, и в области отрисовки несколько плиток сопоставлены с одним и тем же расположением пула плиток, результаты отрисовки для таких плиток не определены.

Совместимость данных между потоковыми ресурсами с общими плитками

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

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

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

Если флаг привязки цели отрисовки или трафарета глубины не установлен ни на одном ресурсе, имеющем общие сопоставления с другими ресурсами, ограничений становится гораздо меньше. Если формат и типы поверхностей (например, Texture2D) совпадают, плитки могут использоваться совместно. Различные совместимые форматы— это такие варианты, как поверхности BC* и эквивалентный размер несжатого 32-разрядного или 16-разрядного формата для каждого компонента, например BC6H и R32G32B32A32. Многие 32-разрядные форматы для каждого элемента также могут быть псевдонимами с помощью R32_* (R10G10B10A2_*, R8G8B8A8_*, B8G8R8A8_*,B8G8R8X8_*,R16G16_*); Эта операция всегда была разрешена для непотоковых ресурсов.

Совместное использование упакованных и не упакованных плиток допускается, если форматы совместимы, а плитки заполняются сплошным цветом.

И наконец, если у ресурсов, использующих общее сопоставление плиток, нет ничего общего, за исключением отсутствующих флагов привязки цели отрисовки или трафарета глубины, безопасно можно совместно использовать только память, заполненную нулями; сопоставление будет отображаться в виде декодированного нуля для определения формата конкретного ресурса (обычно просто 0).

Конвейерный доступ к потоковым ресурсам