Просмотр исходного кода

Fix optim GL unused input shader (#599)

Tom SPIRA 6 лет назад
Родитель
Сommit
a08f53ebdd
1 измененных файлов с 29 добавлено и 9 удалено
  1. 29 9
      h3d/impl/GlDriver.hx

+ 29 - 9
h3d/impl/GlDriver.hx

@@ -131,6 +131,7 @@ private class CompiledProgram {
 	public var stride : Int;
 	public var inputs : InputNames;
 	public var attribs : Array<CompiledAttribute>;
+	public var hasAttribIndex : Array<Bool>;
 	public function new() {
 	}
 }
@@ -154,7 +155,8 @@ class GlDriver extends Driver {
 	#end
 
 	var commonFB : Framebuffer;
-	var curAttribs : Int = 0;
+	var curAttribs : Array<Bool> = new Array<Bool>();
+	var maxIdxCurAttribs : Int = 0;
 	var curShader : CompiledProgram;
 	var curBuffer : h3d.Buffer;
 	var curIndexBuffer : IndexBuffer;
@@ -188,7 +190,7 @@ class GlDriver extends Driver {
 	var maxCompressedTexturesSupport = 0;
 
 	var drawMode : Int;
-	
+
 	/**
 		Perform OUT_OF_MEMORY checks when allocating textures/buffers.
 		Default true, except in WebGL (false)
@@ -282,7 +284,8 @@ class GlDriver extends Driver {
 		this.frame = frame;
 		resetStream();
 		#if cpp
-		curAttribs = 0;
+		curAttribs = new Array<Bool>();
+		maxIdxCurAttribs = 0;
 		curMatBits = -1;
 		#end
 		gl.useProgram(null);
@@ -421,6 +424,7 @@ class GlDriver extends Driver {
 			initShader(p, p.fragment, shader.fragment);
 			var attribNames = [];
 			p.attribs = [];
+			p.hasAttribIndex = [];
 			p.stride = 0;
 			for( v in shader.vertex.data.vars )
 				switch( v.kind ) {
@@ -451,6 +455,7 @@ class GlDriver extends Driver {
 							}
 					}
 					p.attribs.push(a);
+					p.hasAttribIndex[a.index] = true;
 					attribNames.push(v.name);
 					p.stride += size;
 				default:
@@ -461,12 +466,27 @@ class GlDriver extends Driver {
 		if( curShader == p ) return false;
 
 		gl.useProgram(p.p);
-		for( i in curAttribs...p.attribs.length ) {
-			gl.enableVertexAttribArray(i);
-			curAttribs++;
+
+		for( a in p.attribs )
+			if( !curAttribs[a.index] ) {
+				gl.enableVertexAttribArray(a.index);
+				curAttribs[a.index] = true;
+				if (maxIdxCurAttribs < a.index) {
+					maxIdxCurAttribs = a.index;
+				}
+			}
+
+		var lastIdxCurAttribTrue = 0;
+		for( i in 0...maxIdxCurAttribs+1 ) {
+			if( curAttribs[i] && !p.hasAttribIndex[i]) {
+				gl.disableVertexAttribArray(i);
+				curAttribs[i] = false;
+			} else if (curAttribs[i]) {
+				lastIdxCurAttribTrue = i;
+			}
 		}
-		while( curAttribs > p.attribs.length )
-			gl.disableVertexAttribArray(--curAttribs);
+		maxIdxCurAttribs = lastIdxCurAttribTrue;
+
 		curShader = p;
 		curBuffer = null;
 		for( i in 0...boundTextures.length )
@@ -1759,4 +1779,4 @@ class GlDriver extends Driver {
 
 }
 
-#end
+#end