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