00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef ARCHON_RENDER_CONTEXT_H
00021 #define ARCHON_RENDER_CONTEXT_H
00022
00023 #include <archon/display/context.H>
00024
00025 #include <archon/render/view.H>
00026
00027 namespace Archon
00028 {
00029 namespace Render
00030 {
00031 struct Conductor;
00032
00033
00038 struct Channel
00039 {
00040 private:
00041 friend struct Pipe;
00042
00043 Channel(Ref<View> view, Ref<Display::Window> window,
00044 Ref<Viewport> viewport, Ref<Screen> screen, Ref<Eye> eye,
00045 Ref<Clip> clip):
00046 view(view), window(window), viewport(viewport),
00047 screen(screen), eye(eye), clip(clip) {}
00048
00049 void render(const Ref<Pipe> &);
00050
00051 Ref<View> view;
00052 Ref<Display::Window> window;
00053 Ref<Viewport> viewport;
00054 Ref<Screen> screen;
00055 Ref<Eye> eye;
00056 Ref<Clip> clip;
00057 };
00058
00059
00070 struct Pipe: RefObjectBase
00071 {
00079 void addChannel(Ref<Conductor>, Ref<View>,
00080 Ref<Display::Window>,
00081 Ref<Viewport>, Ref<Screen>,
00082 Ref<Eye>, Ref<Clip>);
00083
00084 private:
00085 friend struct Conductor;
00086
00087 Pipe(Ref<Display::Visual> visual, bool direct, Ref<Pipe> master):
00088 context(master ? visual->newContext(direct, master->context) : visual->newContext(direct)), initialized(false) {}
00089
00090 void render();
00091
00092 Ref<Display::Context> context;
00093
00094 Mutex channelMutex;
00095 vector<Channel> channels;
00096
00097 friend struct Channel;
00098
00102 bool initialized;
00103 };
00104 }
00105 }
00106
00107 #endif // ARCHON_RENDER_CONTEXT_H