Delen via


Verloren apparaten (Direct3D 9)

Een Direct3D-apparaat kan een operationele status of een verloren status hebben. De operationele status is de normale status van het apparaat waarin het apparaat wordt uitgevoerd en geeft alle rendering weer zoals verwacht. Het apparaat maakt een overgang naar de verloren status wanneer een gebeurtenis, zoals het verlies van toetsenbordfocus in een toepassing op volledig scherm, ertoe leidt dat rendering onmogelijk wordt. De status Verloren wordt gekenmerkt door de stille fout van alle renderingbewerkingen, wat betekent dat de renderingmethoden succescodes kunnen retourneren, zelfs als de renderingbewerkingen mislukken. In deze situatie wordt de foutcode D3DERR_DEVICELOST geretourneerd door IDirect3DDevice9::P resent.

De volledige set scenario's die ertoe kunnen leiden dat een apparaat verloren gaat, wordt standaard niet opgegeven. Enkele typische voorbeelden zijn verlies van focus, zoals wanneer de gebruiker op Alt+Tab drukt of wanneer een systeemdialoogvenster wordt geïnitialiseerd. Apparaten kunnen ook verloren gaan als gevolg van een energiebeheergebeurtenis of wanneer een andere toepassing ervan uitgaat dat een volledige schermbewerking wordt uitgevoerd. Bovendien eventuele fouten van IDirect3DDevice9::Reset het apparaat in een verloren status plaatst.

Alle methoden die zijn afgeleid van IUnknown- werken gegarandeerd nadat een apparaat verloren is gegaan. Na verlies van het apparaat heeft elke functie over het algemeen de volgende drie opties:

  • Mislukken met D3DERR_DEVICELOST: dit betekent dat de toepassing moet herkennen dat het apparaat is verbroken, zodat de toepassing identificeert dat er iets niet gebeurt zoals verwacht.
  • Mislukt op de achtergrond, retourneert S_OK of andere retourcodes: als een functie op de achtergrond mislukt, kan de toepassing over het algemeen geen onderscheid maken tussen het resultaat van 'succes' en een 'stille fout'.
  • De functie retourneert een retourcode.
Verschillen tussen Direct3D 9 en Direct3D 9Ex:
Een Direct3D 9-apparaat retourneert D3DERR_DEVICELOST. Zodra het is geretourneerd van IDirect3DDevice9::P resent, werkt het emulatiegedrag niet meer en mislukken alle toekomstige aanroepen totdat het apparaat opnieuw is ingesteld.
Een Direct3D 9Ex-apparaat retourneert nooit D3DERR_DEVICELOST, maar kan nieuwe statusberichten retourneren (zie apparaatgedrag verandert).

 

Reageren op een verloren apparaat

Een verloren apparaat moet resources (inclusief videogeheugenresources) opnieuw maken nadat het opnieuw is ingesteld. Als een apparaat verloren gaat, vraagt de toepassing het apparaat op om te zien of het kan worden hersteld naar de operationele status. Zo niet, dan wacht de toepassing totdat het apparaat kan worden hersteld.

Als het apparaat kan worden hersteld, bereidt de toepassing het apparaat voor door alle videogeheugenbronnen en eventuele wisselketens te vernietigen. Vervolgens roept de toepassing de methode IDirect3DDevice9::Reset aan. Opnieuw instellen is de enige methode die een effect heeft wanneer een apparaat verloren gaat en is de enige methode waarmee een toepassing het apparaat kan wijzigen van een verloren in een operationele status. Opnieuw instellen mislukt tenzij de toepassing alle resources vrijgeeft die zijn toegewezen in D3DPOOL_DEFAULT, inclusief resources die zijn gemaakt door de IDirect3DDevice9::CreateRenderTarget- en IDirect3DDevice9::CreateDepthStencilSurface methoden.

Voor het grootste deel retourneren de hoogfrequentie-aanroepen van Direct3D geen informatie over of het apparaat verloren is gegaan. De toepassing kan renderingmethoden blijven aanroepen, zoals IDirect3DDevice9::D rawPrimitive, zonder dat er een melding van een verloren apparaat wordt ontvangen. Intern worden deze bewerkingen verwijderd totdat het apparaat opnieuw wordt ingesteld op de operationele status.

De toepassing kan bepalen wat er moet worden uitgevoerd op een verloren apparaat door een query uit te voeren op de retourwaarde van de methode IDirect3DDevice9::TestCooperativeLevel.

Vergrendelingsbewerkingen

Direct3D werkt intern genoeg om ervoor te zorgen dat een vergrendelingsbewerking slaagt nadat een apparaat is verbroken. Het is echter niet gegarandeerd dat de gegevens van de videogeheugenresource nauwkeurig zijn tijdens de vergrendelingsbewerking. Het is gegarandeerd dat er geen foutcode wordt geretourneerd. Hierdoor kunnen toepassingen zonder zorgen over apparaatverlies worden geschreven tijdens een vergrendelingsbewerking.

Weg

Resources kunnen videogeheugen verbruiken. Omdat een verloren apparaat wordt losgekoppeld van het videogeheugen dat eigendom is van de adapter, is het niet mogelijk om de toewijzing van videogeheugen te garanderen wanneer het apparaat verloren gaat. Als gevolg hiervan worden alle methoden voor het maken van resources geïmplementeerd om te slagen door D3D_OK te retourneren, maar wijs in feite alleen dummy-systeemgeheugen toe. Omdat een videogeheugenresource moet worden vernietigd voordat het formaat van het apparaat wordt gewijzigd, is er geen probleem met het oververdelen van videogeheugen. Met deze dummy-oppervlakken kunnen vergrendelings- en kopieerbewerkingen normaal functioneren totdat de toepassing IDirect3DDevice9::P resent aanroept en detecteert dat het apparaat verloren is gegaan.

Alle videogeheugens moeten worden vrijgegeven voordat een apparaat kan worden teruggezet van een verloren status naar een operationele status. Dit betekent dat de toepassing alle wisselketens moet vrijgeven die zijn gemaakt met IDirect3DDevice9::CreateAdditionalSwapChain en alle resources die zijn geplaatst in de D3DPOOL_DEFAULT-geheugenklasse. De toepassing hoeft geen resources vrij te geven in de D3DPOOL_MANAGED of D3DPOOL_SYSTEMMEM geheugenklassen. Andere statusgegevens worden automatisch vernietigd door de overgang naar een operationele status.

U wordt aangemoedigd om toepassingen te ontwikkelen met één codepad om te reageren op apparaatverlies. Dit codepad is waarschijnlijk vergelijkbaar, zo niet identiek, aan het codepad dat is genomen om het apparaat bij het opstarten te initialiseren.

Opgehaalde gegevens

Met Direct3D kunnen toepassingen patronen valideren en statussen weergeven op basis van single pass rendering door de hardware met behulp van IDirect3DDevice9::ValidateDevice. Deze methode, die doorgaans wordt aangeroepen tijdens de initialisatie van de toepassing, retourneert D3DERR_DEVICELOST als het apparaat verloren is gegaan.

Met Direct3D kunnen toepassingen ook gegenereerde of eerder geschreven afbeeldingen van videogeheugenbronnen kopiëren naar niet-compatibele systeemgeheugenbronnen. Omdat de bronafbeeldingen van dergelijke overdrachten op elk gewenst moment verloren kunnen gaan, kunnen dergelijke kopieerbewerkingen mislukken wanneer het apparaat verloren gaat.

Met betrekking tot asynchrone query's retourneert IDirect3DQuery9::GetData D3DERR_DEVICELOST als de vlag FLUSH is opgegeven, om aan te geven aan de toepassing die IDirect3DQuery9::GetData nooit S_OK retourneert.

De kopieerbewerking, IDirect3DDevice9::GetFrontBufferData, kan mislukken met D3DERR_DEVICELOST omdat er geen primair oppervlak is wanneer het apparaat verloren gaat. IDirect3DDevice9::CreateAdditionalSwapChain kan ook mislukken met D3DERR_DEVICELOST omdat er geen backbuffer kan worden gemaakt wanneer het apparaat verloren gaat. Deze gevallen zijn de enige instantie van D3DERR_DEVICELOST buiten de IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevelen IDirect3DDevice9::Reset methoden.

Programmeerbare shaders

In Direct3D 9 hoeven hoekpunt-shaders en pixel-shaders niet opnieuw te worden gemaakt na het opnieuw instellen. Ze zullen onthouden worden. In eerdere versies van DirectX moesten arceringen voor een verloren apparaat opnieuw worden gemaakt.

Direct3D-apparaten