ID3D12Device ::CreatePlacedResource, méthode (d3d12.h)

Crée une ressource placée dans un tas spécifique. Les ressources placées sont les objets de ressources de poids les plus légers disponibles et sont les plus rapides à créer et détruire.

Votre application peut réutiliser la mémoire vidéo en chevauchant plusieurs ressources placées et réservées Direct3D sur les régions de tas. Le modèle simple de réutilisation de la mémoire (décrit dans Remarques) existe pour clarifier la ressource qui se chevauche est valide à tout moment. Pour optimiser la prise en charge des outils graphiques, l’héritage simple des données du modèle n’est pas pris en charge ; la vignette fine et l’invalidation des sous-ressources ne sont pas prises en charge. Seule l’invalidation complète des ressources qui se chevauchent se produit.

Syntaxe

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

Paramètres

pHeap

Type : [in] ID3D12Heap*

Pointeur vers l’interface ID3D12Heap qui représente le tas dans lequel la ressource est placée.

HeapOffset

Type : UINT64

Décalage, en octets, de la ressource. Le heapOffset doit être un multiple de l’alignement de la ressource et HeapOffset plus la taille de la ressource doit être inférieure ou égale à la taille du tas. GetResourceAllocationInfo doit être utilisé pour comprendre les tailles des ressources de texture.

pDesc

Type : [in] const D3D12_RESOURCE_DESC*

Pointeur vers une structure D3D12_RESOURCE_DESC qui décrit la ressource.

InitialState

Type : D3D12_RESOURCE_STATES

État initial de la ressource, sous la forme d’une combinaison de D3D12_RESOURCE_STATES constantes d’énumération au niveau du bit.

Lorsqu’une ressource est créée avec un tas D3D12_HEAP_TYPE_UPLOAD, InitialState doit être D3D12_RESOURCE_STATE_GENERIC_READ. Lorsqu’une ressource est créée avec un tas D3D12_HEAP_TYPE_READBACK, InitialState doit être D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Type : [in, facultatif] const D3D12_CLEAR_VALUE*

Spécifie une D3D12_CLEAR_VALUE qui décrit la valeur par défaut d’une couleur claire.

pOptimizedClearValue spécifie une valeur pour laquelle les opérations claires sont les plus optimales. Lorsque la ressource créée est une texture avec les indicateurs D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET ou D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL, votre application doit choisir la valeur avec laquelle l’opération claire sera généralement appelée.

Les opérations claires peuvent être appelées avec d’autres valeurs, mais ces opérations ne seront pas aussi efficaces que lorsque la valeur correspond à celle passée dans la création de ressources.

pOptimizedClearValue doit être NULL lorsqu’elle est utilisée avec D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Type : REFIID

Identificateur global unique (GUID) pour l’interface de ressource. Il s’agit d’un paramètre d’entrée.

LeREFIID , ou GUID, de l’interface vers la ressource peut être obtenue à l’aide de la macro . Par exemple, __uuidof(ID3D12Resource) obtient le GUID de l’interface vers une ressource. Bien que riid soit, le plus souvent, le GUID de ID3D12Resource, il peut s’agir de n’importe quel GUID GUID pour n’importe quelle interface. Si l’objet de ressource ne prend pas en charge l’interface de cette GUID, la création échoue avec E_NOINTERFACE.

ppvResource

Type : [out, optional] void**

Pointeur vers un bloc de mémoire qui reçoit un pointeur vers la ressource. ppvResource peut être NULL pour activer les tests de capacité. Lorsque ppvResource a la valeur NULL, aucun objet n’est créé et S_FALSE est retourné lorsque pResourceDesc et d’autres paramètres sont valides.

Valeur de retour

Type : HRESULT

Cette méthode retourne E_OUTOFMEMORY en cas d’insuffisance de mémoire pour créer la ressource. Consultez Codes de retour Direct3D 12 pour obtenir d’autres valeurs de retour possibles.

Remarques

CreatePlacedResource est similaire au mappage complet d’une ressource réservée à un décalage au sein d’un tas ; mais l’espace d’adressage virtuel associé à un tas peut également être réutilisé.

Les ressources placées sont plus légères pour créer et détruire que les ressources validées. Cela est dû au fait qu’aucun tas n’est créé ni détruit pendant ces opérations. En outre, les ressources placées permettent une technique de poids encore plus légère pour réutiliser la mémoire que la création et la destruction des ressources, c’est-à-dire réutiliser par le biais d’alias et de barrières d’alias. Plusieurs ressources placées peuvent se chevaucher simultanément sur le même tas, mais seules une seule ressource qui se chevauche peut être utilisée à la fois.

Il existe deux sémantiques d’utilisation des ressources placées : un modèle simple et un modèle avancé. Nous vous recommandons de choisir le modèle simple (il optimise la prise en charge des outils graphiques dans l’écosystème diversifié des GPU), sauf si et jusqu’à ce que vous trouviez que vous avez besoin du modèle avancé pour votre application.

Modèle simple

Dans ce modèle, vous pouvez considérer qu’une ressource placée se trouve dans l’un des deux états suivants : actif ou inactif. Le GPU n’est pas valide pour lire ou écrire à partir d’une ressource inactive. Les ressources placées sont créées dans l’état inactif.

Pour activer une ressource avec une barrière d’alias dans une liste de commandes, votre application doit transmettre la ressource dans D3D12_RESOURCE_ALIASING_BARRIER ::p ResourceAfter. pResourceBefore peut être laissé NULL pendant une activation. Toutes les ressources qui partagent la mémoire physique avec la ressource activée deviennent désormais inactives, ce qui inclut des ressources placées et réservées qui se chevauchent.

Les barrières d’alias doivent être regroupées et soumises ensemble, afin d’optimiser l’efficacité.

Après l’activation, les ressources avec la cible de rendu ou les indicateurs de gabarit de profondeur doivent être initialisées. Consultez les notes sur l’initialisation des ressources requises ci-dessous.

Remarques sur l’initialisation des ressources requises

Certains types de ressources nécessitent toujours une initialisation. Les ressources avec la cible de rendu ou les indicateurs de gabarit de profondeur doivent être initialisées avec une opération claire ou une collection de copies de sous-ressources complètes. Si une barrière d’alias a été utilisée pour indiquer la transition entre deux ressources alias, l’initialisation doit se produire après la barrière d’alias. Cette initialisation est toujours requise chaque fois qu’une ressource aurait été activée dans le modèle simple.

Les ressources placées et réservées avec les indicateurs de gabarit de cible de rendu ou de profondeur doivent être initialisées avec l’une des opérations suivantes avant que d’autres opérations ne soient prises en charge.

Les applications doivent préférer l’opération la plus explicite qui entraîne la moindre quantité de texels modifiés. Prenons les exemples suivants.

  • L’utilisation d’une mémoire tampon de profondeur pour résoudre la visibilité des pixels nécessite généralement que chaque texel de profondeur commence à 1,0 ou 0. Par conséquent, une opération Clear doit être l’option la plus efficace pour l’initialisation de la mémoire tampon de profondeur alias.
  • Une application peut utiliser une cible de rendu alias comme destination pour le mappage de tonalité. Étant donné que l’application s’affiche sur chaque pixel pendant le mappage de tonalité, DiscardResource doit être l’option la plus efficace pour l’initialisation.

Modèle avancé

Dans ce modèle, vous pouvez ignorer l’abstraction d’état actif/inactif. Au lieu de cela, vous devez respecter ces règles de niveau inférieur.

  • Une barrière d’alias doit être entre deux accès aux ressources GPU différentes de la même mémoire physique, tant que ces accès se trouvent dans le même ExecuteCommandLists appel.
  • La première opération de rendu sur certains types de ressources alias doit toujours être une initialisation, tout comme le modèle simple.

Les opérations d’initialisation doivent se produire sur une sous-ressource entière ou sur une granularité de 64 Ko. Une initialisation de sous-ressource entière est prise en charge pour tous les types de ressources. Une granularité d’initialisation de 64 Ko, alignée à un décalage de 64 Ko, est prise en charge pour les mémoires tampons et les textures avec les 64KB_UNDEFINED_SWIZZLE ou 64KB_STANDARD_SWIZZLE disposition de texture (reportez-vous à D3D12_TEXTURE_LAYOUT).

Remarques sur la barrière d’alias

La barrière d’alias peut définir NULL pour pResourceAfter et pResourceBefore. La définition de cohérence de la mémoire de ExecuteCommandLists et une barrière d’alias sont identiques, de sorte que deux accès aliasés à la même mémoire physique n’ont besoin d’aucune barrière d’alias lorsque les accès se trouvent dans deux ExecuteCommandLists appels différents.

Pour les modèles d’utilisation avancée D3D12, la définition de synchronisation de ExecuteCommandLists équivaut à une barrière d’alias. Par conséquent, les applications peuvent insérer une barrière d’alias entre la réutilisation de la mémoire physique ou s’assurer que les deux utilisations alias de la mémoire physique se produisent dans deux appels distincts à ExecuteCommandLists.

La quantité d’inactivation varie en fonction des propriétés de ressource. Les textures avec des dispositions de mémoire non définies sont le pire des cas, car la texture entière doit être inactivée atomiquement. Pour deux ressources qui se chevauchent avec des dispositions définies, l’inactivation peut entraîner uniquement le chevauchement des régions alignées d’une ressource. L’héritage des données peut même être bien défini. Pour plus d’informations, consultez l’alias de mémoire et l’héritage des données.

Exigences

Exigence Valeur
plateforme cible Windows
d’en-tête d3d12.h
bibliothèque D3D12.lib
DLL D3D12.dll

Voir aussi

createCommittedResource

CreateReservedResource

ID3D12Device

de tas partagés