00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027 #ifndef SHBACKEND_HPP
00028 #define SHBACKEND_HPP
00029
00030 #include <vector>
00031 #include <iosfwd>
00032 #include <string>
00033 #include "ShDllExport.hpp"
00034 #include "ShRefCount.hpp"
00035 #include "ShProgram.hpp"
00036 #include "ShVariableNode.hpp"
00037
00038 namespace SH {
00039
00040 class ShStream;
00041
00042 class
00043 SH_DLLEXPORT ShBackendCode : public ShRefCountable {
00044 public:
00045 virtual ~ShBackendCode();
00046
00049 virtual bool allocateRegister(const ShVariableNodePtr& var) = 0;
00050
00054 virtual void freeRegister(const ShVariableNodePtr& var) = 0;
00055
00057 virtual void upload() = 0;
00058
00060 virtual void bind() = 0;
00061
00063 virtual void updateUniform(const ShVariableNodePtr& uniform) = 0;
00064
00065 virtual std::ostream& print(std::ostream& out) = 0;
00066
00068
00069
00070 virtual std::ostream& printInputOutputFormat(std::ostream& out) = 0;
00071 };
00072
00073 typedef ShPointer<ShBackendCode> ShBackendCodePtr;
00074 typedef ShPointer<const ShBackendCode> ShBackendCodeCPtr;
00075
00076 class ShTransformer;
00077 class
00078 SH_DLLEXPORT ShBackend : public ShRefCountable {
00079 public:
00080 virtual ~ShBackend();
00081 virtual std::string name() const = 0;
00082
00086 virtual ShBackendCodePtr generateCode(const std::string& target,
00087 const ShProgramNodeCPtr& shader) = 0;
00088
00089
00090 virtual void execute(const ShProgramNodeCPtr& program, ShStream& dest) = 0;
00091
00092 typedef std::vector< ShPointer<ShBackend> > ShBackendList;
00093
00094 static ShBackendList::iterator begin();
00095 static ShBackendList::iterator end();
00096
00097 static ShPointer<ShBackend> lookup(const std::string& name);
00098
00099 protected:
00100 ShBackend();
00101
00102 private:
00103 static void init();
00104
00105 static ShBackendList* m_backends;
00106 static bool m_doneInit;
00107 };
00108
00109 typedef ShPointer<ShBackend> ShBackendPtr;
00110 typedef ShPointer<const ShBackend> ShBackendCPtr;
00111
00112 }
00113
00114 #endif