Batasan Kontrol Alur

Instruksi kontrol aliran shader piksel memiliki batasan yang memengaruhi berapa banyak tingkat bersarang yang dapat disertakan dalam instruksi. Selain itu, ada beberapa batasan untuk menerapkan kontrol aliran per piksel dengan instruksi gradien.

Catatan

Saat Anda menggunakan profil shader *_4_0_level_9_x HLSL, Anda secara implisit menggunakan profil Shader Model 2.x untuk mendukung perangkat keras berkemampuan Direct3D 9. Profil Shader Model 2.x mendukung perilaku kontrol alur yang lebih terbatas daripada profil Model Shader 4.x dan yang lebih baru.

 

Jumlah Kedalaman Instruksi Pixel Shader

ps_2_0 tidak mendukung kontrol alur. Batasan untuk versi shader piksel lainnya tercantum di bawah ini.

Jumlah Kedalaman Instruksi untuk ps_2_x

Setiap instruksi dihitung terhadap satu atau beberapa batas kedalaman bersarang. Tabel berikut ini mencantumkan jumlah kedalaman yang ditambahkan atau dikurangi setiap instruksi dari kedalaman yang ada.

Instruksi Bersarang statis Bersarang dinamis loop/rep nesting panggilan bersarang
jika bool - ps 1 0 0 0
if_comp - ps 0 1 0 0
if pred - ps 0 1 0 0
else - ps 0 0 0 0
endif - ps -1(if bool - ps) -1(if pred - ps atau if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep - ps 0 0 -1 0
break - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
breakp - ps 0 0 0 0
panggilan - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Kedalaman Berlapis

Kedalaman berlapis menentukan jumlah instruksi dapat dipanggil dari dalam satu sama lain. Setiap jenis instruksi memiliki satu atau beberapa batas bersarang seperti yang ditunjukkan dalam tabel berikut.

Jenis Instruksi Maksimum
Bersarang statis 24 jika (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); 0 jika tidak
Bersarang dinamis 0 hingga 24, lihat D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth
rep nesting 0 hingga 4, lihat D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth
panggilan bersarang 0 hingga 4, lihat D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (terlepas dari batas rep)

 

Jumlah Kedalaman Instruksi untuk ps_2_sw

Setiap instruksi dihitung terhadap satu atau beberapa batas kedalaman bersarang. Tabel ini memperlihatkan jumlah kedalaman yang ditambahkan atau dikurangi setiap instruksi dari kedalaman yang ada.

Instruksi Bersarang statis Bersarang dinamis loop/rep nesting panggilan bersarang
jika bool - ps 1 0 0 0
if pred - ps 0 1 0 0
if_comp - ps 0 1 0 0
else - ps 0 0 0 0
endif - ps -1(if bool - ps) -1(if pred - ps atau if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep - ps 0 0 -1 0
loop - ps n/a n/a n/a n/a
endloop - ps n/a n/a n/a n/a
break - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
breakp - ps 0 0 0 0
panggilan - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Kedalaman Berlapis

Kedalaman berlapis menentukan jumlah instruksi yang dapat dipanggil dari dalam satu sama lain. Setiap jenis instruksi memiliki satu atau beberapa batas bersarang seperti yang ditunjukkan dalam tabel berikut.

Jenis Instruksi Maksimum
Bersarang statis 24
Bersarang dinamis 24
rep nesting 4
panggilan bersarang 4

 

Jumlah Kedalaman Instruksi untuk ps_3_0

Setiap instruksi dihitung terhadap satu atau beberapa batas kedalaman bersarang. Tabel ini memperlihatkan jumlah kedalaman yang ditambahkan atau dikurangi setiap instruksi dari kedalaman yang ada.

Instruksi Bersarang statis Bersarang dinamis loop/rep nesting panggilan bersarang
jika bool - ps 1 0 0 0
if pred - ps 0 1 0 0
if_comp - ps 0 1 0 0
else - ps 0 0 0 0
endif - ps -1(if bool - ps) -1(if pred - ps atau if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep - ps 0 0 -1 0
loop - ps 0 0 1 0
endloop - ps 0 0 -1 0
break - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
breakp - ps 0 0 0 0
panggilan - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Kedalaman Berlapis

Kedalaman bersarang menentukan jumlah instruksi yang dapat dipanggil dari dalam satu sama lain. Setiap jenis instruksi memiliki satu atau beberapa batas bersarang seperti yang ditunjukkan dalam tabel berikut.

Jenis Instruksi Maksimum
Bersarang statis 24
Bersarang dinamis 24
perulangan/rep bersarang 4
panggilan bersarang 4

 

Jumlah Kedalaman Instruksi untuk ps_3_sw

Setiap instruksi dihitung terhadap satu atau beberapa batas kedalaman bersarang. Tabel ini memperlihatkan jumlah kedalaman yang ditambahkan atau dikurangi setiap instruksi dari kedalaman yang ada.

Instruksi Bersarang statis Bersarang dinamis perulangan/rep bersarang panggilan bersarang
if bool - ps 1 0 0 0
if pred - ps 0 1 0 0
if_comp - ps 0 1 0 0
else - ps 0 0 0 0
endif - ps -1(if bool - ps) -1(if pred - ps atau if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep - ps 0 0 -1 0
loop - ps 0 0 1 0
endloop - ps 0 0 -1 0
break - ps 0 0 0 0
break_comp - ps 0 1, -1 0 0
breakp - ps 0 0 0 0
call - ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret - ps 0 -1(callnz pred - ps) 0 -1
setp_comp - ps 0 0 0 0

 

Kedalaman Berlapis

Kedalaman berlapis menentukan jumlah instruksi yang dapat dipanggil dari dalam satu sama lain. Setiap jenis instruksi memiliki satu atau beberapa batas bersarang seperti yang ditunjukkan dalam tabel berikut.

Jenis Instruksi Maksimum
Bersarang statis 24
Bersarang dinamis 24
loop/rep nesting 4
panggilan bersarang 4

 

Interaksi Per-Pixel Flow Control Dengan Gradien Layar

Set instruksi pemecah piksel mencakup beberapa instruksi yang menghasilkan atau menggunakan gradien jumlah sehubungan dengan ruang layar x dan y. Penggunaan yang paling umum untuk gradien adalah untuk menghitung perhitungan tingkat detail untuk pengambilan sampel tekstur, dan dalam kasus pemfilteran anisotropik, memilih sampel di sepanjang sumbu anisotropi. Biasanya, implementasi perangkat keras menjalankan shader piksel pada beberapa piksel secara bersamaan (seperti kisi 2x2), sehingga gradien jumlah yang dihitung dalam shader dapat diperkirakan secara wajar sebagai delta nilai pada titik eksekusi yang sama dalam piksel yang berdekatan.

Ketika kontrol alur ada dalam shader, hasil perhitungan gradien yang diminta di dalam jalur cabang tertentu ambigu ketika piksel yang berdekatan dapat menjalankan jalur kontrol alur terpisah. Oleh karena itu, dianggap ilegal untuk menggunakan operasi shader piksel apa pun yang meminta perhitungan gradien terjadi di lokasi yang berada di dalam konstruksi kontrol aliran yang dapat bervariasi di seluruh piksel untuk primitif tertentu yang dirasterisasi.

Semua instruksi shader piksel dipartisi ke dalam operasi yang diizinkan dan menjadi yang tidak diizinkan di dalam kontrol aliran:

  • Skenario A: Operasi yang tidak diizinkan di dalam kontrol aliran yang dapat bervariasi di seluruh piksel dalam primitif. Ini termasuk operasi yang tercantum dalam tabel berikut.

    Instruksi Diizinkan dalam Kontrol Alur saat:
    texld - ps_2_0 dan ke atas, texldb - ps dan texldp - ps Register sementara digunakan untuk koordinat tekstur.
    dsx - ps dan dsy - ps Register sementara digunakan untuk operand.

     

  • Skenario B: Operasi yang diizinkan di mana saja. Ini termasuk operasi yang tercantum dalam tabel berikut.

    Instruksi Diizinkan di mana saja ketika:
    texld - ps_2_0 dan ke atas, texldb - ps dan texldp - ps Kuantitas baca-saja digunakan untuk koordinat tekstur (dapat bervariasi per piksel, seperti koordinat tekstur terinterpolasi).
    dsx - ps dan dsy - ps Kuantitas baca-saja digunakan untuk operand input (dapat bervariasi per piksel, seperti koordinat tekstur terinterpolasi).
    texldl - ps Pengguna menyediakan tingkat detail sebagai argumen, sehingga tidak ada gradien, dan dengan demikian tidak ada masalah dengan kontrol alur.
    texldd - ps Pengguna menyediakan gradien sebagai argumen input, sehingga tidak ada masalah dengan kontrol alur.

     

Pembatasan ini diberlakukan secara ketat dalam validasi shader. Skenario yang memiliki kondisi cabang yang terlihat seperti akan bercabang secara konsisten di seluruh primitif, meskipun operan dalam ekspresi kondisi adalah kuantitas yang dihitung piksel-shader, namun demikian masih termasuk dalam skenario A dan tidak diizinkan. Demikian pula, skenario di mana gradien diminta pada beberapa kuantitas yang dihitung shader x dari dalam kontrol aliran dinamis, namun di mana tampaknya x tidak dimodifikasi di salah satu cabang, namun tetap termasuk dalam skenario A dan tidak diizinkan.

Predikasi termasuk dalam pembatasan kontrol aliran ini, sehingga implementasi tetap bebas untuk sepele menukar implementasi instruksi cabang dengan instruksi predikat.

Pengguna dapat menggunakan instruksi dari skenario A dan B bersama-sama. Misalnya, pengguna memerlukan sampel tekstur anisotropik yang diberi koordinat tekstur komputasi shader; namun, beban tekstur hanya diperlukan untuk piksel yang memenuhi beberapa kondisi per piksel. Untuk memenuhi persyaratan ini, pengguna dapat menghitung koordinat tekstur untuk semua piksel, di luar kontrol alur yang bervariasi per piksel, segera menghitung gradien menggunakan instruksi dsx - ps dan dsy - ps . Kemudian, dalam blok per piksel jika bool - ps/endif - ps , pengguna dapat menggunakan texldd - ps (beban tekstur dengan gradien yang disediakan pengguna), melewati gradien yang telah dihitung sebelumnya. Cara lain untuk menggambarkan pola penggunaan ini adalah, sementara semua piksel dalam primitif harus menghitung koordinat tekstur dan terlibat dengan perhitungan gradien, hanya piksel yang diperlukan untuk mengambil sampel tekstur yang benar-benar melakukannya.

Terlepas dari aturan ini, beban masih ada pada pengguna untuk memastikan bahwa sebelum menghitung gradien apa pun (atau melakukan sampel tekstur yang secara implisit menghitung gradien), register yang berisi data sumber harus telah diinisialisasi untuk semua jalur eksekusi sebelumnya. Inisialisasi register sementara tidak divalidasi atau diberlakukan secara umum.

Instruksi Piksel Shader