浏览代码

fixed layout/semantics

Nicolas Cannasse 8 年之前
父节点
当前提交
4a24c1b24c
共有 2 个文件被更改,包括 34 次插入17 次删除
  1. 22 6
      h3d/impl/DirectXDriver.hx
  2. 12 11
      hxsl/HlslOut.hx

+ 22 - 6
h3d/impl/DirectXDriver.hx

@@ -132,12 +132,28 @@ class DirectXDriver extends h3d.impl.Driver {
 			var vertex = compileShader(shader.vertex);
 			s.vertex = vertex.s;
 			s.fragment = compileShader(shader.fragment).s;
-			var n = new hl.NativeArray(1);
-			var e = new LayoutElement();
-			e.semanticName = @:privateAccess "SV_POSITION".toUtf8();
-			e.format = R32G32B32_FLOAT;
-			e.inputSlotClass = PerVertexData;
-			n[0] = e;
+
+			var layout = [];
+			for( v in shader.vertex.data.vars )
+				if( v.kind == Input ) {
+					var e = new LayoutElement();
+					e.semanticName = @:privateAccess v.name.toUtf8();
+					e.format = switch( v.type ) {
+					case TFloat: R32_FLOAT;
+					case TVec(2, VFloat): R32G32_FLOAT;
+					case TVec(3, VFloat): R32G32B32_FLOAT;
+					case TVec(4, VFloat): R32G32B32A32_FLOAT;
+					default:
+						throw "Unsupported input type " + hxsl.Ast.Tools.toString(v.type);
+					};
+					e.inputSlotClass = PerVertexData;
+					e.alignedByteOffset = -1; // automatic layout
+					layout.push(e);
+				}
+
+			var n = new hl.NativeArray(layout.length);
+			for( i in 0...layout.length )
+				n[i] = layout[i];
 			s.layout = Driver.createInputLayout(n, vertex.bytes, vertex.bytes.length);
 			if( s.layout == null )
 				throw "Failed to create input layout";

+ 12 - 11
hxsl/HlslOut.hx

@@ -201,6 +201,8 @@ class HlslOut {
 				decl("float4x3 mat3x4( float4 a, float4 b, float4 c ) { float4x3 m; m._m00_m10_m20_m30 = a; m._m01_m11_m21_m31 = b; m._m02_m12_m22_m32 = c; return m; }");
 			case Mat4:
 				decl("float4x4 mat4( float4 a, float4 b, float4 c, float4 d ) { float4x4 m; m._m00_m10_m20_m30 = a; m._m01_m11_m21_m31 = b; m._m02_m12_m22_m32 = c; m._m03_m13_m23_m33 = d; return m; }");
+			case Mat3:
+				decl("float3x3 mat3( float4x4 m ) { return (float3x3)m; }");
 			default:
 			}
 			add(GLOBALS.get(g));
@@ -409,13 +411,6 @@ class HlslOut {
 		}
 	}
 
-	function addSemantic( v : TVar ) {
-		switch( v.type ) {
-		default:
-			add(isVertex ? "SV_POSITION" : "SV_TARGET");
-		}
-	}
-
 	public function run( s : ShaderData ) {
 		locals = new Map();
 		decls = [];
@@ -429,12 +424,14 @@ class HlslOut {
 		varAccess = new Map();
 
 		add("struct s_input {\n");
+		if( !isVertex )
+			add("\tfloat4 __pos__ : SV_POSITION;\n");
+		var index = 0;
 		for( v in s.vars ) {
 			if( v.kind == Input || (v.kind == Var && !isVertex) ) {
 				add("\t");
 				addVar(v);
-				add(" : ");
-				addSemantic(v);
+				add(" : " + v.name);
 				add(";\n");
 				varAccess.set(v.id, "_in.");
 			}
@@ -442,12 +439,15 @@ class HlslOut {
 		add("};\n\n");
 
 		add("struct s_output {\n");
+		var index = 0;
 		for( v in s.vars ) {
 			if( v.kind == Output || (v.kind == Var && isVertex) ) {
 				add("\t");
 				addVar(v);
-				add(" : ");
-				addSemantic(v);
+				if( v.kind == Output )
+					add(" : " + (isVertex ? "SV_POSITION" : "SV_TARGET" + (index++)));
+				else
+					add(" : " + v.name);
 				add(";\n");
 				varAccess.set(v.id, "_out.");
 			}
@@ -505,6 +505,7 @@ class HlslOut {
 		buf = tmp;
 
 		for( v in locals ) {
+			add("static ");
 			addVar(v);
 			add(";\n");
 		}