/System.Compilers.Shaders.HLSL/HLSLBasic.cs

http://rendering.codeplex.com · C# · 266 lines · 228 code · 38 blank · 0 comment · 3 complexity · 209ff46a22712bb436a52115a8c53eae MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Rendering;
  6. using System.Maths;
  7. namespace System.Compilers.Shaders.HLSL
  8. {
  9. public class HLSLBasic : Builtins
  10. {
  11. public static Builtins HLSL { get; private set; }
  12. static HLSLBasic()
  13. {
  14. HLSL = new HLSLBasic();
  15. }
  16. protected HLSLBasic()
  17. {
  18. Register(typeof(int), "int", null);
  19. Register(typeof(bool), "bool", null);
  20. Register(typeof(float), "float", null);
  21. Register(typeof(byte), "byte", null);
  22. Register(typeof(void), "void", null);
  23. RegisterMembers(typeof(int), null);
  24. RegisterMembers(typeof(bool), null);
  25. RegisterMembers(typeof(float), null);
  26. RegisterMembers(typeof(byte), null);
  27. this.FullRegisterScalarMembers<int>();
  28. this.FullRegisterScalarMembers<bool>();
  29. this.FullRegisterScalarMembers<float>();
  30. this.FullRegisterScalarMembers<byte>();
  31. Dictionary<Type, string> scalars = new Dictionary<Type, string>();
  32. scalars[typeof(int)] = "int";
  33. scalars[typeof(byte)] = "byte";
  34. scalars[typeof(float)] = "float";
  35. scalars[typeof(bool)] = "bool";
  36. Func<MemberRegistration, bool> vecAndMatrixMemberRegistrating = m =>
  37. {
  38. if (m.IsConstructor) return true;
  39. if (m.IsField)
  40. {
  41. m.Name = m.Name.ToLowerInvariant();
  42. return true;
  43. }
  44. if (m.IsOperator)
  45. return true;
  46. return false;
  47. };
  48. Register(typeof(Sampler1D), "sampler", null);
  49. Register(typeof(Sampler2D), "sampler", null);
  50. Register(typeof(Sampler3D), "sampler", null);
  51. Register(typeof(SamplerCube), "sampler", null);
  52. foreach (var t in scalars.Keys)
  53. {
  54. Register(typeof(Vector1<>).MakeGenericType(t), scalars[t] + "1", null);
  55. Register(typeof(Vector2<>).MakeGenericType(t), scalars[t] + "2", null);
  56. Register(typeof(Vector3<>).MakeGenericType(t), scalars[t] + "3", null);
  57. Register(typeof(Vector4<>).MakeGenericType(t), scalars[t] + "4", null);
  58. Register(typeof(Matrix1x1<>).MakeGenericType(t), scalars[t] + "1x1", null);
  59. Register(typeof(Matrix1x2<>).MakeGenericType(t), scalars[t] + "1x2", null);
  60. Register(typeof(Matrix1x3<>).MakeGenericType(t), scalars[t] + "1x3", null);
  61. Register(typeof(Matrix1x4<>).MakeGenericType(t), scalars[t] + "1x4", null);
  62. Register(typeof(Matrix2x1<>).MakeGenericType(t), scalars[t] + "2x1", null);
  63. Register(typeof(Matrix2x2<>).MakeGenericType(t), scalars[t] + "2x2", null);
  64. Register(typeof(Matrix2x3<>).MakeGenericType(t), scalars[t] + "2x3", null);
  65. Register(typeof(Matrix2x4<>).MakeGenericType(t), scalars[t] + "2x4", null);
  66. Register(typeof(Matrix3x1<>).MakeGenericType(t), scalars[t] + "3x1", null);
  67. Register(typeof(Matrix3x2<>).MakeGenericType(t), scalars[t] + "3x2", null);
  68. Register(typeof(Matrix3x3<>).MakeGenericType(t), scalars[t] + "3x3", null);
  69. Register(typeof(Matrix3x4<>).MakeGenericType(t), scalars[t] + "3x4", null);
  70. Register(typeof(Matrix4x1<>).MakeGenericType(t), scalars[t] + "4x1", null);
  71. Register(typeof(Matrix4x2<>).MakeGenericType(t), scalars[t] + "4x2", null);
  72. Register(typeof(Matrix4x3<>).MakeGenericType(t), scalars[t] + "4x3", null);
  73. Register(typeof(Matrix4x4<>).MakeGenericType(t), scalars[t] + "4x4", null);
  74. }
  75. Register(typeof(Vector1), "float1", null);
  76. Register(typeof(Vector2), "float2", null);
  77. Register(typeof(Vector3), "float3", null);
  78. Register(typeof(Vector4), "float4", null);
  79. Register(typeof(Matrix1x1), "float1x1", null);
  80. Register(typeof(Matrix1x2), "float1x2", null);
  81. Register(typeof(Matrix1x3), "float1x3", null);
  82. Register(typeof(Matrix1x4), "float1x4", null);
  83. Register(typeof(Matrix2x1), "float2x1", null);
  84. Register(typeof(Matrix2x2), "float2x2", null);
  85. Register(typeof(Matrix2x3), "float2x3", null);
  86. Register(typeof(Matrix2x4), "float2x4", null);
  87. Register(typeof(Matrix3x1), "float3x1", null);
  88. Register(typeof(Matrix3x2), "float3x2", null);
  89. Register(typeof(Matrix3x3), "float3x3", null);
  90. Register(typeof(Matrix3x4), "float3x4", null);
  91. Register(typeof(Matrix4x1), "float4x1", null);
  92. Register(typeof(Matrix4x2), "float4x2", null);
  93. Register(typeof(Matrix4x3), "float4x3", null);
  94. Register(typeof(Matrix4x4), "float4x4", null);
  95. foreach (var t in scalars.Keys)
  96. {
  97. RegisterMembers(typeof(Vector1<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  98. RegisterMembers(typeof(Vector2<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  99. RegisterMembers(typeof(Vector3<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  100. RegisterMembers(typeof(Vector4<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  101. RegisterMembers(typeof(Matrix1x1<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  102. RegisterMembers(typeof(Matrix1x2<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  103. RegisterMembers(typeof(Matrix1x3<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  104. RegisterMembers(typeof(Matrix1x4<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  105. RegisterMembers(typeof(Matrix2x1<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  106. RegisterMembers(typeof(Matrix2x2<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  107. RegisterMembers(typeof(Matrix2x3<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  108. RegisterMembers(typeof(Matrix2x4<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  109. RegisterMembers(typeof(Matrix3x1<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  110. RegisterMembers(typeof(Matrix3x2<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  111. RegisterMembers(typeof(Matrix3x3<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  112. RegisterMembers(typeof(Matrix3x4<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  113. RegisterMembers(typeof(Matrix4x1<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  114. RegisterMembers(typeof(Matrix4x2<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  115. RegisterMembers(typeof(Matrix4x3<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  116. RegisterMembers(typeof(Matrix4x4<>).MakeGenericType(t), vecAndMatrixMemberRegistrating);
  117. }
  118. RegisterMembers(typeof(Vector1), vecAndMatrixMemberRegistrating);
  119. RegisterMembers(typeof(Vector2), vecAndMatrixMemberRegistrating);
  120. RegisterMembers(typeof(Vector3), vecAndMatrixMemberRegistrating);
  121. RegisterMembers(typeof(Vector4), vecAndMatrixMemberRegistrating);
  122. RegisterMembers(typeof(Matrix1x1), vecAndMatrixMemberRegistrating);
  123. RegisterMembers(typeof(Matrix2x1), vecAndMatrixMemberRegistrating);
  124. RegisterMembers(typeof(Matrix3x1), vecAndMatrixMemberRegistrating);
  125. RegisterMembers(typeof(Matrix4x1), vecAndMatrixMemberRegistrating);
  126. RegisterMembers(typeof(Matrix1x2), vecAndMatrixMemberRegistrating);
  127. RegisterMembers(typeof(Matrix2x2), vecAndMatrixMemberRegistrating);
  128. RegisterMembers(typeof(Matrix3x2), vecAndMatrixMemberRegistrating);
  129. RegisterMembers(typeof(Matrix4x2), vecAndMatrixMemberRegistrating);
  130. RegisterMembers(typeof(Matrix1x3), vecAndMatrixMemberRegistrating);
  131. RegisterMembers(typeof(Matrix2x3), vecAndMatrixMemberRegistrating);
  132. RegisterMembers(typeof(Matrix3x3), vecAndMatrixMemberRegistrating);
  133. RegisterMembers(typeof(Matrix4x3), vecAndMatrixMemberRegistrating);
  134. RegisterMembers(typeof(Matrix1x4), vecAndMatrixMemberRegistrating);
  135. RegisterMembers(typeof(Matrix2x4), vecAndMatrixMemberRegistrating);
  136. RegisterMembers(typeof(Matrix3x4), vecAndMatrixMemberRegistrating);
  137. RegisterMembers(typeof(Matrix4x4), vecAndMatrixMemberRegistrating);
  138. #region Register math functions
  139. Type mathType = typeof(GMath);
  140. this.RegisterAvailableOverloads(mathType, "abs", "abs");
  141. this.RegisterAvailableOverloads(mathType, "acos", "acos");
  142. this.RegisterAvailableOverloads(mathType, "all", "all");
  143. this.RegisterAvailableOverloads(mathType, "any", "any");
  144. this.RegisterAvailableOverloads(mathType, "asin", "asin");
  145. this.RegisterAvailableOverloads(mathType, "atan", "atan");
  146. this.RegisterAvailableOverloads(mathType, "atan2", "atan2");
  147. this.RegisterAvailableOverloads(mathType, "ceil", "ceil");
  148. this.RegisterAvailableOverloads(mathType, "clamp", "clamp");
  149. this.RegisterAvailableOverloads(mathType, "cos", "cos");
  150. this.RegisterAvailableOverloads(mathType, "cosh", "cosh");
  151. this.RegisterAvailableOverloads(mathType, "degrees", "degrees");
  152. this.RegisterAvailableOverloads(mathType, "determinant", "determinant");
  153. this.RegisterAvailableOverloads(mathType, "distance", "distance");
  154. this.RegisterAvailableOverloads(mathType, "dot", "dot");
  155. this.RegisterAvailableOverloads(mathType, "exp", "exp");
  156. this.RegisterAvailableOverloads(mathType, "exp2", "exp2");
  157. this.RegisterAvailableOverloads(mathType, "floor", "floor");
  158. this.RegisterAvailableOverloads(mathType, "fmod", "fmod");
  159. this.RegisterAvailableOverloads(mathType, "frac", "frac");
  160. this.RegisterAvailableOverloads(mathType, "isfinite", "isfinite");
  161. this.RegisterAvailableOverloads(mathType, "isinf", "isinf");
  162. this.RegisterAvailableOverloads(mathType, "isnan", "isnan");
  163. this.RegisterAvailableOverloads(mathType, "ldexp", "ldexp");
  164. this.RegisterAvailableOverloads(mathType, "length", "length");
  165. this.RegisterAvailableOverloads(mathType, "lerp", "lerp");
  166. this.RegisterAvailableOverloads(mathType, "lit", "lit");
  167. this.RegisterAvailableOverloads(mathType, "log", "log");
  168. this.RegisterAvailableOverloads(mathType, "log10", "log10");
  169. this.RegisterAvailableOverloads(mathType, "log2", "log2");
  170. this.RegisterAvailableOverloads(mathType, "max", "max");
  171. this.RegisterAvailableOverloads(mathType, "min", "min");
  172. this.RegisterAvailableOverloads(mathType, "mul", "mul");
  173. this.RegisterAvailableOverloads(mathType, "normalize", "normalize");
  174. this.RegisterAvailableOverloads(mathType, "pow", "pow");
  175. this.RegisterAvailableOverloads(mathType, "radians", "radians");
  176. this.RegisterAvailableOverloads(mathType, "reflect", "reflect");
  177. this.RegisterAvailableOverloads(mathType, "refract", "refract");
  178. this.RegisterAvailableOverloads(mathType, "round", "round");
  179. this.RegisterAvailableOverloads(mathType, "rsqrt", "rsqrt");
  180. this.RegisterAvailableOverloads(mathType, "saturate", "saturate");
  181. this.RegisterAvailableOverloads(mathType, "sign", "sign");
  182. this.RegisterAvailableOverloads(mathType, "sin", "sin");
  183. this.RegisterAvailableOverloads(mathType, "sinh", "sinh");
  184. this.RegisterAvailableOverloads(mathType, "smoothstep", "smoothstep");
  185. this.RegisterAvailableOverloads(mathType, "sqrt", "sqrt");
  186. this.RegisterAvailableOverloads(mathType, "step", "step");
  187. this.RegisterAvailableOverloads(mathType, "tanh", "tan");
  188. this.RegisterAvailableOverloads(mathType, "transpose", "transpose");
  189. #endregion
  190. #region Register sampler functions
  191. this.RegisterAvailableOverloads(typeof(Sampler1D), "Sample", "tex1D");
  192. this.RegisterAvailableOverloads(typeof(Sampler2D), "Sample", "tex2D");
  193. this.RegisterAvailableOverloads(typeof(Sampler2D), "SampleLOD", "tex2Dlod");
  194. this.RegisterAvailableOverloads(typeof(Sampler3D), "Sample", "tex3D");
  195. this.RegisterAvailableOverloads(typeof(SamplerCube), "Sample", "texCUBE");
  196. #endregion
  197. EndInitialization();
  198. }
  199. public override IEnumerable<string> Keywords
  200. {
  201. get
  202. {
  203. yield return "main";
  204. yield return "sampler";
  205. yield return "struct";
  206. yield return "for";
  207. yield return "if";
  208. yield return "while";
  209. yield return "return";
  210. yield return "else";
  211. yield return "in";
  212. yield return "out";
  213. yield return "inout";
  214. yield return "Sampler";
  215. yield return "Sampler";
  216. yield return "Sampler";
  217. yield return "sampler_state";
  218. yield return "Sampler";
  219. yield return "PixelShader";
  220. yield return "VertexShader";
  221. yield return "GeometryShader";
  222. yield return "HullShader";
  223. yield return "DomainShader";
  224. yield return "ComputeShader";
  225. }
  226. }
  227. }
  228. }