Bläddra i källkod

limit to 16 samplers, added @sampler(name) for more than 16 textures in dx shader

Nicolas Cannasse 4 år sedan
förälder
incheckning
332db63680
2 ändrade filer med 37 tillägg och 7 borttagningar
  1. 2 1
      h3d/impl/DirectXDriver.hx
  2. 35 6
      hxsl/HlslOut.hx

+ 2 - 1
h3d/impl/DirectXDriver.hx

@@ -98,6 +98,7 @@ class DirectXDriver extends h3d.impl.Driver {
 	var currentColorMask = -1;
 	var targetsCount = 1;
 	var allowDraw = false;
+	var maxSamplers = 16;
 
 	var depthStates : Map<Int,{ def : DepthStencilState, stencils : Array<{ op : Int, mask : Int, state : DepthStencilState }> }>;
 	var blendStates : Map<Int,BlendState>;
@@ -1143,7 +1144,7 @@ class DirectXDriver extends h3d.impl.Driver {
 				var bits = @:privateAccess t.bits;
 				if( t.lodBias != 0 )
 					bits |= Std.int((t.lodBias + 32)*32) << 10;
-				if( bits != state.samplerBits[i] ) {
+				if( i < maxSamplers && bits != state.samplerBits[i] ) {
 					var ss = samplerStates.get(bits);
 					if( ss == null ) {
 						var desc = new SamplerDesc();

+ 35 - 6
hxsl/HlslOut.hx

@@ -54,7 +54,10 @@ class HlslOut {
 	var isVertex : Bool;
 	var allNames : Map<String, Int>;
 	var samplers : Map<Int, Int>;
+	var namedSamplers : Map<String, Int>;
+	var forcedSampler : String;
 	public var varNames : Map<Int,String>;
+	public var maxSamplers : Int = 16;
 
 	var varAccess : Map<Int,String>;
 
@@ -193,13 +196,25 @@ class HlslOut {
 			addValue(eif, tabs);
 			add(" : ");
 			addValue(eelse, tabs);
-		case TMeta(_, _, e):
-			addValue(e, tabs);
+		case TMeta(m,args,e):
+			handleMeta(m, args, addValue, e, tabs);
 		default:
 			addExpr(e, tabs);
 		}
 	}
 
+	function handleMeta( m, args : Array<Ast.Const>, callb, e, tabs ) {
+		switch( [m, args] ) {
+		case ["sampler", [CString(name)]]:
+			var prev = forcedSampler;
+			forcedSampler = name;
+			callb(e,tabs);
+			forcedSampler = null;
+		default:
+			callb(e,tabs);
+		}
+	}
+
 	function addBlock( e : TExpr, tabs ) {
 		if( e.e.match(TBlock(_)) )
 			addExpr(e,tabs);
@@ -251,13 +266,24 @@ class HlslOut {
 			var offset = 0;
 			var expr = switch( args[0].e ) {
 			case TArray(e,{ e : TConst(CInt(i)) }): offset = i; e;
+			case TArray(e,{ e : TBinop(OpAdd,{e:TVar(_)},{e:TConst(CInt(_))}) }): throw "Offset in texture access: need loop unroll?";
 			default: args[0];
 			}
 			switch( expr.e ) {
 			case TVar(v):
 				var samplerIndex = samplers.get(v.id);
 				if( samplerIndex == null ) throw "assert";
-				add('__Samplers[${samplerIndex+offset}]');
+				samplerIndex += offset;
+				if( forcedSampler != null ) {
+					var useIndex = namedSamplers.get("$"+forcedSampler);
+					if( useIndex != null )
+						samplerIndex = useIndex;
+					else {
+						useIndex = samplerIndex;
+						namedSamplers.set("$"+forcedSampler, useIndex);
+					}
+				}
+				add('__Samplers[$samplerIndex]');
 			default: throw "assert";
 			}
 			for( i in 1...args.length ) {
@@ -546,8 +572,8 @@ class HlslOut {
 			add("[");
 			addValue(index, tabs);
 			add("]");
-		case TMeta(_, _, e):
-			addExpr(e, tabs);
+		case TMeta(m, args, e):
+			handleMeta(m, args, addExpr, e, tabs);
 		}
 	}
 
@@ -693,8 +719,10 @@ class HlslOut {
 				samplerCount++;
 			}
 		}
-		if( samplerCount > 0 )
+		if( samplerCount > 0 ) {
+			if( samplerCount > maxSamplers ) samplerCount = maxSamplers;
 			add('SamplerState __Samplers[$samplerCount];\n');
+		}
 	}
 
 	function initStatics( s : ShaderData ) {
@@ -756,6 +784,7 @@ class HlslOut {
 
 		varAccess = new Map();
 		samplers = new Map();
+		namedSamplers = new Map();
 		initVars(s);
 		initGlobals(s);
 		initParams(s);