Bagaimana saya bisa membuat profil kecepatan vertex dan shader fragmen saya secara terpisah?

11

Saya ingin tahu bagaimana saya dapat memeriksa untuk melihat apakah verteks saya atau shader fragmen saya adalah hambatan dalam pipa rendering saya.

Saya telah membaca tentang menggunakan glQueryCounterdengan GL_TIMESTAMPtarget untuk mendapatkan pos pemeriksaan jam antara perintah OpenGL, tetapi ini tidak membedakan antara berbagai jenis shader.

Misalnya, jika satu frame pada GPU membutuhkan 8 ms untuk render, dapatkah saya memberi tahu bahwa vertex shader membutuhkan 7 ms dan shader fragmen membutuhkan 1 ms?

Tyler
sumber

Jawaban:

12

Vertex dan fragmen shader berjalan secara bersamaan, tidak secara berurutan, dan GPU secara otomatis memuat-keseimbangan di antara mereka, sehingga tidak mungkin untuk menentukan waktu tertentu seperti 7 ms untuk satu dan 1 ms untuk yang lain.

Namun, Anda dapat melakukan percobaan sederhana untuk mengukur letak kemacetan: setel matriks tampilan-proyeksi ke semua nol untuk semua panggilan draw Anda. Ini membuat semua simpul menghasilkan nol untuk posisi mereka dan membuat semua segitiga memburuk; Oleh karena itu, hubung singkat semua rasterisasi dan fragmen shading, sambil menjaga semua vertex shader bekerja (compiler shader tidak dapat mengoptimalkan apa pun, karena ia tidak tahu bahwa matriks akan ditetapkan ke nol pada saat runtime).

Ketika Anda mengukur kinerja dengan matriks nol, Anda akan melihat jumlah waktu yang dibutuhkan untuk menjalankan vertex shader saja, tanpa rasterisasi atau pekerjaan shading fragmen bersamaan dalam GPU. Anda kemudian dapat membandingkan ini dengan jumlah waktu yang dibutuhkan untuk rendering biasa untuk setiap pass. Jika dua kali serupa, celah mungkin sangat terikat; jika rendering zeroed-matrix secara signifikan lebih cepat, itu mungkin terikat-pixel. Mungkin juga untuk mendapatkan hasil antara, menunjukkan bahwa pekerjaan dibagi rata antara keduanya.

Nathan Reed
sumber