DGL
https://delphigl.com/forum/

glsl Errorcodes
https://delphigl.com/forum/viewtopic.php?f=20&t=8509
Seite 1 von 1

Autor:  mori [ So Jul 05, 2009 14:46 ]
Betreff des Beitrags:  glsl Errorcodes

Hi,
ich schreibe im Moment noch an meiner Shader-Klasse, nun habe ich ein Problem entdeckt. ATI-Grafikkarten, erstellen auch einen Infolog um mir mitzuteilen ob die Shader in Hard- oder Software ausgeführt werden, ich interpretiere im Moment jedoch jeden Infologeintrag als Fehler und lasse das Programm beenden. Gibt es eine Möglichkeit eine Liste mit allen Errorcodes zu bekommen und herauszufinden welche keine Fehler sind?

Autor:  Coolcat [ So Jul 05, 2009 15:00 ]
Betreff des Beitrags: 

Ich mache einfach mal Copy&Paste aus meinem Code. Also GL_COMPILE_STATUS bzw. GL_LINK_STATUS checken.

Code:
  1. GLuint CUtil::loadShader(GLenum type, const char* filename) {
  2.     FILE* file = fopen(filename, "rb");
  3.     if (file == 0) {
  4.         throw Exception(std::string("error loading '") + filename + "'");
  5.     }
  6.  
  7.     fseek(file, 0, SEEK_END);
  8.     int size = ftell(file);
  9.     fseek(file, 0, SEEK_SET);
  10.     char* data = new char[size+1];
  11.     int read = fread(data,1,size,file);
  12.     if (read != size) {
  13.         throw Exception(std::string("error while loading '") + filename + "'");
  14.     }
  15.     fclose(file);
  16.     data[size]=0;
  17.     const char* data_const = data;
  18.  
  19.     GLuint shader = glCreateShader(type);
  20.     glShaderSource(shader, 1, &data_const, NULL);
  21.     glCompileShader(shader);
  22.     delete[] data;
  23.  
  24.     // retrieve infolog
  25.     int len;
  26.     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
  27.     if (len > 1) {
  28.         char buffer[len];
  29.         glGetShaderInfoLog(shader, len, NULL, buffer);
  30.         std::cout << "file: " << filename << "\n";
  31.         std::cout << buffer << "\n";
  32.     }
  33.    
  34.     int status = 0;
  35.     glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  36.     if (status) {
  37.         return shader;
  38.     }
  39.     else {
  40.         throw Exception("error: shader compilation failed.");
  41.     }
  42. }
  43.  
  44. void CUtil::checkLinkError(const std::string name, GLuint program) {
  45.     int status = 0;
  46.     glGetProgramiv(program, GL_LINK_STATUS, &status);
  47.     if (!status) {
  48.         // retrieve infolog
  49.         int len;
  50.         glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
  51.         if (len > 1) {
  52.             char buffer[len];
  53.             glGetProgramInfoLog(program, len, NULL, buffer);
  54.             std::cout << buffer << "\n";
  55.         }
  56.         throw Exception(name + ": program linking failed.");
  57.     }
  58. }

Autor:  waran [ So Jul 05, 2009 15:00 ]
Betreff des Beitrags: 

Ich würde es anders rum machen - die Nachricht mit Hardware mode ignorieren und falls
er in Software läuft eine Warnung abgeben.

Edit: Oder eben CoolCats Methode mit glGetShaderiv :)

Autor:  mori [ Mo Jul 06, 2009 13:14 ]
Betreff des Beitrags: 

Hi,
könnt ihr mir bitte nochmal erklären wo der Fehler abgefangen wird. Wie ich an die Infos komme weis ich ja, ich weis nur nicht wie oder wo ich die eine Mitteilung abfangen oder erkennen kann, damit mein Programm sich nicht beendet, sondern weiter läuft.

Autor:  Coolcat [ Mo Jul 06, 2009 13:33 ]
Betreff des Beitrags: 

Mit GL_COMPILE_STATUS kannst du abfragen ob der vorhergehende Compiliervorgang von "shader" erfolgreich war:
Code:
  1. int status = 0;
  2. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  3. if (status) {
  4.      // erfolg
  5. }
  6. else {
  7.      // schiefgegangen
  8. }


Analog kannst du mit GL_LINK_STATUS abfragen ob der vorhergehende Linkvorgang des Programms "program" erfolgreich war:
Code:
  1. int status = 0;
  2. glGetProgramiv(program, GL_LINK_STATUS, &status);
  3. if (status) {
  4.      // erfolg
  5. }
  6. else {
  7.      // schiefgegangen
  8. }

Autor:  mori [ Mo Jul 06, 2009 16:11 ]
Betreff des Beitrags: 

@Coolcat: Ja, ich weis ja wie ich an die Meldungen komme. Vielleicht habt ihr mich falsch verstanden, auf einem Laptop mit einer ATI-Grafikkarte kommt immer eine Meldung die etwa so ist "Vertexshader läuft im Hardwaremodus. Pixelshader läuft im Hardwaremodus". Mein Programm kann allerdings nicht unterscheiden, ob das jetzt ein Fehler ist, oder ob es eine Infomeldung ist, standartmäßig interpretiert es die Infomeldung als Fehler und beendet sich. Jetzt ist meine Frage wie ich herausfinden kann ob es eine Infomeldung ist, damit mein Programm sich nicht bei einer Meldung beendet bei der es sich eigendlich nicht beenden müsste.

Autor:  Wilson [ Mo Jul 06, 2009 17:04 ]
Betreff des Beitrags: 

Genau das hat Coolcat doch geschrieben: Der Code speichert in nem Boolean ob der Compile- / Linkvorgang erfolgreich war...

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/