Існує кілька пропозицій постачальників GPU, таких як AMD CodeXL або NVIDIA nSight / Linux GFX Debugger, які дозволяють переходити через шейдери, але прив’язані до обладнання відповідного постачальника.
Зазначу, що, хоча вони доступні під Linux, я завжди мав дуже малий успіх у використанні їх там. Я не можу коментувати ситуацію в Windows.
Варіант, який я нещодавно почав використовувати, - це модулювати свій шейдерний код за допомогою #includes
та обмежити включений код до загального підмножини GLSL та C ++ & glm .
Коли я потрапляю на проблему, я намагаюся відтворити її на іншому пристрої, щоб побачити, чи проблема є такою ж, яка натякає на логічну помилку (замість проблеми з драйвером / невизначеної поведінки). Також є ймовірність передачі неправильних даних до графічного процесора (наприклад, через неправильно пов'язані буфери тощо), які, як правило, виключаю або за допомогою налагодження виводу, як у відповіді cifz, або шляхом перевірки даних за допомогою apitrace .
Коли це логічна помилка, я намагаюся відновити ситуацію з графічного процесора на процесорі, викликаючи включений код у процесорі з тими ж даними. Тоді я можу перейти через це на процесорі.
Спираючись на модульність коду, ви також можете спробувати написати одиничний тест для нього та порівняти результати між запуском GPU та процесором. Однак ви повинні знати, що є випадкові випадки, коли C ++ може поводитись інакше, ніж GLSL, таким чином, ви даєте помилкові позитиви в цих порівняннях.
Нарешті, коли ви не можете відтворити проблему на іншому пристрої, ви можете почати копати лише там, де походить різниця. Unittests можуть допомогти вам звузити місце, де це відбувається, але, зрештою, вам, мабуть, потрібно буде виписати додаткову інформацію про налагодження з шейдера, як у відповіді cifz .
А для того, щоб дати вам огляд, тут є блок-схема мого процесу налагодження:
Щоб завершити це, наведено список випадкових плюсів і мінусів:
профі
- перейти через звичайний налагоджувач
- додаткова (часто краще) компіляційна діагностика
кон