Memisahkan Buffer DMA

Titik pemisahan digunakan oleh manajer memori video untuk membagi item kerja besar yang dikirimkan oleh driver miniport tampilan menjadi item kerja yang lebih kecil yang membutuhkan lebih sedikit sumber daya GPU untuk dijalankan. Misalnya, buffer DMA besar mungkin mereferensikan sekumpulan alokasi yang mungkin tidak dapat pas dalam memori video lokal atau memori nonlokal. Satu-satunya cara untuk memproses item kerja seperti itu adalah dengan membaginya menjadi beberapa item kerja yang lebih kecil yang membutuhkan lebih sedikit sumber daya GPU.

Catatan Pemisahan buffer DMA dan pemisahan buffer DMA adalah konsep independen yang berbeda. Driver miniport tampilan harus selalu mendukung pemisahan buffer DMA bahkan pada sistem dengan GPU di mana pendahuluan buffer DMA tidak dimungkinkan. Pada sistem dengan GPU di mana penyimpanan dan pemulihan konteks tidak dimungkinkan, penjadwal GPU menjadwalkan bagian terpisah dari buffer DMA kembali ke kembali memastikan bagian pemisahan tidak diselingi dengan buffer DMA lain dari konteks GPU yang berbeda. Namun, buffer paging harus dikirimkan antara bagian dari buffer DMA terpisah karena operasi paging diperlukan antara bagian terpisah dari buffer DMA. Setiap titik pemisahan yang digunakan driver untuk membangun aliran DMA aplikasi digunakan oleh manajer memori video. Buffer DMA yang dikirimkan harus memprogram ulang status GPU yang cukup setelah setiap titik pemisahan untuk memperhitungkan buffer halaman potensial yang mungkin disisipkan di lokasi tersebut.

Untuk menentukan titik terpisah, driver miniport tampilan menentukan nilai dalam anggota SplitOffset dan SlotId dari struktur D3DDDI_PATCHLOCATIONLIST untuk setiap alokasi yang dirujuk dalam anggota AllocationIndex D3DDDI_PATCHLOCATIONLIST. Untuk melacak penggunaan alokasi dalam buffer DMA tertentu, manajer memori video membuat dimensi array yang diperlukan menggunakan anggota MaxAllocationListSlotId dari struktur DXGK_DRIVERCAPS yang disediakan driver melalui panggilan ke fungsi DxgkDdiQueryAdapterInfo - nya. Array ini diinisialisasi pada nol dan diisi sebagai entri bagian terpisah dari daftar lokasi patch diproses. Anggota SlotIdD3DDDI_PATCHLOCATIONLIST untuk lokasi patch menunjukkan baris tabel sumber daya mana yang harus diperbarui sementara anggota SplitOffset menunjukkan offset dalam buffer DMA tempat alokasi diperlukan. Buffer DMA dapat dijalankan hingga titik yang ditentukan oleh SplitOffset tanpa sumber daya dapat diakses oleh GPU. Demikian pula, jika entri bagian pemisahan lokasi patch baru mengacu pada SlotId yang sama, alokasi sebelumnya digantikan oleh alokasi baru, dan alokasi sebelumnya tidak lagi diperlukan (artinya, alokasi sebelumnya dapat di-paged-out).

Saat halaman dalam sumber daya yang diperlukan oleh buffer DMA, manajer memori video memproses daftar lokasi patch dengan memulai dengan elemen pertama dan bergerak ke bawah menuju elemen terakhir. Elemen D3DDDI_PATCHLOCATIONLIST yang diisi oleh driver harus berisi nilai dalam anggota SplitOffset mereka; elemen benar-benar meningkat (artinya, alokasi harus muncul dalam urutan penggunaannya dalam aliran). Halaman manajer memori video dalam alokasi yang dirujuk dalam daftar lokasi patch dalam urutan yang disediakan. Ketika titik tercapai di mana manajer memori video tidak dapat lagi memasukkan halaman dalam alokasi karena kondisi memori yang rendah, manajer memori video mengirimkan bagian buffer DMA saat ini yang disiapkan ke penjadwal GPU untuk dieksekusi. Buffer DMA dijalankan dari awal titik pemisahan sebelumnya hingga nilai SplitOffset yang ditentukan untuk alokasi yang tidak dapat dibawa. Setelah dikirimkan, manajer memori video menentukan daftar alokasi yang diperlukan pada offset terpisah saat ini di aliran DMA dengan menggunakan tabel sumber daya. Semua alokasi pada tabel disimpan di lokasi fisik mereka saat ini sementara alokasi lain yang tidak lagi digunakan mungkin dikeluarkan. Manajer memori video kemudian terus memproses daftar lokasi patch, berpotensi memisahkan beberapa kali lagi.

Driver harus menentukan titik terpisah setiap kali alokasi terikat atau tidak terikat. Untuk menentukan bahwa alokasi tidak terikat, driver dapat menentukan handel alokasi NULL di anggota hDeviceSpecificAllocation dari struktur DXGK_ALLOCATIONLIST dengan nilai yang sesuai di anggota SlotId dari D3DDDI_PATCHLOCATIONLIST terkait. Driver harus membatalkan pengikatan sumber daya besar untuk meningkatkan kemungkinan manajer memori video dapat memecahkan masalah penempatan memori yang kompleks.

Demikian pula, driver harus memprogram ulang sumber daya besar di setiap titik pemisahan. Saat mengambil titik terpisah, manajer memori video dipaksa untuk meninggalkan alokasi yang terikat sebelumnya ke alokasi sebelumnya. Hal ini menyebabkan fragmentasi memori yang dapat menyebabkan kegagalan untuk memecahkan masalah penempatan memori kompleks yang mungkin telah diselesaikan jika bukan untuk pembatasan alokasi yang terikat sebelumnya. Saat menghitung status pada titik pemisahan, manajer memori video menentukan pengidentifikasi slot (SlotId) mana yang sedang diprogram ulang pada titik pemisahan tersebut (yaitu, setiap elemen daftar lokasi patch yang berbagi nilai SplitOffset yang sama dengan elemen lain) dan mengabaikan pembatasan penempatan pada titik pemisahan ini. Misalnya, jika driver menggunakan tekstur 64-MB, memprogram ulang tekstur tersebut di setiap titik pemisahan memberi manajer memori video fleksibilitas untuk memindahkan tekstur tersebut dalam memori di antara titik terpisah jika perlu.