00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef SHPROGRAMNODE_HPP
00021 #define SHPROGRAMNODE_HPP
00022
00023 #include <list>
00024 #include <map>
00025 #include <utility>
00026 #include <string>
00027 #include "ShDllExport.hpp"
00028 #include "ShRefCount.hpp"
00029 #include "ShTokenizer.hpp"
00030 #include "ShVariableNode.hpp"
00031 #include "ShCtrlGraph.hpp"
00032 #include "ShTextureNode.hpp"
00033 #include "ShChannelNode.hpp"
00034 #include "ShPaletteNode.hpp"
00035 #include "ShMeta.hpp"
00036
00037 namespace SH {
00038
00039 class ShBackendCode;
00040 class ShBackend;
00041
00044 class
00045 SH_DLLEXPORT ShProgramNode : public virtual ShRefCountable, public virtual ShMeta, public virtual ShInfoHolder {
00046 public:
00047 ShProgramNode(const std::string& target);
00048
00049 ~ShProgramNode();
00050
00055 void compile(const ShPointer<ShBackend>& backend);
00059 void compile(const std::string& target, const ShPointer<ShBackend>& backend);
00060
00064 bool is_compiled() const;
00067 bool is_compiled(const std::string& target) const;
00070 bool is_compiled(const std::string& target, const ShPointer<ShBackend>& backend) const;
00071
00073 std::string describe_interface() const;
00075 std::string describe_vars() const;
00077 std::string describe_decls() const;
00079 std::string describe_bindings();
00081 std::string describe_bindings(const std::string& target);
00082
00085 void dump(std::string filename) const;
00086
00089 ShPointer<ShBackendCode> code();
00093 ShPointer<ShBackendCode> code(const ShPointer<ShBackend>& backend);
00096 ShPointer<ShBackendCode> code(const std::string& target, const ShPointer<ShBackend>& backend);
00097
00099 void updateUniform(const ShVariableNodePtr& uniform);
00100
00103 ShTokenizer tokenizer;
00104
00108 ShPointer<ShCtrlGraph> ctrlGraph;
00109
00111 void collectDecls();
00112
00114 void collectVariables();
00115
00117 bool hasDecl(const ShVariableNodePtr& node) const;
00118
00128 void addDecl(const ShVariableNodePtr& node, const ShCtrlGraphNodePtr&);
00129 void addDecl(const ShVariableNodePtr& node);
00131
00132 typedef std::set<ShVariableNodePtr> VarSet;
00133 typedef std::list<ShVariableNodePtr> VarList;
00134 typedef std::list<ShTextureNodePtr> TexList;
00135 typedef std::list<ShChannelNodePtr> ChannelList;
00136 typedef std::list<ShPaletteNodePtr> PaletteList;
00137
00138 VarList::const_iterator begin_inputs() const { return inputs.begin(); }
00139 VarList::const_iterator end_inputs() const { return inputs.end(); }
00140 VarList::const_iterator begin_outputs() const { return outputs.begin(); }
00141 VarList::const_iterator end_outputs() const { return outputs.end(); }
00142 VarList::const_iterator begin_temps() const { return temps.begin(); }
00143 VarList::const_iterator end_temps() const { return temps.end(); }
00144 VarList::const_iterator begin_constants() const { return constants.begin(); }
00145 VarList::const_iterator end_constants() const { return constants.end(); }
00146 VarList::const_iterator begin_parameters() const { return uniforms.begin(); }
00147 VarList::const_iterator end_parameters() const { return uniforms.end(); }
00148 VarList::const_iterator begin_all_parameters() const { return all_uniforms.begin(); }
00149 VarList::const_iterator end_all_parameters() const { return all_uniforms.end(); }
00150 TexList::const_iterator begin_textures() const { return textures.begin(); }
00151 TexList::const_iterator end_textures() const { return textures.end(); }
00152 ChannelList::const_iterator begin_channels() const { return channels.begin(); }
00153 ChannelList::const_iterator end_channels() const { return channels.end(); }
00154 PaletteList::const_iterator begin_palettes() const { return palettes.begin(); }
00155 PaletteList::const_iterator end_palettes() const { return palettes.end(); }
00156
00157 VarList inputs;
00158 VarList outputs;
00159 VarList temps;
00160 VarSet tempDecls;
00161 VarList constants;
00162 VarList uniforms;
00163 VarList all_uniforms;
00164 TexList textures;
00165 ChannelList channels;
00166 PaletteList palettes;
00167
00171 std::string backend_name() const { return m_backend_name; }
00172
00174 std::string target() const { return m_target; }
00175
00177 std::string& target() { return m_target; }
00178
00180 ShPointer<ShProgramNode> clone() const;
00181
00183 static std::ostream& print(std::ostream& out, const VarList& list);
00184
00186 bool finished() const { return m_finished; }
00187
00189 void finish();
00190
00194 void assign(const ShVariableNodePtr& var) const { m_assigned_var = var; }
00195
00196 private:
00197 std::string m_backend_name;
00198 std::string m_target;
00199
00200 void collect_node_decls(const ShPointer<ShCtrlGraphNode>& node);
00201 void collect_node_vars(const ShPointer<ShCtrlGraphNode>& node);
00202 void collect_var(const ShVariableNodePtr& node);
00203 void collect_dependent_uniform(const ShVariableNodePtr& var);
00204
00205 typedef std::map< std::pair< std::string, ShPointer<ShBackend> >,
00206 ShPointer<ShBackendCode> > CodeMap;
00207 CodeMap m_code;
00208
00209 bool m_finished;
00210
00211
00212 mutable ShVariableNodePtr m_assigned_var;
00213 };
00214
00215 typedef ShPointer<ShProgramNode> ShProgramNodePtr;
00216 typedef ShPointer<const ShProgramNode> ShProgramNodeCPtr;
00217
00218 }
00219
00220 #endif
00221