Quellcode durchsuchen

fixed realloc() changing shader

Nicolas Cannasse vor 4 Jahren
Ursprung
Commit
d9cbdd9c3e
2 geänderte Dateien mit 34 neuen und 9 gelöschten Zeilen
  1. 18 4
      h3d/impl/DirectXDriver.hx
  2. 16 5
      h3d/impl/GlDriver.hx

+ 18 - 4
h3d/impl/DirectXDriver.hx

@@ -971,11 +971,15 @@ class DirectXDriver extends h3d.impl.Driver {
 		}
 		if( s == currentShader )
 			return false;
+		setShader(s);
+		return true;
+	}
+
+	function setShader( s : CompiledShader ) {
 		currentShader = s;
 		dx.Driver.vsSetShader(s.vertex.shader);
 		dx.Driver.psSetShader(s.fragment.shader);
 		dx.Driver.iaSetInputLayout(s.layout);
-		return true;
 	}
 
 	override function getShaderInputNames() : InputNames {
@@ -1021,8 +1025,8 @@ class DirectXDriver extends h3d.impl.Driver {
 
 	override function uploadShaderBuffers(buffers:h3d.shader.Buffers, which:h3d.shader.Buffers.BufferKind) {
 		if( hasDeviceError ) return;
-		uploadBuffers(vertexShader, currentShader.vertex, buffers.vertex, which);
-		uploadBuffers(pixelShader, currentShader.fragment, buffers.fragment, which);
+		uploadBuffers(buffers, vertexShader, currentShader.vertex, buffers.vertex, which);
+		uploadBuffers(buffers, pixelShader, currentShader.fragment, buffers.fragment, which);
 	}
 
 	function uploadShaderBuffer( sbuffer : dx.Resource, buffer : haxe.ds.Vector<hxd.impl.Float32>, size : Int, prevContent : hl.Bytes ) {
@@ -1041,7 +1045,7 @@ class DirectXDriver extends h3d.impl.Driver {
 		sbuffer.unmap(0);
 	}
 
-	function uploadBuffers( state : PipelineState, shader : ShaderContext, buffers : h3d.shader.Buffers.ShaderBuffers, which : h3d.shader.Buffers.BufferKind ) {
+	function uploadBuffers( buf : h3d.shader.Buffers, state : PipelineState, shader : ShaderContext, buffers : h3d.shader.Buffers.ShaderBuffers, which : h3d.shader.Buffers.BufferKind ) {
 		switch( which ) {
 		case Globals:
 			if( shader.globalsSize > 0 ) {
@@ -1102,9 +1106,19 @@ class DirectXDriver extends h3d.impl.Driver {
 					}
 				}
 				if( t != null && t.t == null && t.realloc != null ) {
+					var s = currentShader;
 					t.alloc();
 					t.realloc();
 					if( hasDeviceError ) return;
+					if( s != currentShader ) {
+						// realloc triggered a shader change !
+						// we need to reset the original shader and reupload everything
+						setShader(s);
+						uploadShaderBuffers(buf,Globals);
+						uploadShaderBuffers(buf,Params);
+						uploadShaderBuffers(buf,Textures);
+						return;
+					}
 				}
 				t.lastFrame = frame;
 

+ 16 - 5
h3d/impl/GlDriver.hx

@@ -461,7 +461,11 @@ class GlDriver extends Driver {
 			programs.set(shader.id, p);
 		}
 		if( curShader == p ) return false;
+		setProgram(p);
+		return true;
+	}
 
+	function setProgram( p : CompiledProgram ) {
 		gl.useProgram(p.p);
 
 		for( a in p.attribs )
@@ -488,15 +492,14 @@ class GlDriver extends Driver {
 		curBuffer = null;
 		for( i in 0...boundTextures.length )
 			boundTextures[i] = null;
-		return true;
 	}
 
 	override function uploadShaderBuffers( buf : h3d.shader.Buffers, which : h3d.shader.Buffers.BufferKind ) {
-		uploadBuffer(curShader.vertex, buf.vertex, which);
-		uploadBuffer(curShader.fragment, buf.fragment, which);
+		uploadBuffer(buf, curShader.vertex, buf.vertex, which);
+		uploadBuffer(buf, curShader.fragment, buf.fragment, which);
 	}
 
-	function uploadBuffer( s : CompiledShader, buf : h3d.shader.Buffers.ShaderBuffers, which : h3d.shader.Buffers.BufferKind ) {
+	function uploadBuffer( buffer : h3d.shader.Buffers, s : CompiledShader, buf : h3d.shader.Buffers.ShaderBuffers, which : h3d.shader.Buffers.BufferKind ) {
 		switch( which ) {
 		case Globals:
 			if( s.globals != null ) {
@@ -541,7 +544,15 @@ class GlDriver extends Driver {
 					var s = curShader;
 					t.alloc();
 					t.realloc();
-					if( curShader != s ) throw "Shader has changed after realloc "+t;
+					if( curShader != s ) {
+						// realloc triggered a shader change !
+						// we need to reset the original shader and reupload everything
+						setProgram(s);
+						uploadShaderBuffers(buffer,Globals);
+						uploadShaderBuffers(buffer,Params);
+						uploadShaderBuffers(buffer,Textures);
+						return;
+					}
 				}
 				t.lastFrame = frame;