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


Алиасинг памяти и наследование данных

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

Псевдонимы

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

После доступа к ресурсу все ресурсы, которые совместно используют физическую память с этим ресурсом, становятся недействительными, если только не разрешено наследование данных. Считывания аннулированных ресурсов приводят к неопределенному содержимому ресурсов. Запись в недопустимые ресурсы также приводит к неопределенному содержимому ресурса, если не возникают два условия:

  • Ресурс не имеет ни D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, ни D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL.
  • Запись — это операция копирования или очистки всего подресурса или плитки. Инициализация плиток доступна только для ресурсов с 64KB_TILE_UNDEFINED_SWIZZLE и 64KB_TILE_STANDARD_SWIZZLE.

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

Степень детализации выравнивания буфера составляет 64 КБ, и более большая степень детализации выравнивания имеет приоритет. Это важно при рассмотрении текстур размером 4 КБ, так как несколько текстур размером 4 КБ могут находиться в регионе размером 64 КБ, не перекрывая друг друга. Но буфер под псевдонимом, использующий тот же регион 64 КБ, нельзя использовать в сочетании с любой из этих текстур размером 4 КБ. Приложение не может гарантированно избежать пересечения текстур размером 4 КБ с доступом к буферу, поскольку графические процессоры могут произвольно изменять данные текстуры 4 КБ в пределах области 64 КБ в неопределённом порядке.

64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE и ROW_MAJOR макеты текстур сообщают приложению, что перекрывающиеся детализации выравнивания стали недействительными. Например: приложение может создать 2D-массив целевых текстур для рендеринга с 2 срезами массива, одним уровнем мипа и расположением 64KB_TILE_UNDEFINED_SWIZZLE. Предположим, что приложение понимает, что каждый срез массива занимает 100 64 КБ плиток. Приложение может отказаться от использования среза массива 0 и переприсвоить эту память для буфера объемом ~6 МБ, текстуры объемом ~6 МБ с неопределенным расположением и т. д. Предположим, что приложение больше не нуждается в первом тайле среза массива 1. Затем приложение также может разместить там буфер размером 64 КБ до тех пор, пока отрисовка вновь не потребует первого блока из среза массива 1. Приложению потребуется полностью очистить плитку или сделать копию, чтобы вновь использовать первую плитку в массиве текстур.

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

Наследование данных

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

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

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

  • Для буферов, текстур с одновременным доступом и текстур с межадаптерным доступом состояние перехода ресурсов не имеет значения и все состояния совместимы.
  • Для зарезервированных текстур без предыдущих свойств или другого наследования данных на плитку через 64KB_TILE_UNDEFINED_SWIZZLE или 64KB_TILE_STANDARD_SWIZZLE состояние барьера перехода ресурсов, включая плитку, должно находиться в общем состоянии.
  • Для всех остальных текстур, где описания ресурсов соответствуют точно, состояние барьера перехода ресурса для каждой соответствующей пары подресурсов должно:
    • Будьте в обычном состоянии.
    • Сравнивайте состояния, если у них установлен одинаковый флаг записи GPU.

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

Субраспределение в кучах