ShProgramNode.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright 2003-2006 Serious Hack Inc.
00004 // 
00005 // This library is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU Lesser General Public
00007 // License as published by the Free Software Foundation; either
00008 // version 2.1 of the License, or (at your option) any later version.
00009 //
00010 // This library is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013 // Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public
00016 // License along with this library; if not, write to the Free Software
00017 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
00018 // MA  02110-1301, USA
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 

Generated on Thu Feb 16 14:51:37 2006 for Sh by  doxygen 1.4.6