Browse Source

only upload the needed subpart of the buffers (allow buffer grow)

Nicolas Cannasse 11 years ago
parent
commit
6be53ec0a4
2 changed files with 10 additions and 8 deletions
  1. 6 4
      h3d/impl/GlDriver.hx
  2. 4 4
      h3d/impl/Stage3dDriver.hx

+ 6 - 4
h3d/impl/GlDriver.hx

@@ -23,9 +23,11 @@ private class CompiledShader {
 	public var globals : Uniform;
 	public var params : Uniform;
 	public var textures : Array<Uniform>;
-	public function new(s,vertex) {
+	public var shader : hxsl.RuntimeShader.RuntimeShaderData;
+	public function new(s,vertex,shader) {
 		this.s = s;
 		this.vertex = vertex;
+		this.shader = shader;
 	}
 }
 
@@ -105,7 +107,7 @@ class GlDriver extends Driver {
 			if( line == null ) line = "" else line = "(" + StringTools.trim(line) + ")";
 			throw "An error occurred compiling the shaders: " + log + line;
 		}
-		return new CompiledShader(s,shader.vertex);
+		return new CompiledShader(s, shader.vertex, shader);
 	}
 
 	function initShader( p : CompiledProgram, s : CompiledShader, shader : hxsl.RuntimeShader.RuntimeShaderData ) {
@@ -172,9 +174,9 @@ class GlDriver extends Driver {
 	function uploadBuffer( s : CompiledShader, buf : h3d.shader.Buffers.ShaderBuffers, which : h3d.shader.Buffers.BufferKind ) {
 		switch( which ) {
 		case Globals:
-			if( s.globals != null ) gl.uniform4fv(s.globals, new Float32Array(buf.globals.toData()));
+			if( s.globals != null ) gl.uniform4fv(s.globals, new Float32Array(buf.globals.toData()).subarray(0, s.shader.globalsSize * 4));
 		case Params:
-			if( s.params != null ) gl.uniform4fv(s.params, new Float32Array(buf.params.toData()));
+			if( s.params != null ) gl.uniform4fv(s.params, new Float32Array(buf.params.toData()).subarray(0, s.shader.paramsSize * 4));
 		case Textures:
 			for( i in 0...s.textures.length ) {
 				var t = buf.tex[i];

+ 4 - 4
h3d/impl/Stage3dDriver.hx

@@ -441,11 +441,11 @@ class Stage3dDriver extends Driver {
 				}
 			}
 		case Params:
-			if( curShader.s.vertex.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, curShader.s.vertex.globalsSize, buffers.vertex.params.toData());
-			if( curShader.s.fragment.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, curShader.s.fragment.globalsSize, buffers.fragment.params.toData());
+			if( curShader.s.vertex.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, curShader.s.vertex.globalsSize, buffers.vertex.params.toData(), curShader.s.vertex.paramsSize);
+			if( curShader.s.fragment.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, curShader.s.fragment.globalsSize, buffers.fragment.params.toData(), curShader.s.fragment.paramsSize);
 		case Globals:
-			if( curShader.s.vertex.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, 0, buffers.vertex.globals.toData());
-			if( curShader.s.fragment.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, 0, buffers.fragment.globals.toData());
+			if( curShader.s.vertex.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, 0, buffers.vertex.globals.toData(), curShader.s.vertex.globalsSize);
+			if( curShader.s.fragment.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, 0, buffers.fragment.globals.toData(), curShader.s.fragment.globalsSize);
 		}
 	}