Présentation des contextes différés
Cette section s’applique uniquement à Windows 7 et versions ultérieures, ainsi qu’à Windows Server 2008 R2 et versions ultérieures du système d’exploitation Windows.
Les contextes différés sont utilisés par une application pour créer des listes de commandes. Si un pilote d’affichage en mode utilisateur indique qu’il prend en charge les listes de commandes via l’indicateur D3D11DDICAPS_COMMANDLISTS_BUILD_2 de la structure D3D11DDI_THREADING_CAPS , il doit également prendre en charge la possibilité de créer et de manipuler des contextes différés. Pour plus d’informations sur la façon dont le pilote indique les fonctionnalités de thread, consultez Prise en charge du threading, des listes de commandes et du pipeline 3D. Les contextes différés diffèrent du contexte immédiat en ce que les commandes que les contextes différés enregistrent ne peuvent pas être exécutées tant que l’application ne demande pas explicitement à exécuter les commandes, en exécutant la liste de commandes générées. Pour créer et utiliser un contexte différé, Direct3D version 11 fournit les nouvelles fonctions DDI suivantes. Ces fonctions sont un sous-ensemble d’informations requises pour créer la combinaison de contexte appareil/immédiat.
La sémantique des fonctions CalcPrivateDeferredContextSize et CreateDeferredContext est similaire à d’autres fonctions DDI similaires.
Le runtime Direct3D transmet un nouveau handle de pilote et un nouveau handle de couche principale pour chaque appel à la fonction CreateDeferredContext du pilote pour créer chaque contexte différé. L’état du pipeline de chaque contexte différé doit être équivalent à l’état du pipeline dont dispose le contexte immédiat après l’exécution de l’opération d’état en clair sur celui-ci. Le pilote doit remplir les membres de la structure D3D11DDI_DEVICEFUNCS que le membre p11ContextFuncs de D3D11DDIARG_CREATEDEFERREDCONTEXT structure pointe avec un sous-ensemble des fonctions de sa table de fonctions ; le runtime utilise chacun des contextes différés correspondants D3D10DDI_HDEVICE gérer les valeurs que le membre hDrvContext de D3D11DDIARG_CREATEDEFERREDCONTEXT spécifie avec cette table de fonctions.
Le pilote doit continuer à fournir des fonctions qui commencent par pfnCreate, pfnOpen et pfnDestroy pour le contexte différé. Ces fonctions partagent la même sémantique de thread que le reste du contexte différé, et elles sont utilisées pour ouvrir et fermer des handles DDI locaux de contexte, comme décrit dans Utilisation de Context-Local handles DDI. Les fonctions qui commencent par pfnCalcPrivate ou pfnCheck ne sont pas exploitées pour les contextes différés ; Par conséquent, le pilote peut définir les membres de D3D11DDI_DEVICEFUNCS pour ces fonctions sur NULL lors de la création du contexte différé. La majorité des fonctions d’appareil restantes sont exploitées pour la prise en charge du contexte différé. Toutefois, le pilote ne tire pas parti de sa fonction QueryGetData . Toutefois, le pilote tire parti de ses fonctions ResourceMap et ResourceUnmap . Le pilote prend uniquement en charge la fonction ResourceIsStagingBusy et les nouvelles fonctions DDI pour les restrictions de ressources Direct3D version 11 sur le contexte immédiat à l’aide de handles de contexte immédiat. Pour obtenir la liste complète des fonctions qui ne sont pas exploitées pour les contextes différés, consultez Exclusion des fonctions DDI pour les contextes différés.
Le pilote tire parti des fonctions de rappel de couche principale fournies dans le bloc de mémoire vers lequel pointe le membre p11UMCallbacks de D3D11DDIARG_CREATEDEFERREDCONTEXT . Ces fonctions de rappel de couche principale fournissent l’id DDI d’état d’actualisation pour chaque contexte différé. Toutefois, le plus important est l’ajout de la fonction de rappel pfnPerformAmortizedProcessingCb décrite dans Modifications de Direct3D 10.
Le pilote ne doit pas s’attendre à ce que la fonction de rappel pfnDisableDeferredStagingResourceDestruction vers laquelle le membre pfnDisableDeferredStagingResourceDestruction de D3D11DDI_CORELAYER_DEVICECALLBACKS pointe pour être valide. Le pilote doit avoir appelé pfnDisableDeferredStagingResourceDestruction dans la fonction CreateDevice(D3D10) pour le contexte périphérique/immédiat ; Par la suite, le pilote ne doit jamais appeler pfnDisableDeferredStagingResourceDestruction avec la nouvelle sémantique DDI Direct3D version 11.
La fonction RecycleCreateDeferredContext du pilote doit effacer l’état du pipeline pour le contexte différé, comme le CreateDeferredContext du pilote efface l’état du pipeline pour le contexte différé. Une fois que le runtime a appelé abandonCommandList, CreateCommandList ou RecycleCreateCommandList du pilote, le runtime peut utiliser le handle de contexte différé avec la fonction DestroyDevice(D3D10) ou RecycleCreateDeferredContext du pilote. Pour plus d’informations sur RecycleCreateDeferredContext, consultez Optimisation pour les petites listes de commandes.