فهرست منبع

added testGL to detect errors in glLinkProgram

Nicolas Cannasse 8 سال پیش
والد
کامیت
d2a41fc13a
2فایلهای تغییر یافته به همراه38 افزوده شده و 2 حذف شده
  1. 1 1
      libs/sdl/sdl/Sdl.hx
  2. 37 1
      libs/sdl/sdl/Window.hx

+ 1 - 1
libs/sdl/sdl/Sdl.hx

@@ -35,7 +35,7 @@ class Sdl {
 		if( device == null ) device = "Unknown";
 		var flags = new haxe.EnumFlags<hl.UI.DialogFlags>();
 		flags.set(IsError);
-		var msg = 'The application was unable to create an OpenGL context\nfor your $device video card.\nOpenGL ${requiredGLMajor}.{$requiredGLMinor}+ is required, please update your driver.';
+		var msg = 'The application was unable to create an OpenGL context\nfor your $device video card.\nOpenGL $requiredGLMajor.$requiredGLMinor+ is required, please update your driver.';
 		hl.UI.dialog("OpenGL Error", msg, flags);
 		Sys.exit( -1);
 	}

+ 37 - 1
libs/sdl/sdl/Window.hx

@@ -31,7 +31,7 @@ class Window {
 			win = winCreate(@:privateAccess title.toUtf8(), width, height);
 			if( win == null ) throw "Failed to create window";
 			glctx = winGetGLContext(win);
-			if( glctx == null || !GL.init() ) {
+			if( glctx == null || !GL.init() || !testGL() ) {
 				destroy();
 				if( Sdl.onGlContextRetry() ) continue;
 				Sdl.onGlContextError();
@@ -42,6 +42,42 @@ class Window {
 		vsync = true;
 	}
 
+	function testGL() {
+		try {
+
+			var reg = ~/[0-9]+\.[0-9]+/;
+			var v : String = GL.getParameter(GL.SHADING_LANGUAGE_VERSION);
+			var shaderVersion = 130;
+			if( reg.match(v) )
+				shaderVersion = hxd.Math.imin( 150, Math.round( Std.parseFloat(reg.matched(0)) * 100 ) );
+
+			var vertex = GL.createShader(GL.VERTEX_SHADER);
+			GL.shaderSource(vertex, ["#version " + shaderVersion, "void main() { gl_Position = vec4(1.0); }"].join("\n"));
+			GL.compileShader(vertex);
+			if( GL.getShaderParameter(vertex, GL.COMPILE_STATUS) != 1 ) throw "Failed to compile VS ("+GL.getShaderInfoLog(vertex)+")";
+
+			var fragment = GL.createShader(GL.FRAGMENT_SHADER);
+			GL.shaderSource(fragment, ["#version " + shaderVersion, "out vec4 color; void main() { color = vec4(1.0); }"].join("\n"));
+			GL.compileShader(fragment);
+			if( GL.getShaderParameter(fragment, GL.COMPILE_STATUS) != 1 ) throw "Failed to compile FS ("+GL.getShaderInfoLog(fragment)+")";
+
+			var p = GL.createProgram();
+			GL.attachShader(p, vertex);
+			GL.attachShader(p, fragment);
+			GL.linkProgram(p);
+
+			if( GL.getProgramParameter(p, GL.LINK_STATUS) != 1 ) throw "Failed to link ("+GL.getProgramInfoLog(p)+")";
+
+			GL.deleteShader(vertex);
+			GL.deleteShader(fragment);
+
+		} catch( e : Dynamic ) {
+
+			return false;
+		}
+		return true;
+	}
+
 	function set_displayMode(mode) {
 		if( mode == displayMode )
 			return mode;