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 update() = 0;
00064
00066 virtual void updateUniform(const ShVariableNodePtr& uniform) = 0;
00067
00068 virtual std::ostream& print(std::ostream& out) = 0;
00069
00071
00072
00073 virtual std::ostream& describe_interface(std::ostream& out) = 0;
00074 };
00075
00076 typedef ShPointer<ShBackendCode> ShBackendCodePtr;
00077 typedef ShPointer<const ShBackendCode> ShBackendCodeCPtr;
00078
00079 class ShTransformer;
00080 class
00081 SH_DLLEXPORT ShBackend : public ShRefCountable {
00082 public:
00083 virtual ~ShBackend();
00084 virtual std::string name() const = 0;
00085
00089 virtual ShBackendCodePtr generateCode(const std::string& target,
00090 const ShProgramNodeCPtr& shader) = 0;
00091
00092
00093 virtual void execute(const ShProgramNodeCPtr& program, ShStream& dest) = 0;
00094
00095 typedef std::vector< ShPointer<ShBackend> > ShBackendList;
00096
00097 static ShBackendList::iterator begin();
00098 static ShBackendList::iterator end();
00099
00100 static ShPointer<ShBackend> lookup(const std::string& name);
00101
00102 protected:
00103 ShBackend();
00104
00105 private:
00106 static void init();
00107
00108 static ShBackendList* m_backends;
00109 static bool m_doneInit;
00110 };
00111
00112 typedef ShPointer<ShBackend> ShBackendPtr;
00113 typedef ShPointer<const ShBackend> ShBackendCPtr;
00114
00115 }
00116
00117 #endif