ID3D10Device::UpdateSubresource-Methode (d3d10.h)

Die CPU kopiert Daten aus dem Arbeitsspeicher in eine Unterressource, die im nicht zugeordneten Arbeitsspeicher erstellt wurde. Siehe Bemerkungen.

Syntax

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

Parameter

[in] pDstResource

Typ: ID3D10Resource*

Ein Zeiger auf die Zielressource (siehe ID3D10Resource-Schnittstelle).

[in] DstSubresource

Typ: UINT

Ein nullbasierter Index, der die Zielunterressource identifiziert. Weitere Informationen finden Sie unter D3D10CalcSubresource .

[in] pDstBox

Typ: const D3D10_BOX*

Ein Feld, das den Teil der Zielunterressource definiert, in den die Ressourcendaten kopiert werden sollen. Koordinaten sind in Bytes für Puffer und in Texels für Texturen. Wenn NULL, werden die Daten ohne Offset in die Zielunterressource geschrieben. Die Dimensionen der Quelle müssen dem Ziel entsprechen (siehe D3D10_BOX).

Ein leeres Feld führt zu einem No-Op. Ein Feld ist leer, wenn der obere Wert größer oder gleich dem unteren Wert oder der linke Wert größer oder gleich dem rechten Wert ist oder der vordere Wert größer oder gleich dem back-Wert ist. Wenn das Feld leer ist, führt UpdateSubresource keinen Updatevorgang aus.

[in] pSrcData

Typ: const void*

Ein Zeiger auf die Quelldaten im Arbeitsspeicher.

[in] SrcRowPitch

Typ: UINT

Die Größe einer Zeile der Quelldaten.

[in] SrcDepthPitch

Typ: UINT

Die Größe eines Tiefenslices der Quelldaten.

Rückgabewert

Keine

Bemerkungen

Für einen Shaderkonstantenpuffer; Legen Sie pDstBox auf NULL fest. Es ist nicht möglich, diese Methode zum teilweisen Aktualisieren eines Shaderkonstantenpuffers zu verwenden.

Eine Ressource kann nicht als Ziel verwendet werden, wenn:

Wenn UpdateSubresource zurückgibt, kann die Anwendung die Daten, auf die pSrcData verweist, ändern oder sogar freigeben, da die Methode den ursprünglichen Inhalt bereits kopiert/angedockt hat.

Die Leistung von UpdateSubresource hängt davon ab, ob ein Konflikt für die Zielressource vorliegt oder nicht. Beispielsweise tritt ein Konflikt um eine Vertexpufferressource auf, wenn die Anwendung einen Draw-Aufruf und später UpdateSubresource für denselben Vertexpuffer aufruft, bevor der Draw-Aufruf tatsächlich von der GPU ausgeführt wird.

  • Wenn ein Konflikt für die Ressource vorliegt, führt UpdateSubresource zwei Kopien der Quelldaten aus. Zunächst werden die Daten von der CPU in einen temporären Speicherplatz kopiert, auf den der Befehlspuffer zugreifen kann. Diese Kopie erfolgt, bevor die Methode zurückgibt. Anschließend wird eine zweite Kopie von der GPU ausgeführt, um die Quelldaten in den nicht zugeordneten Arbeitsspeicher zu kopieren. Diese zweite Kopie erfolgt asynchron, da sie von der GPU ausgeführt wird, wenn der Befehlspuffer geleert wird.
  • Wenn kein Ressourcenkonflikt vorliegt, hängt das Verhalten von UpdateSubresource davon ab, was schneller (aus CPU-Sicht) ist: Kopieren der Daten in den Befehlspuffer und anschließendes Ausführen einer zweiten Kopie, wenn der Befehlspuffer geleert wird, oder die CPU die Daten an den endgültigen Ressourcenspeicherort kopieren lassen. Dies hängt von der Architektur des zugrunde liegenden Systems ab.
Betrachten Sie die folgende Abbildung einer 3D-Volumentextur, um die Parameter der Quellzeilenhöhe und der Quelltiefe zu verstehen. Abbildung einer 3D-Volumentextur

Jeder Block in diesem Visual stellt ein Datenelement dar, und die Größe jedes Elements hängt vom Format der Ressource ab. Wenn das Ressourcenformat beispielsweise DXGI_FORMAT_R32G32B32A32_FLOAT ist, beträgt die Größe jedes Elements 128 Bits oder 16 Byte. Diese 3D-Volumentextur hat eine Breite von zwei, eine Höhe von drei und eine Tiefe von vier.

Verwenden Sie die folgenden Formeln, um die Neigung der Quellzeile und die Quelltiefe für eine bestimmte Ressource zu berechnen:

  • Quellzeilenabstand = [Größe eines Elements in Bytes] * [Anzahl der Elemente in einer Zeile]
  • Quelltiefe Pitch = [Quellzeilenabstand] * [Anzahl der Zeilen (Höhe)]
Im Fall dieses Beispiels für eine 3D-Volumetextur, bei der die Größe jedes Elements 16 Bytes beträgt, lauten die Formeln wie folgt:
  • Quellzeilenabstand = 16 * 2 = 32
  • Source Depth Pitch = 16 * 2 * 3 = 96
Die folgende Abbildung zeigt die Ressource, wie sie im Arbeitsspeicher angeordnet ist. Abbildung einer 3D-Volumetextur im Arbeitsspeicher

Der folgende Codeausschnitt zeigt beispielsweise, wie ein Zielbereich in einer 2D-Textur angegeben wird. Angenommen, die Zieltextur ist 512 x 512, und der Vorgang kopiert die Daten, auf die pData verweist, nach [(120,100).. (200,220)] in der Zieltextur. Gehen Sie auch davon aus, dass rowPitch mit dem richtigen Wert initialisiert wurde (wie oben erläutert). Vorder- und Rückseite sind auf 0 bzw. 1 festgelegt, da die Box technisch leer ist, da die Front gleich hinten ist.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Der 1D-Fall ist ähnlich. Der folgende Codeausschnitt zeigt, wie Sie einen Zielbereich in einer 1D-Textur angeben. Verwenden Sie die gleichen Annahmen wie oben, mit der Ausnahme, dass die Textur 512 lang ist.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Unterschiede zwischen Direct3D 10 und Direct3D 10.1:

Direct3D 10.1 ermöglicht die Verwendung von Tiefenschablonenressourcen als Quelle oder Ziel.

Anforderungen

   
Zielplattform Windows
Kopfzeile d3d10.h
Bibliothek D3D10.lib

Weitere Informationen

ID3D10Geräte

ID3D10Resource-Schnittstelle