Compartir a través de


Método ID3D12Device::CreatePlacedResource (d3d12.h)

Crea un recurso que se coloca en un montón específico. Los recursos colocados son los objetos de recursos de menor peso disponibles y son los más rápidos para crear y destruir.

La aplicación puede volver a usar la memoria de vídeo superponiendo varios recursos reservados y colocados en Direct3D en regiones del montón. El modelo de reutilización de memoria simple (descrito en Comentarios) existe para aclarar qué recurso superpuesto es válido en cualquier momento dado. Para maximizar la compatibilidad con la herramienta de gráficos, no se admite la herencia de datos del modelo simple; No se admite la invalidación de iconos y subrecursos más específicos. Solo se produce una invalidación de recursos superpuesta completa.

Sintaxis

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

Parámetros

pHeap

Tipo: [in] ID3D12Heap*

Puntero a la interfaz ID3D12Heap que representa el montón en el que se coloca el recurso.

HeapOffset

Tipo: UINT64

Desplazamiento, en bytes, al recurso. El heapOffset de debe ser un múltiplo de la alineación del recurso y HeapOffset más el tamaño del recurso debe ser menor o igual que el tamaño del montón. GetResourceAllocationInfo debe usarse para comprender los tamaños de los recursos de textura.

pDesc

Tipo: [in] const D3D12_RESOURCE_DESC*

Puntero a una estructura D3D12_RESOURCE_DESC que describe el recurso.

InitialState

Tipo: D3D12_RESOURCE_STATES

Estado inicial del recurso, como una combinación bit a bit-OR de D3D12_RESOURCE_STATES constantes de enumeración.

Cuando se crea un recurso junto con un montón de D3D12_HEAP_TYPE_UPLOAD, initialState debe ser D3D12_RESOURCE_STATE_GENERIC_READ. Cuando se crea un recurso junto con un montón de D3D12_HEAP_TYPE_READBACK, initialState debe ser D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Tipo: [in, opcional] const D3D12_CLEAR_VALUE*

Especifica un D3D12_CLEAR_VALUE que describe el valor predeterminado de un color claro.

pOptimizedClearValue especifica un valor para el que las operaciones claras son más óptimas. Cuando el recurso creado es una textura con las marcas D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET o D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL, la aplicación debe elegir el valor con el que se llamará con más frecuencia a la operación clear.

Se puede llamar a las operaciones clear con otros valores, pero esas operaciones no serán tan eficaces como cuando el valor coincide con el que se pasa a la creación de recursos.

pOptimizedClearValue debe ser NULL cuando se usa con D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Tipo: REFIID

Identificador único global (GUID) para la interfaz de recursos. Se trata de un parámetro de entrada.

El REFIID , o GUID, de la interfaz al recurso se puede obtener mediante la macro __uuidof. Por ejemplo, __uuidof(ID3D12Resource) obtiene el guid de de la interfaz a un recurso. Aunque riid es, normalmente, el GUID de ID3D12Resource, puede ser cualquier GUID de para cualquier interfaz. Si el objeto de recurso no admite la interfaz para esta GUID, se produce un error en la creación con E_NOINTERFACE.

ppvResource

Tipo: [out, opcional] void**

Puntero a un bloque de memoria que recibe un puntero al recurso. ppvResource puede ser NULL, para habilitar las pruebas de funcionalidad. Cuando ppvResource es NULL, no se creará ningún objeto y se devolverá S_FALSE cuando pResourceDesc y otros parámetros sean válidos.

Valor devuelto

Tipo: HRESULT

Este método devuelve E_OUTOFMEMORY si no hay memoria suficiente para crear el recurso. Consulte códigos de retorno de Direct3D 12 para ver otros valores devueltos posibles.

Observaciones

createPlacedResource es similar a asignar completamente un recurso reservado a un desplazamiento dentro de un montón; pero también se puede reutilizar el espacio de direcciones virtuales asociado a un montón.

Los recursos colocados son más ligeros para crear y destruir que los recursos confirmados. Esto se debe a que no se crea ningún montón ni se destruye durante esas operaciones. Además, los recursos colocados permiten una técnica de peso aún más ligera para reutilizar la memoria que la creación y destrucción de recursos, es decir, reutilizar mediante el alias y las barreras de alias. Varios recursos colocados se pueden superponer simultáneamente en el mismo montón, pero solo se puede usar un único recurso superpuesto a la vez.

Hay dos semánticas de uso de recursos colocadas: un modelo simple y un modelo avanzado. Te recomendamos que elijas el modelo simple (maximiza la compatibilidad con la herramienta de gráficos en el ecosistema diverso de GPU), a menos que y hasta que encuentres que necesitas el modelo avanzado para tu aplicación.

Modelo simple

En este modelo, puede considerar que un recurso colocado esté en uno de los dos estados: activo o inactivo. No es válido que la GPU lea o escriba desde un recurso inactivo. Los recursos colocados se crean en estado inactivo.

Para activar un recurso con una barrera de alias en una lista de comandos, la aplicación debe pasar el recurso en D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore se puede dejar NULL durante una activación. Todos los recursos que comparten memoria física con el recurso activado ahora se vuelven inactivos, lo que incluye recursos colocados y reservados superpuestos.

Las barreras de alias deben agruparse y enviarse juntas para maximizar la eficiencia.

Después de la activación, los recursos con las marcas de galería de símbolos de la galería de símbolos de representación o de representación deben inicializarse aún más. Consulte las notas sobre la inicialización de recursos necesaria a continuación.

Notas sobre la inicialización de recursos necesaria

Algunos tipos de recursos siguen necesitando inicialización. Los recursos con las marcas de galería de símbolos de destino de representación o profundidad deben inicializarse con una operación clara o una colección de copias subrecursos completas. Si se usó una barrera de alias para indicar la transición entre dos recursos con alias, la inicialización debe producirse después de la barrera de alias. Esta inicialización sigue siendo necesaria siempre que se hubiera activado un recurso en el modelo simple.

Los recursos colocados y reservados con las marcas de galería de símbolos de representación o destino de representación deben inicializarse con una de las siguientes operaciones antes de admitir otras operaciones.

  • Una operación Borrar; por ejemplo, ClearRenderTargetView o ClearDepthStencilView.
  • Operación de de DiscardResource.
  • Una operación de copia de ; por ejemplo, CopyBufferRegion, CopyTextureRegiono CopyResource.

Las aplicaciones deben preferir la operación más explícita que da como resultado la menor cantidad de elementos de textura modificados. Tenga en cuenta los ejemplos siguientes.

  • El uso de un búfer de profundidad para resolver la visibilidad de píxeles normalmente requiere que cada elemento de textura de profundidad comience en 1,0 o 0. Por lo tanto, una operación Borrar debe ser la opción más eficaz para la inicialización del búfer de profundidad con alias.
  • Una aplicación puede usar un destino de representación con alias como destino para la asignación de tono. Puesto que la aplicación se representará en cada píxel durante la asignación de tono, DescartarResource debe ser la opción más eficaz para la inicialización.

Modelo avanzado

En este modelo, puede omitir la abstracción de estado activo/inactivo. En su lugar, debe respetar estas reglas de nivel inferior.

  • Una barrera de alias debe estar entre dos accesos de recursos de GPU diferentes de la misma memoria física, siempre que esos accesos estén dentro de la misma llamada a ExecuteCommandLists.
  • La primera operación de representación en determinados tipos de recursos con alias debe seguir siendo una inicialización, al igual que el modelo simple.

Las operaciones de inicialización deben producirse en un subrecurso completo o en una granularidad de 64 KB. Se admite una inicialización de subrecurso completa para todos los tipos de recursos. Se admite una granularidad de inicialización de 64 KB, alineada con un desplazamiento de 64 KB, para búferes y texturas con el diseño de textura de 64KB_UNDEFINED_SWIZZLE o 64KB_STANDARD_SWIZZLE (consulte D3D12_TEXTURE_LAYOUT).

Notas sobre la barrera de alias

La barrera de alias puede establecer NULL para pResourceAfter y pResourceBefore. La definición de coherencia de memoria de ExecuteCommandLists y una barrera de alias son las mismas, de modo que dos accesos con alias a la misma memoria física no necesitan ninguna barrera de alias cuando los accesos están en dos diferentes invocaciones de ExecuteCommandLists.

Para los modelos de uso avanzado de D3D12, la definición de sincronización de ExecuteCommandLists es equivalente a una barrera de alias. Por lo tanto, las aplicaciones pueden insertar una barrera de alias entre reutilizar la memoria física o asegurarse de que los dos usos con alias de la memoria física se producen en dos llamadas independientes a ExecuteCommandLists.

La cantidad de inactivación varía en función de las propiedades del recurso. Las texturas con diseños de memoria no definidos son el peor de los casos, ya que toda la textura debe estar inactiva atómicamente. Para dos recursos superpuestos con diseños definidos, la inactivación solo puede dar lugar a las regiones alineadas superpuestas de un recurso. La herencia de datos puede incluso definirse correctamente. Para obtener más información, consulte alias de memoria y herencia de datos.

Requisitos

Requisito Valor
de la plataforma de destino de Windows
encabezado de d3d12.h
biblioteca de D3D12.lib
DLL de D3D12.dll

Consulte también

CreateCommittedResource

CreateReservedResource

ID3D12Device

montón compartidos