2
0
Nicolas Cannasse 11 жил өмнө
parent
commit
a5c64843ca

+ 4 - 1
h2d/RenderContext.hx

@@ -46,7 +46,10 @@ class RenderContext {
 	function initShaders( shaders ) {
 		currentShaders = shaders;
 		compiledShader = manager.compileShaders(shaders);
-		buffers = new h3d.shader.Buffers(compiledShader);
+		if( buffers == null )
+			buffers = new h3d.shader.Buffers(compiledShader);
+		else
+			buffers.grow(compiledShader);
 		manager.fillGlobals(buffers, compiledShader);
 		engine.selectShader(compiledShader);
 		engine.uploadShaderBuffers(buffers, Globals);

+ 8 - 4
h3d/pass/Base.hx

@@ -8,6 +8,7 @@ class Base {
 	var manager : h3d.shader.Manager;
 	var globals(get, never) : hxsl.Globals;
 	var priority : Int = 0;
+	var cachedBuffer : h3d.shader.Buffers;
 	public var lightSystem : LightSystem;
 
 	inline function get_globals() return manager.globals;
@@ -42,8 +43,12 @@ class Base {
 		return manager.compileShaders(out);
 	}
 
-	function allocBuffer( s : hxsl.RuntimeShader, shaders : Array<hxsl.Shader> ) {
-		var buf = new h3d.shader.Buffers(s);
+	function initBuffer( s : hxsl.RuntimeShader, shaders : Array<hxsl.Shader> ) {
+		if( cachedBuffer == null )
+			cachedBuffer = new h3d.shader.Buffers(s);
+		else
+			cachedBuffer.grow(s);
+		var buf = cachedBuffer;
 		manager.fillGlobals(buf, s);
 		manager.fillParams(buf, s, shaders);
 		return buf;
@@ -104,8 +109,7 @@ class Base {
 			//if( p.shader.hasGlobal(globalModelViewInverseId) )
 			globalModelViewInverse = p.obj.getInvPos();
 			ctx.engine.selectShader(p.shader);
-			// TODO : reuse buffers between calls
-			var buf = allocBuffer(p.shader, p.shaders);
+			var buf = initBuffer(p.shader, p.shaders);
 			ctx.engine.selectMaterial(p.pass);
 			ctx.engine.uploadShaderBuffers(buf, Globals);
 			ctx.engine.uploadShaderBuffers(buf, Params);

+ 14 - 0
h3d/shader/Buffers.hx

@@ -18,6 +18,15 @@ class ShaderBuffers {
 		tex = new haxe.ds.Vector(s.textures.length);
 	}
 
+	public function grow( s : hxsl.RuntimeShader.RuntimeShaderData ) {
+		var ng = s.globalsSize << 2;
+		var np = s.paramsSize << 2;
+		var nt = s.textures.length;
+		if( globals.length < ng ) globals = new haxe.ds.Vector(ng);
+		if( params.length < np ) params = new haxe.ds.Vector(np);
+		if( tex.length < nt ) tex = new haxe.ds.Vector(nt);
+	}
+
 }
 
 class Buffers {
@@ -29,5 +38,10 @@ class Buffers {
 		vertex = new ShaderBuffers(s.vertex);
 		fragment = new ShaderBuffers(s.fragment);
 	}
+
+	public inline function grow( s : hxsl.RuntimeShader ) {
+		vertex.grow(s.vertex);
+		fragment.grow(s.fragment);
+	}
 }