public ShaderProgram Translate(
            out ShaderProgramInfo shaderProgramInfo,
            TranslatorContext nextStage = null,
            TranslatorContext other     = null)
        {
            if (nextStage != null)
            {
                _config.MergeOutputUserAttributes(nextStage._config.UsedInputAttributes);
            }

            FunctionCode[] code = EmitShader(_cfg, _config, initializeOutputs: other == null, out _);

            if (other != null)
            {
                other._config.MergeOutputUserAttributes(_config.UsedOutputAttributes);

                FunctionCode[] otherCode = EmitShader(other._cfg, other._config, initializeOutputs: true, out int aStart);

                code = Combine(otherCode, code, aStart);

                _config.InheritFrom(other._config);
            }

            return(Translator.Translate(code, _config, out shaderProgramInfo));
        }