Метод ID3D12Device::CreatePlacedResource (d3d12.h)

Создает ресурс, помещенный в определенную кучу. Размещенные ресурсы — это самые легкие доступные объекты ресурсов, которые быстрее всего создаются и уничтожаются.

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

Синтаксис

HRESULT CreatePlacedResource(
  ID3D12Heap                *pHeap,
  UINT64                    HeapOffset,
  const D3D12_RESOURCE_DESC *pDesc,
  D3D12_RESOURCE_STATES     InitialState,
  const D3D12_CLEAR_VALUE   *pOptimizedClearValue,
  REFIID                    riid,
  void                      **ppvResource
);

Параметры

pHeap

Тип: [in] ID3D12Heap*

Указатель на интерфейс ID3D12Heap , представляющий кучу, в которой размещен ресурс.

HeapOffset

Тип: UINT64

Смещение ресурса в байтах. HeapOffset должен быть кратным выравниванию ресурса, а HeapOffset и размер ресурса должен быть меньше или равен размеру кучи. GetResourceAllocationInfo необходимо использовать для понимания размеров ресурсов текстуры.

pDesc

Тип: [in] const D3D12_RESOURCE_DESC*

Указатель на структуру D3D12_RESOURCE_DESC , описывающую ресурс.

InitialState

Тип: D3D12_RESOURCE_STATES

Начальное состояние ресурса в виде побитового или сочетания D3D12_RESOURCE_STATES констант перечисления.

При создании ресурса вместе с кучей D3D12_HEAP_TYPE_UPLOADзначение InitialState должно быть D3D12_RESOURCE_STATE_GENERIC_READ. При создании ресурса вместе с кучей D3D12_HEAP_TYPE_READBACKзначение InitialState должно быть D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Тип: [in, необязательный] const D3D12_CLEAR_VALUE*

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

pOptimizedClearValue указывает значение, для которого операции очистки наиболее оптимальны. Если созданный ресурс является текстурой с флагами D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET или D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL , приложение должно выбрать значение, с которым чаще всего будет вызываться операция очистки.

Операции clear можно вызывать с другими значениями, но эти операции не будут столь эффективными, как если значение совпадает со значением, переданным при создании ресурса.

Значение pOptimizedClearValue должно иметь значение NULL при использовании с D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Тип: REFIID

Глобальный уникальный идентификатор (GUID) для интерфейса ресурса. Это входной параметр.

Идентификатор REFIID или GUID интерфейса к ресурсу можно получить с помощью макроса__uuidof. Например, __uuidof(ID3D12Resource) получает GUID интерфейса для ресурса. Хотя riid чаще всего является GUID для ID3D12Resource, он может быть любым GUID для любого интерфейса. Если объект ресурса не поддерживает интерфейс для этого GUID, создание завершается сбоем с E_NOINTERFACE.

ppvResource

Тип: [out, необязательный] void**

Указатель на блок памяти, который получает указатель на ресурс. PpvResource может иметь значение NULL, чтобы включить тестирование возможностей. Если ppvResource имеет значение NULL, объект не создается, и S_FALSE возвращаются, когда pResourceDesc и другие параметры являются допустимыми.

Возвращаемое значение

Тип: HRESULT

Этот метод возвращает E_OUTOFMEMORY , если для создания ресурса недостаточно памяти. Другие возможные возвращаемые значения см. в разделе Коды возврата Direct3D 12 .

Комментарии

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

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

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

Простая модель

В этой модели можно считать, что размещенный ресурс находится в одном из двух состояний: активном или неактивном. Это недопустимо для GPU для чтения или записи из неактивного ресурса. Размещенные ресурсы создаются в неактивном состоянии.

Чтобы активировать ресурс с барьером псевдонима в списке команд, приложение должно передать ресурс в D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore можно оставить null во время активации. Все ресурсы, которые совместно используют физическую память с активированным ресурсом, теперь становятся неактивными, включая перекрывающиеся размещенные и зарезервированные ресурсы.

Барьеры, связанные с псевдонимами, следует группировать и представлять вместе, чтобы обеспечить максимальную эффективность.

После активации ресурсы с флагами целевого объекта отрисовки или трафарета глубины должны быть инициализированы. См. примечания о требуемой инициализации ресурсов ниже.

Примечания о необходимой инициализации ресурса

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

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

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

  • Использование буфера глубины для обеспечения видимости пикселей обычно требует, чтобы каждая тексель глубины начинались с 1,0 или 0. Таким образом, операция Clear должна быть наиболее эффективным вариантом для инициализации буфера с псевдонимом глубины.
  • Приложение может использовать целевой объект отрисовки с псевдонимом в качестве назначения для сопоставления тональности. Так как приложение будет отрисовывать каждый пиксель во время сопоставления тонов, То для инициализации наиболее эффективным вариантом должен быть Метод ОтменитьРесурс .

Расширенная модель

В этой модели можно игнорировать абстракцию активного и неактивного состояния. Вместо этого необходимо соблюдать эти правила более низкого уровня.

  • Барьер псевдонима должен находиться между двумя разными доступами к ресурсам GPU одной физической памяти, если эти доступы находятся в одном вызове ExecuteCommandLists .
  • Первая операция отрисовки для определенных типов псевдонимируемых ресурсов по-прежнему должна быть инициализацией, как и простая модель.

Операции инициализации должны выполняться либо во всем подресурсе, либо на уровне детализации 64 КБ. Для всех типов ресурсов поддерживается инициализация всего подресурса. Для буферов и текстур с макетом текстуры 64KB_UNDEFINED_SWIZZLE или 64KB_STANDARD_SWIZZLE текстуры поддерживается гранулярность инициализации размером 64 КБ, выровненная со смещением в 64 КБ (см. D3D12_TEXTURE_LAYOUT).

Примечания о барьере псевдонимов

Барьер псевдонима может задавать значение NULL как для pResourceAfter, так и для pResourceBefore. Определение согласованности памяти ExecuteCommandLists и барьер псевдонима одинаковы, поэтому для двух псевдонимов доступа к одной физической памяти не требуется барьер псевдонима, если доступы находятся в двух разных вызовах ExecuteCommandLists .

Для расширенных моделей использования D3D12 определение синхронизации ExecuteCommandLists эквивалентно барьеру псевдонима. Таким образом, приложения могут либо вставить барьер псевдонима между повторным использованием физической памяти, либо обеспечить два псевдонима использования физической памяти в двух отдельных вызовах ExecuteCommandLists.

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

Требования

Требование Значение
Целевая платформа Windows
Header d3d12.h
Библиотека D3D12.lib
DLL D3D12.dll

См. также раздел

CreateCommittedResource

CreateReservedResource

ID3D12Device

Общие кучи