Метод 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_HEAP_TYPE_UPLOAD необходимо D3D12_RESOURCE_STATE_GENERIC_READInitialStat e. При создании ресурса вместе с кучей D3D12_HEAP_TYPE_READBACK необходимо D3D12_RESOURCE_STATE_COPY_DESTInitialStat e.
pOptimizedClearValue
Тип: [in, необязательный] const D3D12_CLEAR_VALUE*
Указывает D3D12_CLEAR_VALUE, описывающий значение по умолчанию для четкого цвета.
pOptimizedClearValue указывает значение, для которого наиболее оптимальные операции очистки. Когда созданный ресурс является текстурой с флагами D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET или D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL, приложение должно выбрать значение, с которым обычно вызывается операция очистки.
Очистить операции можно вызывать с другими значениями, но эти операции не будут столь эффективными, как при совпадении значения, переданного в создание ресурса.
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 Return Code.
Замечания
CreatePlacedResource аналогично полному сопоставлению зарезервированного ресурса с смещением в куче; но виртуальное адресное пространство, связанное с кучей, также может использоваться повторно.
Размещенные ресурсы являются более легким весом для создания и уничтожения, чем зафиксированные ресурсы. Это связано с тем, что куча не создается и не уничтожается во время этих операций. Кроме того, размещенные ресурсы позволяют еще более легко использовать память, чем создание и уничтожение ресурсов, то есть повторно использовать с помощью псевдонимов и барьеров псевдонима. Несколько размещенных ресурсов могут одновременно перекрываться друг с другом в одной куче, но одновременно можно использовать только один перекрывающийся ресурс.
Существует две семантики использования ресурсов— простая модель и расширенная модель. Мы рекомендуем выбрать простую модель (она обеспечивает максимальную поддержку графических средств в различных экосистемах GPU), если только не обнаружите, что требуется расширенная модель для вашего приложения.
Простая модель
В этой модели можно рассмотреть размещенный ресурс в одном из двух состояний: "активный" или "неактивный". Это недопустимо для GPU для чтения или записи из неактивного ресурса. Размещенные ресурсы создаются в неактивном состоянии.
Чтобы активировать ресурс с барьером псевдонима в списке команд, приложение должно передать ресурс в D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore можно оставить значение NULL во время активации. Все ресурсы, которые совместно используют физическую память с активированным ресурсом, теперь становятся неактивными, включая перекрывающиеся помещенные и зарезервированные ресурсы.
Сгруппировать и представить их вместе, чтобы повысить эффективность, следует сгруппировать и представить их вместе.
После активации ресурсы с целевым объектом отрисовки или флагами элементов глубины должны быть инициализированы. См. заметки о требуемой инициализации ресурсов ниже.
Заметки о требуемой инициализации ресурсов
Для некоторых типов ресурсов по-прежнему требуется инициализация. Ресурсы с целевым объектом отрисовки или флагами элементов глубины должны быть инициализированы либо с помощью четкой операции, либо коллекции полных копий подресурсов. Если барьер псевдонима использовался для обозначения перехода между двумя псевдонимами ресурсов, инициализация должна происходить после барьера псевдонима. Эта инициализация по-прежнему требуется при активации ресурса в простой модели.
Размещенные и зарезервированные ресурсы с целевым объектом отрисовки или флагами элементов глубины должны быть инициализированы с помощью одной из следующих операций перед поддержкой других операций.
- Операция Clear; Например, ClearRenderTargetView или ClearDepthStencilView.
- Операция отмены.
- Операция копирования
; например, CopyBufferRegion ,CopyTextureRegion илиCopyResource .
Приложения должны предпочитать самую явную операцию, которая приводит к минимальному количеству измененных текселей. Рассмотрим следующие примеры.
- Использование буфера глубины для решения видимости пикселей обычно требует, чтобы каждый тексель глубины начиналось с 1,0 или 0. Поэтому операция Clear должна быть наиболее эффективным вариантом инициализации буфера глубины псевдонима.
- Приложение может использовать псевдоним целевой объект отрисовки в качестве назначения для сопоставления тонов. Так как приложение будет отображаться по каждому пикселю во время сопоставления тонов, Отменаresource должна быть наиболее эффективным вариантом инициализации.
Расширенная модель
В этой модели можно игнорировать абстракции активного или неактивного состояния. Вместо этого необходимо соблюдать эти правила нижнего уровня.
- Барьер псевдонима должен находиться между двумя разными доступами к ресурсам GPU одной физической памяти, если эти доступы находятся в одном вызове ExecuteCommandLists.
- Первая операция отрисовки для определенных типов псевдонимированного ресурса по-прежнему должна быть инициализацией, как и простая модель.
Операции инициализации должны выполняться в целом подресурсе или на 64 КБ детализации. Для всех типов ресурсов поддерживается вся инициализация подресурсов. Степень детализации инициализации 64 КБ, выровненная по смещением 64 КБ, поддерживается для буферов и текстур с помощью макета текстуры 64KB_UNDEFINED_SWIZZLE или 64KB_STANDARD_SWIZZLE (см. D3D12_TEXTURE_LAYOUT).
Заметки об барьере псевдонима
Барьер псевдонима может задать значение NULL для pResourceAfter и pResourceBefore. Определение согласованности памяти ExecuteCommandLists и барьер псевдонима одинаковы, поэтому два псевдонима доступа к одной физической памяти не нуждаются в барьере псевдонима, если доступы находятся в двух разных ExecuteCommandLists вызовов.
Для моделей расширенного использования D3D12 определение синхронизации ExecuteCommandLists эквивалентно барьеру псевдонима. Таким образом, приложения могут вставить барьер псевдонима между повторной использованием физической памяти или обеспечить два псевдонима физической памяти в двух отдельных вызовах ExecuteCommandLists.
Объем инактивации зависит от свойств ресурса. Текстуры с неопределенными макетами памяти являются худшим случаем, так как вся текстура должна быть активирована атомарно. Для двух перекрывающихся ресурсов с определенными макетами активация может привести только к перекрывающимся регионам ресурса. Наследование данных может быть четко определено. Дополнительные сведения см. в разделе псевдоним памяти и наследование данных.
Требования
Требование | Ценность |
---|---|
целевая платформа | Виндоус |
заголовка | d3d12.h |
библиотеки |
D3D12.lib |
DLL | D3D12.dll |