internal override ShaderData CreateShader(ShaderInfo shaderInfo, string shaderFunction, string shaderProfile, bool isVertexShader, EffectObject effect, ref string errorsAndWarnings) { // For now GLSL is only supported via translation // using MojoShader which works from HLSL bytecode. var bytecode = EffectObject.CompileHLSL(shaderInfo, shaderFunction, shaderProfile, ref errorsAndWarnings); // First look to see if we already created this same shader. foreach (var shader in effect.Shaders) { if (bytecode.SequenceEqual(shader.Bytecode)) { return(shader); } } var shaderData = ShaderData.CreateGLSL(bytecode, isVertexShader, effect.ConstantBuffers, effect.Shaders.Count, shaderInfo.SamplerStates, shaderInfo.Debug); effect.Shaders.Add(shaderData); return(shaderData); }
private d3dx_state CreateShader(ShaderInfo shaderInfo, string shaderFunction, string shaderProfile, bool isVertexShader) { // Compile the shader. byte[] bytecode; if (shaderInfo.Profile == ShaderProfile.DirectX_11 || shaderInfo.Profile == ShaderProfile.OpenGL) { // For now GLSL is only supported via translation // using MojoShader which works from HLSL bytecode. bytecode = CompileHLSL(shaderInfo, shaderFunction, shaderProfile); } else if (shaderInfo.Profile == ShaderProfile.PlayStation4) { bytecode = CompilePSSL(shaderInfo, shaderFunction, shaderProfile); } else { throw new NotSupportedException("Unknown shader profile!"); } // First look to see if we already created this same shader. ShaderData shaderData = null; foreach (var shader in Shaders) { if (bytecode.SequenceEqual(shader.Bytecode)) { shaderData = shader; break; } } // Create a new shader. if (shaderData == null) { if (shaderInfo.Profile == ShaderProfile.DirectX_11) { shaderData = ShaderData.CreateHLSL(bytecode, isVertexShader, ConstantBuffers, Shaders.Count, shaderInfo.SamplerStates, shaderInfo.Debug); } else if (shaderInfo.Profile == ShaderProfile.OpenGL) { shaderData = ShaderData.CreateGLSL(bytecode, isVertexShader, ConstantBuffers, Shaders.Count, shaderInfo.SamplerStates, shaderInfo.Debug); } else if (shaderInfo.Profile == ShaderProfile.PlayStation4) { shaderData = ShaderData.CreatePSSL(bytecode, isVertexShader, ConstantBuffers, Shaders.Count, shaderInfo.SamplerStates, shaderInfo.Debug); } else { throw new NotSupportedException("Unknown shader profile!"); } Shaders.Add(shaderData); } var state = new d3dx_state(); state.index = 0; state.type = STATE_TYPE.CONSTANT; state.operation = isVertexShader ? (uint)146 : (uint)147; state.parameter = new d3dx_parameter(); state.parameter.name = string.Empty; state.parameter.semantic = string.Empty; state.parameter.class_ = D3DXPARAMETER_CLASS.OBJECT; state.parameter.type = isVertexShader ? D3DXPARAMETER_TYPE.VERTEXSHADER : D3DXPARAMETER_TYPE.PIXELSHADER; state.parameter.rows = 0; state.parameter.columns = 0; state.parameter.data = shaderData.SharedIndex; return(state); }