> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CreatePlacedResource

> ID3D12Device::CreatePlacedResource crea un recurso ligero colocado en un montón específico en Direct3D 12 de XBOX, el tipo de recurso más rápido de crear.

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

Su aplicación puede reutilizar la memoria de vídeo superponiendo varios recursos colocados y reservados de Direct3D en regiones del montón. El modelo simple de reutilización de memoria (descrito en [Comentarios](#remarks)) existe para aclarar qué recurso superpuesto es válido en un momento dado. Para maximizar la compatibilidad con las herramientas de gráficos, con el modelo simple no se admite la herencia de datos, y no se admite la invalidación más pormenorizada de mosaicos y subrecursos. Solo se produce la invalidación completa de recursos superpuestos.

## Sintaxis

```cpp theme={null}
HRESULT CreatePlacedResource(
    ID3D12Heap  pHeap,
    UINT64 HeapOffset,
    const D3D12_RESOURCE_DESC  pDesc,
    D3D12_RESOURCE_STATES InitialState,
    const D3D12_CLEAR_VALUE  pOptimizedClearValue,
    const IID & riid,
    void  ppvResource
)
```

### Parámetros

*pHeap*<br />Tipo: ID3D12Heap \*

Un puntero a la interfaz **ID3D12Heap** que representa el montón en el que se coloca el recurso.

*HeapOffset*<br />Tipo: UINT64

El desplazamiento, en bytes, hasta el recurso. *HeapOffset* 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. Debe usarse [**GetResourceAllocationInfo**](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_getresourceallocationinfo_public) para conocer los tamaños de los recursos de textura.

*pDesc*<br />Tipo: const D3D12\_RESOURCE\_DESC \*

Un puntero a una estructura **D3D12\_RESOURCE\_DESC** que describe el recurso.

*InitialState*<br />Tipo: D3D12\_RESOURCE\_STATES

El estado inicial del recurso, como una combinación con OR bit a bit de constantes de la enumeración **D3D12\_RESOURCE\_STATES**.

Cuando un recurso se crea junto con un montón **D3D12\_HEAP\_TYPE\_UPLOAD**, *InitialState* debe ser **D3D12\_RESOURCE\_STATE\_GENERIC\_READ**. Cuando un recurso se crea junto con un montón **D3D12\_HEAP\_TYPE\_READBACK**, *InitialState* debe ser **D3D12\_RESOURCE\_STATE\_COPY\_DEST**.

*pOptimizedClearValue*<br />Tipo: const D3D12\_CLEAR\_VALUE \*

Especifica un **D3D12\_CLEAR\_VALUE** que describe el valor predeterminado para un color de borrado.

*pOptimizedClearValue* especifica un valor para el que las operaciones de borrado 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**, su aplicación debe elegir el valor con el que se llamará más habitualmente a la operación de borrado.

Las operaciones de borrado pueden llamarse con otros valores, pero esas operaciones no serán tan eficientes como cuando el valor coincide con el que se pasó al crear el recurso.

*pOptimizedClearValue* debe ser NULL cuando se usa con **D3D12\_RESOURCE\_DIMENSION\_BUFFER**.

*riid*<br />Tipo: const IID &

El identificador único global (**GUID**) de la interfaz del recurso. Este es un parámetro de entrada.

El **REFIID**, o **GUID**, de la interfaz del recurso puede obtenerse mediante la macro `__uuidof`. Por ejemplo, `__uuidof(ID3D12Resource)` obtiene el **GUID** de la interfaz de un recurso. Aunque **riid** es, más habitualmente, el GUID de [**ID3D12Resource**](/reference/graphics/d3d12_xs/interfaces/ID3D12Resource/id3d12resource_xs), puede ser cualquier **GUID** de cualquier interfaz. Si el objeto de recurso no admite la interfaz de este **GUID**, la creación falla con **E\_NOINTERFACE**.

*ppvResource*<br />Tipo: void \*\*

Un puntero a un bloque de memoria que recibe un puntero al recurso. *ppvResource* puede ser NULL, para habilitar las pruebas de capacidad. Cuando *ppvResource* es NULL, no se creará ningún objeto y se devolverá S\_FALSE cuando *pResourceDesc* y los demás 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](https://learn.microsoft.com/en-us/windows/win32/direct3d12/d3d12-graphics-reference-returnvalues) para conocer otros posibles valores devueltos.

## Comentarios

**CreatePlacedResource** es similar a asignar por completo un recurso reservado a un desplazamiento dentro de un montón; pero el espacio de direcciones virtuales asociado a un montón también puede reutilizarse.

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

Existen dos semánticas de uso de recursos colocados: un modelo simple y un modelo avanzado. Le recomendamos que elija el modelo simple (maximiza la compatibilidad con las herramientas de gráficos en el diverso ecosistema de GPU), a menos que descubra que necesita el modelo avanzado para su aplicación, y hasta que eso ocurra.

### Modelo simple

En este modelo, puede considerar que un recurso colocado está en uno de 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 el estado inactivo.

Para activar un recurso con una barrera de alias en una lista de comandos, su aplicación debe pasar el recurso en [**D3D12\_RESOURCE\_ALIASING\_BARRIER::pResourceAfter**](/reference/graphics/d3d12/structs/d3d12_resource_aliasing_barrier_public). **pResourceBefore** puede dejarse en NULL durante una activación. Todos los recursos que comparten memoria física con el recurso activado pasan a estar inactivos, lo que incluye los 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 destino de representación o de galería de símbolos de profundidad deben inicializarse adicionalmente. Consulte las notas sobre la inicialización de recursos necesaria a continuación.

#### Notas sobre la inicialización de recursos necesaria

Ciertos tipos de recursos siguen requiriendo inicialización. Los recursos con las marcas de destino de representación o de galería de símbolos de profundidad deben inicializarse con una operación de borrado o con una colección de copias completas de subrecursos. 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 un recurso se hubiera activado en el modelo simple.

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

* Una operación de *borrado* (*Clear*); por ejemplo, [ClearRenderTargetView](/reference/graphics/d3d12_xs/interfaces/ID3D12GraphicsCommandList/methods/id3d12graphicscommandlist_clearrendertargetview_xs) o [ClearDepthStencilView](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_cleardepthstencilview_public).
* Una operación [DiscardResource](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_discardresource_public).
* Una operación de *copia* (*Copy*); por ejemplo, [CopyBufferRegion](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_copybufferregion_public), [CopyTextureRegion](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_copytextureregion_public) o [CopyResource](https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-copyresource).

Las aplicaciones deben preferir la operación más explícita que dé como resultado la menor cantidad de texeles modificados. Considere los siguientes ejemplos.

* Usar un búfer de profundidad para resolver la visibilidad de píxeles normalmente requiere que cada texel de profundidad comience en 1.0 o 0. Por lo tanto, una operación de *borrado* debería ser la opción más eficiente para la inicialización de un 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 tonos. Dado que la aplicación representará sobre cada píxel durante la asignación de tonos, [DiscardResource](/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_discardresource_public) debería ser la opción más eficiente para la inicialización.

### Modelo avanzado

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

* Debe haber una barrera de alias entre dos accesos de recursos de GPU diferentes a la misma memoria física, siempre que esos accesos estén dentro de la misma llamada a [ExecuteCommandLists](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists).
* La primera operación de representación en ciertos tipos de recursos con alias debe seguir siendo una inicialización, igual que en el modelo simple.

Las operaciones de inicialización deben producirse en un subrecurso completo o con una granularidad de 64 KB. La inicialización de un subrecurso completo se admite para todos los tipos de recursos. Una granularidad de inicialización de 64 KB, alineada con un desplazamiento de 64 KB, se admite para búferes y texturas con el diseño de textura 64KB\_UNDEFINED\_SWIZZLE o 64KB\_STANDARD\_SWIZZLE (consulte [D3D12\_TEXTURE\_LAYOUT](/reference/graphics/d3d12_x/enums/d3d12_texture_layout)).

### Notas sobre la barrera de alias

La barrera de alias puede establecer NULL tanto para *pResourceAfter* como para *pResourceBefore*. La definición de coherencia de memoria de [**ExecuteCommandLists**](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) y de una barrera de alias es la misma, de modo que dos accesos con alias a la misma memoria física no necesitan ninguna barrera de alias cuando los accesos se producen en dos invocaciones diferentes de **ExecuteCommandLists**.

Para los modelos de uso avanzado de D3D12, la definición de sincronización de [**ExecuteCommandLists**](/reference/graphics/d3d12_x/interfaces/id3d12commandqueue/methods/id3d12commandqueue_executecommandlists) es equivalente a una barrera de alias. Por lo tanto, las aplicaciones pueden insertar una barrera de alias entre reutilizaciones de la memoria física, o asegurarse de que los dos usos con alias de la memoria física se produzcan en dos llamadas independientes a **ExecuteCommandLists**.

La cantidad de inactivación varía según las propiedades del recurso. Las texturas con diseños de memoria indefinidos son el peor caso, ya que toda la textura debe inactivarse de forma atómica. Para dos recursos superpuestos con diseños definidos, la inactivación puede afectar solo a las regiones alineadas superpuestas de un recurso. La herencia de datos puede incluso estar bien definida. Para obtener más información, consulte [Alias de memoria y herencia de datos](https://learn.microsoft.com/en-us/windows/win32/direct3d12/memory-aliasing-and-data-inheritance).

## Requisitos

**Encabezado:** d3d12\_xs.h o d3d12\_x.h<br />**Biblioteca:** d3d12\_xs.lib o d3d12\_x.lib<br />**Plataformas compatibles**: consolas XBOX Series y familia XBOX One

## Consulte también

[CreateCommittedResource](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createcommittedresource_public)

[CreateReservedResource](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createreservedresource_public)

[ID3D12Device](/reference/graphics/d3d12_x/interfaces/id3d12device/id3d12device)

[Montones compartidos](https://learn.microsoft.com/en-us/windows/win32/direct3d12/shared-heaps)


## Related topics

- [CreatePlacedResource2 (consolas XBOX Series)](/es/reference/graphics/d3d12/interfaces/id3d12device10/methods/id3d12device10_createplacedresource2_public.md)
- [CreateReservedResource](/es/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createreservedresource_public.md)
- [CreateCommittedResource](/es/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_createcommittedresource_public.md)
- [CreateReservedResource2 (consolas XBOX Series)](/es/reference/graphics/d3d12/interfaces/id3d12device10/methods/id3d12device10_createreservedresource2_public.md)
- [CreateReservedResource1 (consolas XBOX Series)](/es/reference/graphics/d3d12/interfaces/id3d12device4/methods/id3d12device4_createreservedresource1_public.md)
