2014-06-11 10 views
7

Podczas debugowania mojego systemu odkryłem, że wszystkie używane przeze mnie shadery nigdy nie zostały skompilowane. Wszystkie programy GLSL były szczęśliwie połączone i działały jak czar.Czy opcja glCompileShader jest opcjonalna?

Przeszukałem całą bazę kodu dla połączeń pod numer glCompileShader, ale nie znaleziono.

Moje pytanie brzmi: czy jest to specyficzne zachowanie implementacji, nad którą pracuję? Czy kompilacja modułu cieniującego jest wykonywana niejawnie podczas łączenia programu? Czy to opcjonalne? Jeśli tak jest, jakie są zalety tego działania, poza pobieraniem dziennika błędów?

Nie mogłem znaleźć żadnej sprawy takiej jak moja w dokumentacji, jeśli coś przeoczyłem, czy możesz wskazać mi to?

Mój sprzedawca jest NVIDIA (kierowca 337,88)

EDIT: Również jestem NIE korzystając glCreateShaderProgram(), ale po prostu glCreateProgram() do tworzenia programów cieniujących.

+0

Jaki jest twój "GL_VENDOR"? – genpfault

+0

@genpfault Przykro mi, ale jestem pewien, że umieściłem go w tekście pytania, dodałem go teraz. – cifz

+0

Nie powinno działać w ten sposób, ale jest jeden sposób, który przychodzi mi na myśl od razu, co pozwoli ci pominąć kompilację obiektów shaderów . Nowsze wersje GL umożliwiają ładowanie wstępnie połączonych plików binarnych programu; Szczerze wątpię, że to właśnie dzieje się w twojej bazie kodu, ponieważ nie neguje to potrzeby kompilowania/łączenia programów przynajmniej raz na początku, a potem znowu, gdy zmienia się sterownik/sprzęt. Zasadniczo jest to przydatne do buforowania połączonych programów, aby skrócić czas ładowania przyszłych wykonań i na pewno wiesz, czy twoje oprogramowanie zostało zaprojektowane do pracy w ten sposób. –

Odpowiedz

6

Zostało to w większości rozwiązane w komentarzach (dzięki @Andon, @derhass i innym), ale ponieważ jest to interesujące pytanie, pozwól mi podsumować je w odpowiedzi i dodać więcej danych.

Nie biorąc pod uwagę skompilowanych shaderów, musisz skompilować swoje shadery, dzwoniąc pod numer glCompileShader() przed połączeniem programu z glLinkProgram(). Na podstawie danych zebranych ja, omijając połączenia glCompileShader() działa dobrze na:

  • NVIDIA GeForce GT 740m pod Windows 8.1.
  • NVIDIA pod Linuksem (z @derhass).
  • NVIDIA GeForce GT 620M pod Windows 8 (z @cifz)

To nie działa na:

  • Intel HD 4600 pod Windows 8.1.
  • Intel Iris w systemie Mac OS 10.9.2.
  • iPad Air pod iOS 7.1.
  • Dwa różne tablety z systemem Android.

Takie zachowanie wydaje się wyraźnie odizolowane od firmy NVIDIA. Specyfikacja mówi, że kompilowanie shaderów przed połączeniem jest konieczne. Z 3.3 specyfikacji:

Łączenie również nie powiedzie się, jeśli jeden lub więcej obiektów modułu cieniującego dołączonych do programu nie zostanie pomyślnie skompilowanych.

4,4 specyfikacje są nieco mniej wyraźne, obracając możliwych warunków błędu w liście, który zaczyna się:

linkami może nie ...

Normalnie może sugeruje, że zachowanie jest opcjonalne, ale nie jestem pewien, że jest to intencją tutaj. Wydaje mi się, że specyfikacje zostały po prostu sformatowane, a zamierzone zachowanie się nie zmieniło. Tak więc, IMHO, to jest błąd. Niezbyt poważny, ponieważ wszystkie legalne użycie nadal działa, ale nie sądzę, że to, co robi NVIDIA, ściśle przestrzega specyfikacji.

W każdym przypadku wywołanie glCompileShader() przed glLinkProgram() jest konieczne, aby kod działał na różnych platformach.

+0

Nazwałbym to "nieudokumentowanym rozszerzeniem", ponieważ wszystkie prawidłowe programy działają, ale w przeciwnym razie działa również nieprawidłowy program. – lvella

+2

W temacie języka, który jest "pożądany", * "Jeden lub więcej obiektów cieniowania dołączonych do' programu' nie jest skompilowanych pomyślnie "* pozostawia miejsce na implementację do kompilacji w czasie łącza bez faktycznego naruszania czegokolwiek. Być może takie jest stanowisko NV? W rzeczywistości nie oznacza to, że * "jeden lub więcej obiektów modułu cieniującego dołączonych do' programu' nie zostało wcześniej skompilowanych "*. Byłoby to zgodne z [poprzednio udokumentowaną instrukcją NV] (http://developer.download.nvidia.com/opengl/glsl/glsl_release_notes.pdf), że 'glCompileShader (...)' analizuje i sprawdza poprawność składni w ich implementacji. –

+0

Chciałbym zobaczyć, jaki jest stan obiektu 'GL_COMPILE_STATUS' w module cieniującym po tym, jak NVIDIA domyślnie kompiluje moduł cieniujący. –

Powiązane problemy