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);
        }
Example #2
0
        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);
        }