Cromon

ShaderCompiler.cs

Oct 12th, 2012
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.92 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SlimDX.Direct3D9;
  7.  
  8. namespace Gype.UI.D3D9
  9. {
  10.     internal class ShaderCompiler<T>
  11.     {
  12.         public ShaderCompiler(Device dev, string code, string entryPoint, string profile)
  13.         {
  14.             mDevice = dev;
  15.             Code = ShaderBytecode.Compile(code, entryPoint, profile, ShaderFlags.OptimizationLevel3);
  16.             Shader = (T)Activator.CreateInstance(typeof(T), dev, Code);
  17.             ConstantTable = new Dictionary<string, ConstantDescription>();
  18.  
  19.             reflectShader();
  20.         }
  21.  
  22.         public ShaderCompiler(Device dev, byte[] code, string entryPoint, string profile)
  23.             : this(dev, Encoding.ASCII.GetString(code), entryPoint, profile)
  24.         {
  25.         }
  26.  
  27.         public void SetValue(ConstantDescription desc, int value)
  28.         {
  29.             if (Shader is VertexShader)
  30.             {
  31.                 VertexShader oldShader = null;
  32.                 if (mDevice.VertexShader != (VertexShader)(object)Shader)
  33.                 {
  34.                     oldShader = mDevice.VertexShader;
  35.                     mDevice.VertexShader = (VertexShader)(object)Shader;
  36.                 }
  37.  
  38.                 mDevice.SetVertexShaderConstant(desc.RegisterIndex, new int[] { value });
  39.  
  40.                 if (oldShader != null)
  41.                     mDevice.VertexShader = oldShader;
  42.             }
  43.             else if (Shader is PixelShader)
  44.             {
  45.                 mDevice.SetPixelShaderConstant(desc.RegisterIndex, new int[] { value });
  46.             }
  47.         }
  48.  
  49.         public void SetValue(ConstantDescription desc, SlimDX.Matrix value)
  50.         {
  51.             if (Shader is VertexShader)
  52.             {
  53.                 VertexShader oldShader = null;
  54.                 if (mDevice.VertexShader != (VertexShader)(object)Shader)
  55.                 {
  56.                     oldShader = mDevice.VertexShader;
  57.                     mDevice.VertexShader = (VertexShader)(object)Shader;
  58.                 }
  59.  
  60.                 mDevice.SetVertexShaderConstant(desc.RegisterIndex, value);
  61.  
  62.                 if (oldShader != null)
  63.                     mDevice.VertexShader = oldShader;
  64.             }
  65.             else if (Shader is PixelShader)
  66.             {
  67.                 PixelShader oldShader = null;
  68.                 if (mDevice.PixelShader != (PixelShader)(object)Shader)
  69.                 {
  70.                     oldShader = mDevice.PixelShader;
  71.                     mDevice.PixelShader = (PixelShader)(object)Shader;
  72.                 }
  73.  
  74.                 mDevice.SetPixelShaderConstant(desc.RegisterIndex, value);
  75.  
  76.                 if (oldShader != null)
  77.                     mDevice.PixelShader = oldShader;
  78.             }
  79.         }
  80.  
  81.         public void SetValue(ConstantDescription desc, float value)
  82.         {
  83.             if (Shader is VertexShader)
  84.             {
  85.                 VertexShader oldShader = null;
  86.                 if (mDevice.VertexShader != (VertexShader)(object)Shader)
  87.                 {
  88.                     oldShader = mDevice.VertexShader;
  89.                     mDevice.VertexShader = (VertexShader)(object)Shader;
  90.                 }
  91.  
  92.                 mDevice.SetVertexShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value, 0, 0, 0) });
  93.  
  94.                 if (oldShader != null)
  95.                     mDevice.VertexShader = oldShader;
  96.             }
  97.             else if (Shader is PixelShader)
  98.             {
  99.                 PixelShader oldShader = null;
  100.                 if (mDevice.PixelShader != (PixelShader)(object)Shader)
  101.                 {
  102.                     oldShader = mDevice.PixelShader;
  103.                     mDevice.PixelShader = (PixelShader)(object)Shader;
  104.                 }
  105.  
  106.                 mDevice.SetPixelShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value, 0, 0, 0) });
  107.  
  108.                 if (oldShader != null)
  109.                     mDevice.PixelShader = oldShader;
  110.             }
  111.         }
  112.  
  113.         public void SetValue(ConstantDescription desc, SlimDX.Vector2 value)
  114.         {
  115.             if (Shader is VertexShader)
  116.             {
  117.                 VertexShader oldShader = null;
  118.                 if (mDevice.VertexShader != (VertexShader)(object)Shader)
  119.                 {
  120.                     oldShader = mDevice.VertexShader;
  121.                     mDevice.VertexShader = (VertexShader)(object)Shader;
  122.                 }
  123.  
  124.                 mDevice.SetVertexShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value.X, value.Y, 0, 0) });
  125.  
  126.                 if (oldShader != null)
  127.                     mDevice.VertexShader = oldShader;
  128.             }
  129.             else if (Shader is PixelShader)
  130.             {
  131.                 PixelShader oldShader = null;
  132.                 if (mDevice.PixelShader != (PixelShader)(object)Shader)
  133.                 {
  134.                     oldShader = mDevice.PixelShader;
  135.                     mDevice.PixelShader = (PixelShader)(object)Shader;
  136.                 }
  137.  
  138.                 mDevice.SetPixelShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value.X, value.Y, 0, 0) });
  139.  
  140.                 if (oldShader != null)
  141.                     mDevice.PixelShader = oldShader;
  142.             }
  143.         }
  144.  
  145.         public void SetValue(ConstantDescription desc, SlimDX.Vector3 value)
  146.         {
  147.             if (Shader is VertexShader)
  148.             {
  149.                 mDevice.VertexShader = (VertexShader)(object)Shader;
  150.                 mDevice.SetVertexShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value.X, value.Y, value.Z, 0) });
  151.                 mDevice.VertexShader = null;
  152.             }
  153.             else if (Shader is PixelShader)
  154.             {
  155.                 PixelShader oldShader = null;
  156.                 if (mDevice.PixelShader != (PixelShader)(object)Shader)
  157.                 {
  158.                     oldShader = mDevice.PixelShader;
  159.                     mDevice.PixelShader = (PixelShader)(object)Shader;
  160.                 }
  161.  
  162.                 mDevice.SetPixelShaderConstant(desc.RegisterIndex, new SlimDX.Vector4[] { new SlimDX.Vector4(value.X, value.Y, value.Z, 0) });
  163.  
  164.                 if (oldShader != null)
  165.                     mDevice.PixelShader = oldShader;
  166.             }
  167.         }
  168.  
  169.         private void reflectShader()
  170.         {
  171.             var numConstants = Code.ConstantTable.Description.Constants;
  172.             for (int i = 0; i < numConstants; ++i)
  173.             {
  174.                 var handle = Code.ConstantTable.GetConstant(null, i);
  175.                 var desc = Code.ConstantTable.GetConstantDescription(handle);
  176.                 ConstantTable.Add(desc.Name, desc);
  177.             }
  178.         }
  179.  
  180.         public ShaderBytecode Code { get; private set; }
  181.         public T Shader { get; private set; }
  182.         public Dictionary<string, ConstantDescription> ConstantTable { get; private set; }
  183.  
  184.         private Device mDevice;
  185.     }
  186. }
Advertisement
Add Comment
Please, Sign In to add comment