Присвоение псевдонимов памяти и наследование данных
Размещенный и зарезервированный ресурс могут псевдонимировать физическую память в куче. Размещенные ресурсы позволяют использовать больше сценариев наследования данных, чем зарезервированные ресурсы, если куча имеет общий набор флагов или когда псевдонимы ресурсов имеют полностью определенные макеты памяти.
Псевдонимы
Барьер псевдонима должен быть выдан между использованием двух ресурсов, которые совместно используют одну и ту же физическую память, даже если наследование данных не требуется. Простые модели использования должны указывать, по крайней мере, целевой ресурс, участвующий в такой операции. Дополнительные сведения и расширенные модели использования см. в статье 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 срезами массивов, одним уровнем MIP и макетом 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 с графическим процессором, который отображается в буферах.
См. также