Systemabsturz bei Tessellation Shader



  • Hallo,

    folgenden Code benutze ich momentan um meine GLSL Shader zu laden:

    programID = glCreateProgram();
    
    std::string shaderPath = path + ".vert";
    if (loadFromFile(shaderPath, GL_VERTEX_SHADER, 0))
    	glAttachShader(programID, shaderIDs[0].first);
    
    shaderPath = path + ".frag";
    if (loadFromFile(shaderPath, GL_FRAGMENT_SHADER, 1))
    	glAttachShader(programID, shaderIDs[1].first);
    
    shaderPath = path + ".tesc";
    if (loadFromFile(shaderPath, GL_TESS_CONTROL_SHADER, 2))
    	glAttachShader(programID, shaderIDs[2].first);
    
    shaderPath = path + ".tese";
    if (loadFromFile(shaderPath, GL_TESS_EVALUATION_SHADER, 3))
    	glAttachShader(programID, shaderIDs[3].first);
    
    shaderPath = path + ".geo";
    if (loadFromFile(shaderPath, GL_GEOMETRY_SHADER, 4))
    	glAttachShader(programID, shaderIDs[4].first);
    
    std::cerr << "Linking Shader: " << path << "\n";
    glLinkProgram(programID);
    
    GLint result = GL_FALSE;
    int infoLogLength = 0;
    glGetProgramiv(programID, GL_LINK_STATUS, &result);
    glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength);
    std::vector<char> programErrorMessage(std::max(infoLogLength, 1));
    glGetProgramInfoLog(programID, infoLogLength, nullptr, &programErrorMessage[0]);
    std::cout << &programErrorMessage[0] << "\n";
    
    for (int i = 0; i < 5; ++i)
    {
    	if (shaderIDs[i].second)
    		glDeleteShader(shaderIDs[i].first);
    }
    

    Wenn ich nur einen Vertex- und Fragmentshader habe klappt das ganze ohne Probleme. Wenn ich jetzt aber auch einen Tessellationshader laden möchte, friert mein ganzer PC ein und meine Festplatte klingt wie eine Dampflok. Die einzige Lösung ist dann ein Neustarten des PCs.
    Nach ein bisschen Debuggen habe ich herausgefunden, dass das Problem wohl beim Linken liegt. Zeile 24 wird noch ohne zu meckern ausgeführt, aber bei dem Versuch dann Zeile 28 auszuführen tritt das Problem auf. Beim Compilieren der Shader trat dabei kein Problem auf.
    Leider sehe ich hier überhaupt nicht, wo das Problem liegen könnte. Ich habe eine Radeon HD 6850 und auch schon die neusten Grafiktreiber installiert. Unterstützen kann meine GraKa damit OpenGL 4.4.

    Hoffentlich hat da jemand einen Rat. Schonmal Danke im Voraus 😉



  • Hast du den Bug schon reported ?
    Ich glaube in den AMD Foren wärst du besser aufgehoben. 😉

    Naja mal als Ansatz, was macht dein Shader denn? Mal mit einem simpleren Shader probiert um rauszufinden ob der Shader etwas macht was die Grafikkarte nicht mag?
    Und bekommst du einen Log wenn du ihn vor de mLinken abfragst, oder ist der komplett leer ?
    Und wie sieht deine "loadFromFile" Methode aus ?



  • Bist du dir sicher, dass das ein Bug ist? Das wär natürlich nicht so gut.
    Die loadFromFile Funktion sieht so aus und macht keine Probleme:

    bool Shader::loadFromFile(std::string path, GLenum type, int index)
    {
    	shaderIDs[index].first = glCreateShader(type);
    
    	std::string code;
    	std::ifstream stream(path, std::ios::in);
    
    	if (stream.is_open())
    	{
    		std::string line = "";
    		while (getline(stream, line))
    		{
    			code += "\n" + line;
    		}
    		stream.close();
    	}
    	else
    	{
    		std::cerr << "Must not be an error!\nShader not found: " << path << "\n";
    		shaderIDs[index].second = false;
    		return false;
    	}
    
    	GLint result = GL_FALSE;
    	int infoLogLength = 0;
    
    	std::cerr << "Compiling Shader: " << path << "\n";
    	const char* codePointer = code.c_str();
    	glShaderSource(shaderIDs[index].first, 1, &codePointer, nullptr);
    	glCompileShader(shaderIDs[index].first);
    
    	glGetShaderiv(shaderIDs[index].first, GL_COMPILE_STATUS, &result);
    	glGetShaderiv(shaderIDs[index].first, GL_INFO_LOG_LENGTH, &infoLogLength);
    	std::vector<char> errorMessage(std::max(infoLogLength, 1));
    	glGetShaderInfoLog(shaderIDs[index].first, infoLogLength, nullptr, &errorMessage[0]);
    	std::cerr << &errorMessage[0] << "\n";
    
    	shaderIDs[index].second = true;
    
    	return true;
    }
    

    Welchen Log soll ich vor dem Linken abfragen? Den Compilestatus frage ich ja schon ab und der sagt alles Bestens. Und den Linkstatus vorher abzufragen macht glaube ich nicht so viel Sinn. Ich probiere es morgen aber mal aus 😉
    Ich konnte, zumindest so denke ich, den Fehler auf den Controllshader eingrenzen. Wenn kein Controllshader compiliert/attached wird, gibt es keine Probleme. Doch sobald der Controllshader compiliert wird, mag er noch so primitiv sein, stürzt alles ab.
    Den Shader, welchen ich zu Beginn ausprobiert habe finet man hier.
    Interessant hierbei ist vielleicht noch, dass ich in der Zeile

    return any(lessThan(vertex.xy, vec2(-1.7)) || greaterThan(vertex.xy, vec2(1.7)));
    

    die Fehlermeldung bekomme, dass es keinen || Operator für bvec2 gibt. Diesen Fehler konnte ich auch auf einfachere Fälle verallgemeinern, doch eigentlich sollte es den || Operator doch für bvec2 geben 😕



  • Ralf B schrieb:

    Bist du dir sicher, dass das ein Bug ist? Das wär natürlich nicht so gut.

    Ja, es ist definitiv sein Bug. Es darf nicht sein dass ein ganz normales Programm das OpenGL (falsch?) verwendet das System crasht!

    Ralf B schrieb:

    Welchen Log soll ich vor dem Linken abfragen? Den Compilestatus frage ich ja schon ab und der sagt alles Bestens. Und den Linkstatus vorher abzufragen macht glaube ich nicht so viel Sinn.

    Stimm, dacht nur dass es eventuell einen Log fürs attachen gibt, aber das war ein Irrtum. 😉

    Ralf B schrieb:

    Interessant hierbei ist vielleicht noch, dass ich in der Zeile

    return any(lessThan(vertex.xy, vec2(-1.7)) || greaterThan(vertex.xy, vec2(1.7)));
    

    die Fehlermeldung bekomme, dass es keinen || Operator für bvec2 gibt. Diesen Fehler konnte ich auch auf einfachere Fälle verallgemeinern, doch eigentlich sollte es den || Operator doch für bvec2 geben 😕

    Kann es sein dass der Shader dann einfach nicht valid ist und du ihn trotzdem versuchst zu linken ? Weil du gibts ja trotz Fehler true zurück.

    Nur nochmal um das klar zu stellen: Wenn du den Shader absolut minimalistisch machst, so dass er praktisch nichts macht, geht es dann auch nicht ?



  • Ja, selbst bei

    void main(){}
    

    schmiert das Programm ab. Wenn der Shader nicht valid ist, wird dieser anscheinend einfach nicht mitgelinkt und alles funktioniert (außer der Tessshader natürlich).
    Ich habe auch schon alle libs nochmal neu gebaut und schon andere GLEW und GLFW Versionen probiert, ohne Erfolg. Allerdings habe ich noch feststellen können, dass das Programm nur beim Debuggen absürzt. Wenn ich die .exe einfach so starte, sehe ich einfach nur ein weißes Fenster, was nichts macht. Desweiteren konnte ich den Grund für den Systemabsturz ausfindig machen. Beim Debuggen fordert das Programm (wenn der Tessshader geladen werden soll) jede Sekunde ca. 1GB RAM an, bis dieser voll ist, dann macht es sich an die Festplatte. Das erklärt warum meine Festplatte dann immer voll ausgelastet ist und das System einfriert.



  • Ich habe das Problem gefunden und es ist mir schon ein wenig peinlich 🙄
    Auch wenn es die ganze Zeit so aus sah, als ob das Problem beim Controllshader lag, war es tatsächlich der Evaluationshader. Ich habe mal den Evaluationshader alleine ohne den Controllshader mitgelinkt und dann spuckte mir der log aus, dass der Layout-Qualifier fehle, also diese Zeile hier:

    layout(quads, equal_spacing, ccw) in;
    

    Und tatsächlich. Besagte Zeile hinzugefügt und auch den Controllshader wieder mitgelinkt und alles klappte bestens (ok, das Ergebnis sah noch nicht wie gewünscht aus :D)

    Danke an DarkShadow44 für die Untersützung und ich hoffe, dass dieser Thread in Zukunft ein paar anderen unfähigen OpenGL-Programmieren helfen wird 😉



  • Gut zu hören. 🙂
    Dennoch solltest du den Bug noch melden (wenn du das noch nicht gemacht hast), damit der auch gefixt wird. 😉


Anmelden zum Antworten