Zuordnungen in einen Kachelpool
Wenn eine Ressource mit dem _ _ _ TILED-Flag D3D11 RESOURCE MISC erstellt wird, stammen die Kacheln, aus denen die Ressource besteht, von , die auf Speicherorte in einem Kachelpool zeigen. Ein Kachelpool ist ein Speicherpool (unterstützt durch eine oder mehrere Belegungen im Hintergrund , die von der Anwendung nicht angezeigt werden). Das Betriebssystem und der Anzeigetreiber verwalten diesen Speicherpool, und der Speicherbedarf kann von einer Anwendung leicht verstanden werden. Kachelressourcen ordnen 64-KB-Regionen zu, indem sie auf Standorte in einem Kachelpool verweisen. Ein Fallout dieses Setups besteht darin, dass mehrere Ressourcen dieselben Kacheln freigeben und wiederverwenden können. Außerdem können dieselben Kacheln bei Bedarf an verschiedenen Speicherorten innerhalb einer Ressource wiederverwendet werden.
Die Kosten für die Flexibilität beim Auffüllen der Kacheln für eine Ressource aus einem Kachelpool sind, dass die Ressource die Aufgaben zum Definieren und Verwalten der Zuordnung durchführen muss, deren Kacheln im Kachelpool die für die Ressource benötigten Kacheln darstellen. Kachelzuordnungen können geändert werden. Außerdem müssen nicht alle Kacheln in einer Ressource gleichzeitig zugeordnet werden. Eine Ressource kann NULL-Zuordnungen aufweisen. Eine NULL-Zuordnung definiert, dass eine Kachel aus Sicht der Ressource, die darauf zugreift, nicht verfügbar ist.
Es können mehrere Kachelpools erstellt werden, und eine beliebige Anzahl von gekachelten Ressourcen kann einem bestimmten Kachelpool gleichzeitig zugeordnet werden. Kachelpools können auch vergrößert oder verkrumpft werden. Weitere Informationen finden Sie unter Ändern der Größe des Kachelpools. Eine Einschränkung zur Vereinfachung der Implementierung des Anzeigetreibers und der Laufzeit besteht darin, dass eine bestimmte gekachelte Ressource nur Zuordnungen zu höchstens einem Kachelpool gleichzeitig aufweisen kann (im Gegensatz zur gleichzeitigen Zuordnung zu mehreren Kachelpools).
Die Speichermenge, die einer gekachelten Ressource selbst zugeordnet ist (d. h. der unabhängige Speicher des Kachelpools), ist ungefähr proportional zur Anzahl der Kacheln, die dem Pool zu einem bestimmten Zeitpunkt tatsächlich zugeordnet sind. In der Hardware geht dies auf die Skalierung des Speicherbedarfs für den Seitentabellenspeicher in etwa mit der Menge der zugeordneten Kacheln zurück (z. B. mit einem Mehrebenen-Seitentabellenschema nach Bedarf).
Der Kachelpool kann als vollständig softwareabstraktion bezeichnet werden, die es Direct3D-Anwendungen ermöglicht, die Seitentabellen auf der Grafikverarbeitungseinheit (GPU) effektiv zu programmieren, ohne die Implementierungsdetails auf niedriger Ebene kennen zu müssen (oder Zeigeradressen direkt behandeln zu müssen). Kachelpools wenden keine zusätzlichen Dekonstruktionsebenen in der Hardware an. Optimierungen einer Seitentabelle auf einer einzelnen Ebene mithilfe von Konstrukten wie Seitenverzeichnissen sind unabhängig vom Konzept des Kachelpools.
Lassen Sie uns untersuchen, welchen Speicher die Seitentabelle selbst im schlimmsten Fall erfordern könnte (obwohl implementierungen in der Praxis nur speichermäßig proportional zu dem, was zugeordnet ist).
Angenommen, jeder Seitentabelleneintrag ist 64 Bits.
Nehmen Sie bei der im schlimmsten Fall erreichten Seitentabellengröße für eine einzelne Oberfläche an, dass angesichts der Ressourcengrenzwerte in Direct3D 11 eine gekachelte Ressource mit einem 128-Bit-pro-Element-Format (z. B. rgba float) erstellt wird, sodass eine Kachel mit 64 KB nur 4096 Pixel enthält. Die maximal unterstützte Texture2DArray-Größe von 16384 * 16384 * 2048 (aber nur mit einer einzigen Mipmap) erfordert etwa 1 GB Speicher in der Seitentabelle, wenn sie mithilfe von 64-Bit-Tabelleneinträgen vollständig aufgefüllt wird (ohne Mipmaps). Durch das Hinzufügen von Mipmaps wird der vollständig zugeordnete Seitentabellenspeicher (im schlimmsten Fall) um etwa ein Drittes auf etwa 1,3 GB vergrößert.
In diesem Fall erhalten Sie Zugriff auf ca. 10,6 Terabyte adressierbaren Arbeitsspeicher. Es gibt jedoch möglicherweise ein Limit für die Menge des adressierbaren Arbeitsspeichers, was diese Mengen reduzieren würde, z. B. auf etwa den Terabytebereich.
Ein weiterer zu berücksichtigener Fall ist eine einzelne kachelte Texture2D-Ressource von 16384 * 16384 mit einem 32-Bit-pro-Element-Format, einschließlich Mipmaps. Der in einer vollständig aufgefüllten Seitentabelle benötigte Speicherplatz würde ungefähr 170 KB mit 64-Bit-Tabelleneinträgen entsprechen.
Betrachten Sie abschließend ein Beispiel mit einem BC-Format, z.B. BC7 mit 128 Bits pro Kachel von 4 x 4 Pixeln. Dies ist ein Byte pro Pixel. Ein Texture2DArray von 16384 * 16384 * 2048 einschließlich Mipmaps würde ungefähr 85 MB benötigen, um diesen Speicher vollständig in einer Seitentabelle aufzufüllen. Dies ist nicht schlecht, da eine gekachelte Ressource 550 Gigapixel (in diesem Fall 512 GB Arbeitsspeicher) umfassen kann.
In der Praxis würde die Nähe zu diesen vollständigen Zuordnungen bestimmt werden, da die Menge des verfügbaren physischen Arbeitsspeichers es nicht zulassen würde, dass so viel zugeordnet und gleichzeitig referenziert wird. Mit einem Kachelpool können Anwendungen jedoch Kacheln wiederverwenden (z. B. eine "schwarze" Kachel für große schwarze Bereiche in einem Bild) – effektiv mithilfe des Kachelpools (d. h. Seitentabellenzuordnungen) als Tool für die Speicherkomprimierung.
Der anfängliche Inhalt der Seitentabelle ist für alle Einträge NULL. Anwendungen können auch keine Anfangsdaten für den Speicherinhalt der Oberfläche übergeben, da sie ohne Speicherrückschluss gestartet werden.
In diesem Abschnitt
| Thema | Beschreibung |
|---|---|
| Erstellung eines Kachelpools |
Ein Kachelpool wird über die ID3D11Device::CreateBuffer-API erstellt, indem das FLAG D3D11 _ RESOURCE _ MISC TILE _ _ POOL im MiscFlags-Member der D3D11 _ BUFFER _ DESC-Struktur übergeben wird, auf die der pDesc-Parameter zeigt. |
| Ändern der Größe des Kachelpools |
Verwenden Sie die ID3D11DeviceContext2::ResizeTilePool-API, um einen Kachelpool zu vergrößern, wenn die Anwendung mehr Arbeitssatz für die Zuordnung der gekachelten Ressourcen benötigt, oder um ihn zu verkleinern, wenn weniger Speicherplatz benötigt wird. |
| Gefahrennachverfolgung im Vergleich mit den Kachelpoolressourcen |
Bei nicht gekachelten Ressourcen kann Direct3D bestimmte Gefährdungsbedingungen während des Renderings verhindern, aber da die Risikonachverfolgung für gekachelte Ressourcen auf Kachelebene erfolgen würde, ist die Nachverfolgung von Gefährdungsbedingungen während des Renderns von gekachelten Ressourcen möglicherweise zu teuer. |