浏览代码

group sampler states together (prevent order bug when mixing texture types)

ncannasse 6 年之前
父节点
当前提交
3e35b18e94
共有 1 个文件被更改,包括 30 次插入29 次删除
  1. 30 29
      hxsl/HlslOut.hx

+ 30 - 29
hxsl/HlslOut.hx

@@ -44,6 +44,7 @@ class HlslOut {
 	var decls : Array<String>;
 	var isVertex : Bool;
 	var allNames : Map<String, Int>;
+	var samplers : Map<Int, Int>;
 	public var varNames : Map<Int,String>;
 
 	var varAccess : Map<Int,String>;
@@ -97,8 +98,12 @@ class HlslOut {
 			add("float4x4");
 		case TMat3x4:
 			add("float4x3");
-		case TSampler2D, TSamplerCube, TSampler2DArray:
-			add("SamplerState");
+		case TSampler2D:
+			add("Texture2D");
+		case TSamplerCube:
+			add("TextureCube");
+		case TSampler2DArray:
+			add("Texture2DArray");
 		case TStruct(vl):
 			add("struct { ");
 			for( v in vl ) {
@@ -144,8 +149,6 @@ class HlslOut {
 			addType(v.type);
 			add(" ");
 			ident(v);
-			if( v.type.isSampler() )
-				add("SS");
 		}
 	}
 
@@ -234,15 +237,17 @@ class HlslOut {
 			default:
 				throw "assert";
 			}
-			switch( args[0].e ) {
-			case TArray(e,index):
-				addValue(e, tabs);
-				add("SS[");
-				addValue(index, tabs);
-				add("]");
-			default:
-				addValue(args[0], tabs);
-				add("SS");
+			var offset = 0;
+			var expr = switch( args[0].e ) {
+			case TArray(e,{ e : TConst(CInt(i)) }): offset = i; e;
+			default: args[0];
+			}
+			switch( expr.e ) {
+			case TVar(v):
+				var samplerIndex = samplers.get(v.id);
+				if( samplerIndex == null ) throw "assert";
+				add('__Samplers[${samplerIndex+offset}]');
+			default: throw "assert";
 			}
 			for( i in 1...args.length ) {
 				add(",");
@@ -578,11 +583,11 @@ class HlslOut {
 				switch( v.type ) {
 				case TArray(t, _) if( t.isSampler() ):
 					textures.push(v);
-					continue;
 				case TBuffer(_):
 					buffers.push(v);
 					continue;
 				default:
+					if( v.type.isSampler() ) textures.push(v);
 				}
 				add("\t");
 				addVar(v);
@@ -599,27 +604,22 @@ class HlslOut {
 		}
 		if( bufCount > 0 ) add("\n");
 
+
+		var samplerCount = 0;
 		for( v in textures ) {
+			samplers.set(v.id, samplerCount);
 			switch( v.type ) {
 			case TArray(t, size):
-				switch( t ) {
-				case TSampler2D:
-					add("Texture2D ");
-				case TSamplerCube:
-					add("TextureCube ");
-				case TSampler2DArray:
-					add("Texture2DArray ");
-				default:
-					throw "Unsupported sampler " + t;
-				}
-				add(v.name);
-				addArraySize(size);
-				add(";\n");
-				addVar(v);
-				add(";\n");
+				samplerCount += switch( size ) {
+				case SConst(i): i;
+				default: throw "assert";
+				};
 			default:
+				samplerCount++;
 			}
 		}
+		if( samplerCount > 0 )
+			add('SamplerState __Samplers[$samplerCount];\n');
 	}
 
 	function initStatics( s : ShaderData ) {
@@ -680,6 +680,7 @@ class HlslOut {
 		isVertex = f.kind == Vertex;
 
 		varAccess = new Map();
+		samplers = new Map();
 		initVars(s);
 		initGlobals(s);
 		initParams(s);