Gambaran umum DXGI

Microsoft DirectX Graphics Infrastructure (DXGI) mengakui bahwa beberapa bagian grafik berkembang lebih lambat daripada yang lain. Tujuan utama DXGI adalah untuk mengelola tugas tingkat rendah yang dapat independen dari runtime grafik DirectX. DXGI menyediakan kerangka kerja umum untuk komponen grafis di masa mendatang; komponen pertama yang memanfaatkan DXGI adalah Microsoft Direct3D 10.

Dalam versi Direct3D sebelumnya, tugas tingkat rendah seperti enumerasi perangkat keras, menyajikan bingkai yang dirender ke output, mengontrol gamma, dan mengelola transisi layar penuh disertakan dalam runtime Direct3D. Tugas-tugas ini sekarang diimplementasikan di DXGI.

Tujuan DXGI adalah untuk berkomunikasi dengan driver mode kernel dan perangkat keras sistem, seperti yang ditunjukkan pada diagram berikut.

diagram komunikasi antara aplikasi, dxgi, dan driver dan perangkat keras

Aplikasi dapat mengakses DXGI secara langsung, atau memanggil API Direct3D di D3D11_1.h, D3D11.h, D3D10_1.h, atau D3D10.h, yang menangani komunikasi dengan DXGI untuk Anda. Anda mungkin ingin bekerja dengan DXGI secara langsung jika aplikasi Anda perlu menghitung perangkat atau mengontrol bagaimana data disajikan ke output.

Topik ini berisi bagian berikut.

Untuk melihat format mana yang didukung oleh perangkat keras Direct3D 11:

Menghitung adaptor

Adaptor adalah abstraksi dari perangkat keras dan kemampuan perangkat lunak komputer Anda. Umumnya ada banyak adaptor pada komputer Anda. Beberapa perangkat diimplementasikan dalam perangkat keras (seperti kartu video Anda) dan beberapa diimplementasikan dalam perangkat lunak (seperti rasterizer referensi Direct3D). Adaptor mengimplementasikan fungsionalitas yang digunakan oleh aplikasi grafis. Diagram berikut menunjukkan sistem dengan satu komputer, dua adaptor (kartu video), dan tiga monitor output.

diagram komputer dengan dua kartu video dan tiga monitor

Saat menghitung potongan perangkat keras ini, DXGI membuat antarmuka IDXGIOutput1 untuk setiap output (atau monitor) dan antarmuka IDXGIAdapter2 untuk setiap kartu video (bahkan jika itu adalah kartu video yang dibangun ke dalam motherboard). Enumerasi dilakukan dengan menggunakan panggilan antarmuka IDXGIFactory , IDXGIFactory::EnumAdapters, untuk mengembalikan serangkaian antarmuka IDXGIAdapter yang mewakili perangkat keras video.

DXGI 1.1 menambahkan antarmuka IDXGIFactory1 . IDXGIFactory1::EnumAdapters1 mengembalikan serangkaian antarmuka IDXGIAdapter1 yang mewakili perangkat keras video.

Jika Anda ingin memilih kemampuan perangkat keras video tertentu saat menggunakan DIRECT3D API, kami sarankan Anda secara berulang memanggil fungsi D3D11CreateDevice atau D3D11CreateDeviceAndSwapChain dengan setiap handel adapter dan kemungkinan tingkat fitur perangkat keras. Fungsi ini berhasil jika tingkat fitur didukung oleh adaptor yang ditentukan.

Info baru tentang menghitung adaptor untuk Windows 8

Dimulai dengan Windows 8, adaptor yang disebut "Microsoft Basic Render Driver" selalu ada. Adaptor ini memiliki VendorId 0x1414 dan DeviceID 0x8c. Adaptor ini juga memiliki nilai DXGI_ADAPTER_FLAG_SOFTWARE yang ditetapkan dalam anggota Bendera dari struktur DXGI_ADAPTER_DESC2-nya . Adaptor ini adalah perangkat khusus render yang tidak memiliki output tampilan. DXGI tidak pernah mengembalikan DXGI_ERROR_DEVICE_REMOVED untuk adaptor ini.

Jika driver tampilan komputer tidak berfungsi atau dinonaktifkan, adaptor utama komputer (NULL) mungkin juga disebut "Microsoft Basic Render Driver." Tetapi adaptor ini memiliki output dan tidak memiliki set nilai DXGI_ADAPTER_FLAG_SOFTWARE . Sistem operasi dan aplikasi menggunakan adaptor ini secara default. Jika driver tampilan diinstal atau diaktifkan, aplikasi dapat menerima DXGI_ERROR_DEVICE_REMOVED untuk adaptor ini lalu harus menghitung ulang adaptor lagi.

Ketika adaptor tampilan utama komputer adalah "Adaptor Tampilan Dasar Microsoft" (adaptor WARP ), komputer tersebut juga memiliki adaptor kedua. Adaptor kedua ini adalah perangkat khusus render yang tidak memiliki output tampilan dan DXGI tidak pernah mengembalikan DXGI_ERROR_DEVICE_REMOVED.

Jika Anda ingin menggunakan WARP untuk penyajian, komputasi, atau tugas jangka panjang lainnya, sebaiknya gunakan perangkat khusus render. Anda dapat memperoleh pointer ke perangkat khusus render dengan memanggil metode IDXGIFactory1::EnumAdapters1 . Anda juga membuat perangkat khusus render saat menentukan D3D_DRIVER_TYPE_WARP dalam parameter DriverTypeD3D11CreateDevice karena perangkat WARP juga menggunakan adaptor WARP khusus render.

Presentasi

Tugas aplikasi Anda adalah merender bingkai dan meminta DXGI untuk menyajikan bingkai tersebut ke output. Jika aplikasi memiliki dua buffer yang tersedia, aplikasi dapat merender satu buffer sambil menyajikan buffer lain. Aplikasi mungkin memerlukan lebih dari dua buffer tergantung pada waktu yang diperlukan untuk merender bingkai atau kecepatan bingkai yang diinginkan untuk presentasi. Set buffer yang dibuat disebut rantai pertukaran, seperti yang ditunjukkan di sini.

ilustrasi rantai pertukaran

Rantai pertukaran memiliki satu buffer depan dan satu atau beberapa buffer belakang. Setiap aplikasi membuat rantai pertukarannya sendiri. Untuk memaksimalkan kecepatan presentasi data ke output, rantai pertukaran hampir selalu dibuat dalam memori sub-sistem tampilan, yang ditunjukkan dalam ilustrasi berikut.

ilustrasi sub-sistem tampilan

Sub-sistem tampilan (yang sering kali merupakan kartu video tetapi dapat diimplementasikan pada motherboard) berisi GPU, pengonversi digital ke analog (DAC), dan memori. Rantai pertukaran dialokasikan dalam memori ini untuk membuat presentasi sangat cepat. Sub-sistem tampilan menyajikan data di buffer depan ke output.

Rantai pertukaran disiapkan untuk menggambar dalam mode layar penuh atau berjendela, ini menghilangkan kebutuhan untuk mengetahui apakah output berjendela atau layar penuh. Rantai pertukaran mode layar penuh dapat mengoptimalkan performa dengan mengalihkan resolusi tampilan.

Membuat rantai pertukaran

Perbedaan antara Direct3D 9 dan Direct3D 10: Direct3D 10 adalah komponen grafis pertama yang menggunakan DXGI. DXGI memiliki beberapa perilaku rantai pertukaran yang berbeda.
  • Di DXGI, rantai pertukaran terikat ke jendela saat rantai pertukaran dibuat. Perubahan ini meningkatkan performa dan menyimpan memori. Versi Direct3D sebelumnya memungkinkan rantai pertukaran untuk mengubah jendela tempat rantai pertukaran terikat.
  • Di DXGI, rantai pertukaran terkait dengan perangkat penyajian saat pembuatan. Objek perangkat yang dikembalikan fungsi perangkat buat Direct3D mengimplementasikan antarmuka IUnknown . Anda dapat memanggil QueryInterface untuk mengkueri antarmuka IDXGIDevice2 perangkat yang sesuai. Perubahan pada perangkat penyajian mengharuskan rantai pertukaran dibuat ulang.
  • Di DXGI, efek pertukaran yang tersedia DXGI_SWAP_EFFECT_DISCARD dan DXGI_SWAP_EFFECT_SEQUENTIAL. Dimulai dengan Windows 8 efek pertukaran DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL juga tersedia. Tabel berikut ini memperlihatkan pemetaan efek pertukaran Direct3D 9 ke DXGI.

    Efek Pertukaran D3D9 Efek Pertukaran DXGI
    D3DSWAPEFFECT_DISCARD DXGI_SWAP_EFFECT_DISCARD
    D3DSWAPEFFECT_COPY DXGI_SWAP_EFFECT_SEQUENTIAL dengan 1 buffer
    D3DSWAPEFFECT_FLIP DXGI_SWAP_EFFECT_SEQUENTIAL dengan 2 buffer atau lebih
    D3DSWAPEFFECT_FLIPEX DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL dengan 2 buffer atau lebih

Buffer rantai pertukaran dibuat pada ukuran tertentu dan dalam format tertentu. Aplikasi menentukan nilai-nilai ini (atau Anda dapat mewarisi ukuran dari jendela target) saat startup, dan kemudian dapat secara opsional memodifikasinya saat ukuran jendela berubah sebagai respons terhadap input pengguna atau peristiwa program.

Setelah Anda membuat rantai pertukaran, Anda biasanya ingin merender gambar ke dalamnya. Berikut adalah fragmen kode yang menyiapkan konteks Direct3D untuk dirender ke dalam rantai pertukaran. Kode ini mengekstrak buffer dari rantai pertukaran, membuat tampilan render-target dari buffer tersebut, lalu mengaturnya pada perangkat:

ID3D11Resource * pBB;
ThrowFailure( pSwapChain->GetBuffer(0, __uuidof(pBB),    
  reinterpret_cast<void**>(&pBB)), "Couldn't get back buffer");
ID3D11RenderTargetView * pView;
ThrowFailure( pD3D11Device->CreateRenderTargetView(pBB, NULL, &pView), 
  "Couldn't create view" );
pD3D11DeviceContext->OMSetRenderTargets(1, &pView, 0);
        

Setelah aplikasi Anda merender bingkai ke dalam buffer swap-chain, panggil IDXGISwapChain1::P resent1. Aplikasi kemudian dapat merender gambar berikutnya.

Perawatan dan pemberian makan rantai pertukaran

Setelah Merender gambar, panggil IDXGISwapChain1::P resent1 dan render gambar berikutnya. Itu adalah sejauh tanggung jawab Anda.

Jika sebelumnya Anda memanggil IDXGIFactory::MakeWindowAssociation, pengguna dapat menekan kombinasi tombol Alt-Enter dan DXGI akan mentransisikan aplikasi Anda antara mode berjendela dan layar penuh. IDXGIFactory::MakeWindowAssociation disarankan, karena mekanisme kontrol standar untuk pengguna sangat diinginkan.

Meskipun Anda tidak perlu menulis kode lagi daripada yang telah dijelaskan, beberapa langkah sederhana dapat membuat aplikasi Anda lebih responsif. Pertimbangan yang paling penting adalah mengubah ukuran buffer rantai pertukaran sebagai respons terhadap pengubahan ukuran jendela output. Tentu saja, rute terbaik aplikasi adalah menanggapi WM_SIZE, dan memanggil IDXGISwapChain::ResizeBuffers, meneruskan ukuran yang terkandung dalam parameter pesan. Perilaku ini jelas membuat aplikasi Anda merespons pengguna dengan baik ketika dia menyeret batas jendela, tetapi juga persis apa yang memungkinkan transisi layar penuh yang halus. Jendela Anda akan menerima pesan WM_SIZE setiap kali transisi seperti itu terjadi, dan memanggil IDXGISwapChain::ResizeBuffers adalah kesempatan rantai pertukaran untuk mengalokasikan ulang penyimpanan buffer untuk presentasi yang optimal. Inilah sebabnya mengapa aplikasi diperlukan untuk merilis referensi apa pun yang ada di buffer yang ada sebelum memanggil IDXGISwapChain::ResizeBuffers.

Kegagalan memanggil IDXGISwapChain::ResizeBuffers sebagai respons terhadap peralihan ke mode layar penuh (paling alami, sebagai respons terhadap WM_SIZE), dapat menghalangi pengoptimalan membalik, di mana DXGI hanya dapat menukar buffer mana yang ditampilkan, daripada menyalin data layar penuh.

IDXGISwapChain1::P resent1 akan memberi tahu Anda jika jendela output Anda sepenuhnya terpaku melalui DXGI_STATUS_OCCLUDED. Ketika ini terjadi, sebaiknya aplikasi Anda masuk ke mode siaga (dengan memanggil IDXGISwapChain1::P resent1 dengan DXGI_PRESENT_TEST) karena sumber daya yang digunakan untuk merender bingkai terbuang sia-sia. Menggunakan DXGI_PRESENT_TEST akan mencegah data disajikan saat masih melakukan pemeriksaan oklusi. Setelah IDXGISwapChain1::P resent1 mengembalikan S_OK, Anda harus keluar dari mode siaga; jangan gunakan kode kembali untuk beralih ke mode siaga karena itu dapat membuat rantai pertukaran tidak dapat melepaskan mode layar penuh.

Runtime Direct3D 11.1, yang tersedia dimulai dengan Windows 8, menyediakan rantai pertukaran model balik (yaitu, rantai pertukaran yang memiliki nilai DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL yang ditetapkan dalam anggota SwapEffectdari DXGI_SWAP_CHAIN_DESC atau DXGI_SWAP_CHAIN_DESC1). Saat Anda menyajikan bingkai ke output dengan rantai pertukaran model balik, DXGI membatalkan ikatan buffer belakang dari semua lokasi status alur, seperti target render output-merger, yang menulis ke kembali buffer 0. Oleh karena itu, kami sarankan Anda memanggil ID3D11DeviceContext::OMSetRenderTargets segera sebelum Anda merender ke buffer belakang. Misalnya, jangan panggil OMSetRenderTargets lalu lakukan pekerjaan shader komputasi yang akhirnya tidak dirender ke sumber daya. Untuk informasi selengkapnya tentang rantai pertukaran model balik dan manfaatnya, lihat Model Flip DXGI.

Catatan

Di Direct3D 10 dan Direct3D 11, Anda tidak perlu memanggil IDXGISwapChain::GetBuffer untuk mengambil kembali buffer 0 setelah Anda memanggil IDXGISwapChain1::P resent1 karena untuk kenyamanan identitas buffer belakang berubah. Ini tidak terjadi di Direct3D 12, dan aplikasi Anda harus melacak indeks buffer secara manual.

Menangani pengubahan ukuran jendela

Anda dapat menggunakan metode IDXGISwapChain::ResizeBuffers untuk menangani pengubahan ukuran jendela. Sebelum memanggil ResizeBuffers, Anda harus merilis semua referensi yang luar biasa ke buffer rantai pertukaran. Objek yang biasanya menyimpan referensi ke buffer rantai pertukaran adalah tampilan target render.

Contoh kode berikut menunjukkan cara memanggil ResizeBuffers dari dalam handler WindowProc untuk pesan WM_SIZE:

    case WM_SIZE:
        if (g_pSwapChain)
        {
            g_pd3dDeviceContext->OMSetRenderTargets(0, 0, 0);

            // Release all outstanding references to the swap chain's buffers.
            g_pRenderTargetView->Release();

            HRESULT hr;
            // Preserve the existing buffer count and format.
            // Automatically choose the width and height to match the client rect for HWNDs.
            hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
                                            
            // Perform error handling here!

            // Get buffer and create a render-target-view.
            ID3D11Texture2D* pBuffer;
            hr = g_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D),
                                         (void**) &pBuffer );
            // Perform error handling here!

            hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL,
                                                     &g_pRenderTargetView);
            // Perform error handling here!
            pBuffer->Release();

            g_pd3dDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL );

            // Set up the viewport.
            D3D11_VIEWPORT vp;
            vp.Width = width;
            vp.Height = height;
            vp.MinDepth = 0.0f;
            vp.MaxDepth = 1.0f;
            vp.TopLeftX = 0;
            vp.TopLeftY = 0;
            g_pd3dDeviceContext->RSSetViewports( 1, &vp );
        }
        return 1;

Memilih output dan ukuran DXGI

Secara default, DXGI memilih output yang berisi sebagian besar area klien jendela. Ini adalah satu-satunya opsi yang tersedia untuk DXGI ketika layar penuh itu sendiri sebagai respons terhadap alt-enter. Jika aplikasi memilih untuk pergi ke mode layar penuh dengan sendirinya, maka aplikasi dapat memanggil IDXGISwapChain::SetFullscreenState dan meneruskan IDXGIOutput1 eksplisit (atau NULL, jika aplikasi senang membiarkan DXGI memutuskan).

Untuk mengubah ukuran output saat layar penuh atau berjendela, sebaiknya panggil IDXGISwapChain::ResizeTarget, karena metode ini juga mengubah ukuran jendela target. Karena jendela target diubah ukurannya, sistem operasi mengirimkan WM_SIZE, dan kode Anda akan secara alami memanggil IDXGISwapChain::ResizeBuffers sebagai respons. Dengan demikian membuang-buang upaya untuk mengubah ukuran buffer Anda, dan kemudian mengubah ukuran target.

Penelusuran kesalahan dalam mode layar penuh

Rantai pertukaran DXGI melepaskan mode layar penuh hanya jika benar-benar diperlukan. Ini berarti Anda dapat men-debug aplikasi layar penuh menggunakan beberapa monitor, selama jendela debug tidak tumpang tindih dengan jendela target rantai pertukaran. Atau, Anda dapat mencegah peralihan mode sama sekali dengan tidak mengatur bendera DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH .

Jika pengalihan mode diizinkan, rantai pertukaran akan melepaskan mode layar penuh setiap kali jendela outputnya dihilangkan oleh jendela lain. Pemeriksaan oklusi dilakukan selama IDXGISwapChain1::P resent1, atau oleh utas terpisah yang tujuannya adalah watch untuk melihat apakah aplikasi telah menjadi tidak responsif (dan tidak lagi memanggil IDXGISwapChain1::P resent1). Untuk menonaktifkan kemampuan utas terpisah untuk menyebabkan pengalihan, atur kunci registri berikut ke nilai bukan nol.

HKCU\Software\Microsoft\DXGI\DisableFullscreenWatchdog

Menghancurkan rantai pertukaran

Anda tidak boleh merilis rantai pertukaran dalam mode layar penuh karena hal tersebut dapat membuat ketidakcocokan utas (yang akan menyebabkan DXGI menaikkan pengecualian yang tidak dapat dilanjutkan). Sebelum merilis rantai pertukaran, pertama-tama beralihlah ke mode berjendela (menggunakan IDXGISwapChain::SetFullscreenState( FALSE, NULL )) lalu panggil IUnknown::Release.

Menggunakan monitor yang diputar

Aplikasi tidak perlu khawatir tentang orientasi monitor, DXGI akan memutar buffer swap-chain selama presentasi, jika perlu. Tentu saja, rotasi tambahan ini dapat memengaruhi performa. Untuk performa terbaik, jaga rotasi dalam aplikasi Anda dengan melakukan hal berikut:

  • Gunakan DXGI_SWAP_CHAIN_FLAG_NONPREROTATED. Ini memberi tahu DXGI bahwa aplikasi akan menghasilkan gambar yang diputar (misalnya, dengan mengubah matriks proyeksinya). Satu hal yang perlu diperhatikan, bendera ini hanya valid saat dalam mode layar penuh.
  • Alokasikan setiap buffer swap-chain dalam ukuran yang diputar. Gunakan IDXGIOutput::GetDesc untuk mendapatkan nilai-nilai ini, jika perlu.

Dengan melakukan rotasi di aplikasi Anda, DXGI hanya akan melakukan salinan alih-alih salinan dan memutar.

Runtime Direct3D 11.1, yang tersedia dimulai dengan Windows 8, menyediakan rantai pertukaran model balik (yaitu, rantai pertukaran yang memiliki nilai DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL yang ditetapkan dalam anggota SwapEffectDXGI_SWAP_CHAIN_DESC1). Untuk memaksimalkan pengoptimalan presentasi yang tersedia dengan rantai pertukaran model balik, kami sarankan Anda membuat konten orientasi aplikasi Agar sesuai dengan output tertentu tempat konten berada ketika konten tersebut sepenuhnya menempati output. Untuk informasi selengkapnya tentang rantai pertukaran model balik dan manfaatnya, lihat Model Flip DXGI.

Beralih mode

Rantai pertukaran DXGI dapat mengubah mode tampilan output saat melakukan transisi layar penuh. Untuk mengaktifkan perubahan mode tampilan otomatis, Anda harus menentukan DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH dalam deskripsi swap-chain. Jika mode tampilan berubah secara otomatis, DXGI akan memilih mode yang paling sederhana (ukuran dan resolusi tidak akan berubah, tetapi kedalaman warna mungkin). Mengubah ukuran buffer rantai pertukaran tidak akan menyebabkan pengalihan mode. Rantai pertukaran membuat janji implisit bahwa jika Anda memilih buffer belakang yang sama persis dengan mode tampilan yang didukung oleh output target, maka akan beralih ke mode tampilan tersebut saat memasuki mode layar penuh pada output tersebut. Akibatnya, Anda memilih mode tampilan dengan memilih ukuran dan format buffer belakang Anda.

Tip performa layar penuh

Saat Anda memanggil IDXGISwapChain1::P resent1 pada aplikasi layar penuh, rantai pertukaran membalik (dibandingkan dengan blits) konten buffer belakang ke buffer depan. Ini mengharuskan rantai pertukaran dibuat dengan menggunakan mode tampilan enumerasi (ditentukan dalam DXGI_SWAP_CHAIN_DESC1). Jika Anda gagal menghitung mode tampilan, atau salah menentukan mode tampilan dalam deskripsi, rantai pertukaran dapat melakukan transfer blok bit (bitblt) sebagai gantinya. Bitblt menyebabkan salinan peregangan ekstra serta beberapa peningkatan penggunaan memori video, dan sulit dideteksi. Untuk menghindari masalah ini, hitung mode tampilan, dan inisialisasi deskripsi rantai pertukaran dengan benar sebelum Anda membuat rantai pertukaran. Ini akan memastikan performa maksimum saat membalik dalam mode layar penuh dan menghindari overhead memori tambahan.

Pertimbangan multithread

Ketika Anda menggunakan DXGI dalam aplikasi dengan beberapa utas, Anda harus berhati-hati untuk menghindari pembuatan kebuntuan, di mana dua utas yang berbeda menunggu satu sama lain untuk diselesaikan. Ada dua situasi di mana hal ini dapat terjadi.

  • Utas penyajian bukan utas pompa pesan.
  • Utas yang menjalankan API DXGI bukanlah utas yang sama yang membuat jendela.

Berhati-hatilah agar Anda tidak pernah menunggu utas pompa pesan di utas render saat Anda menggunakan rantai pertukaran layar penuh. Misalnya, memanggil IDXGISwapChain1::P resent1 (dari utas render) dapat menyebabkan utas render menunggu pada utas pompa pesan. Ketika perubahan mode terjadi, skenario ini dimungkinkan jika Present1 memanggil ::SetWindowPos() atau ::SetWindowStyle() dan salah satu metode ini memanggil ::SendMessage(). Dalam skenario ini, jika utas pompa pesan memiliki bagian penting yang melindunginya atau jika utas render diblokir, kedua utas akan mengalami kebuntuan.

Untuk informasi selengkapnya tentang menggunakan DXGI dengan beberapa utas, lihat Multithreading dan DXGI.

Respons DXGI dari DLLMain

Karena fungsi DllMain tidak dapat menjamin urutan pemuatan dan pembongkaran DLL, kami menyarankan agar fungsi DllMain aplikasi Anda tidak memanggil fungsi atau metode Direct3D atau DXGI, termasuk fungsi atau metode yang membuat atau merilis objek. Jika fungsi DllMain aplikasi Anda memanggil komponen tertentu, komponen tersebut mungkin memanggil DLL lain yang tidak ada di sistem operasi, yang menyebabkan sistem operasi mengalami crash. Direct3D dan DXGI mungkin memuat sekumpulan DLL, biasanya satu set driver, yang berbeda dari komputer ke komputer. Oleh karena itu, meskipun aplikasi Anda tidak mengalami crash pada komputer pengembangan dan pengujian saat fungsi DllMain memanggil fungsi atau metode Direct3D atau DXGI, aplikasi mungkin mengalami crash saat berjalan di komputer lain.

Untuk mencegah Anda membuat aplikasi yang dapat menyebabkan sistem operasi crash, DXGI memberikan respons berikut dalam situasi yang ditentukan:

  • Jika fungsi DllMain aplikasi Anda merilis referensi terakhirnya ke pabrik DXGI, DXGI akan mengajukan pengecualian.
  • Jika fungsi DllMain aplikasi Anda membuat pabrik DXGI, DXGI mengembalikan kode kesalahan.

Perubahan DXGI 1.1

Kami menambahkan fungsionalitas berikut di DXGI 1.1.

Perubahan DXGI 1.2

Kami menambahkan fungsionalitas berikut di DXGI 1.2.

  • Rantai pertukaran stereo
  • Rantai pertukaran model balik
  • Presentasi yang dioptimalkan (menggulir, persegi kotor, dan rotasi)
  • Peningkatan sumber daya dan sinkronisasi bersama
  • Duplikasi Desktop
  • Penggunaan memori video yang dioptimalkan
  • Dukungan untuk format 16 bit per piksel (bpp) (DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM)
  • MEN-debug API

Untuk informasi selengkapnya tentang DXGI 1.2, lihat Peningkatan DXGI 1.2.

Panduan Pemrograman untuk DXGI