3 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
4 using System.Collections.Generic;
5 using SharpDX.Direct3D11;
6 using SiliconStudio.Core;
7 using SiliconStudio.Paradox.Shaders;
9 namespace SiliconStudio.
Paradox.Graphics
11 internal partial class EffectProgram
13 private readonly EffectBytecode effectBytecode;
14 private VertexShader vertexShader;
15 private GeometryShader geometryShader;
16 private PixelShader pixelShader;
17 private HullShader hullShader;
18 private DomainShader domainShader;
19 private ComputeShader computeShader;
20 private EffectInputSignature inputSignature;
22 private EffectProgram(GraphicsDevice device, EffectBytecode bytecode)
25 effectBytecode = bytecode;
29 public EffectInputSignature InputSignature
33 return inputSignature;
37 private void CreateShaders()
39 foreach (var shaderBytecode
in effectBytecode.Stages)
41 var bytecodeRaw = shaderBytecode.Data;
42 var reflection = effectBytecode.Reflection;
45 switch (shaderBytecode.Stage)
47 case ShaderStage.Vertex:
48 vertexShader =
new VertexShader(GraphicsDevice.NativeDevice, bytecodeRaw);
51 if (inputSignature == null)
52 inputSignature = EffectInputSignature.GetOrCreateLayout(
new EffectInputSignature(shaderBytecode.Id, bytecodeRaw));
54 case ShaderStage.Domain:
55 domainShader =
new DomainShader(GraphicsDevice.NativeDevice, bytecodeRaw);
57 case ShaderStage.Hull:
58 hullShader =
new HullShader(GraphicsDevice.NativeDevice, bytecodeRaw);
60 case ShaderStage.Geometry:
61 if (reflection.ShaderStreamOutputDeclarations != null && reflection.ShaderStreamOutputDeclarations.Count > 0)
64 var soStrides =
new List<int>();
65 foreach (var streamOutputElement
in reflection.ShaderStreamOutputDeclarations)
67 for (
int i = soStrides.Count; i < (streamOutputElement.Stream + 1); i++)
72 soStrides[streamOutputElement.Stream] += streamOutputElement.ComponentCount *
sizeof(float);
74 var soElements =
new StreamOutputElement[0];
75 geometryShader =
new GeometryShader(GraphicsDevice.NativeDevice, bytecodeRaw, soElements, soStrides.ToArray(), reflection.StreamOutputRasterizedStream);
79 geometryShader =
new GeometryShader(GraphicsDevice.NativeDevice, bytecodeRaw);
82 case ShaderStage.Pixel:
83 pixelShader =
new PixelShader(GraphicsDevice.NativeDevice, bytecodeRaw);
85 case ShaderStage.Compute:
86 computeShader =
new ComputeShader(GraphicsDevice.NativeDevice, bytecodeRaw);
92 protected override void DestroyImpl()
94 Utilities.Dispose(ref pixelShader);
95 Utilities.Dispose(ref vertexShader);
96 Utilities.Dispose(ref geometryShader);
97 Utilities.Dispose(ref hullShader);
98 Utilities.Dispose(ref domainShader);
99 Utilities.Dispose(ref computeShader);
103 protected internal override void OnDestroyed()
110 protected internal override bool OnRecreate()
117 internal void Apply(GraphicsDevice device)
120 var nativeDeviceContext = device.NativeDeviceContext;
121 if (computeShader != null)
123 nativeDeviceContext.ComputeShader.Set(computeShader);
127 nativeDeviceContext.VertexShader.Set(vertexShader);
128 nativeDeviceContext.PixelShader.Set(pixelShader);
129 nativeDeviceContext.HullShader.Set(hullShader);
130 nativeDeviceContext.DomainShader.Set(domainShader);
131 nativeDeviceContext.GeometryShader.Set(geometryShader);