MinVR  0.9.0
A multi-platform virtual reality library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
RenderThread.H
Go to the documentation of this file.
1 //========================================================================
2 // MinVR
3 // Platform: Any
4 // API version: 1.0
5 //------------------------------------------------------------------------
6 // The MIT License (MIT)
7 //
8 // Copyright (c) 2013 Regents of the University of Minnesota
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy of
11 // this software and associated documentation files (the "Software"), to deal in
12 // the Software without restriction, including without limitation the rights to
13 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
14 // the Software, and to permit persons to whom the Software is furnished to do so,
15 // subject to the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be included in all
18 // copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
22 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
23 // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
24 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 //========================================================================
27 
28 #ifndef RENDERTHREAD_H
29 #define RENDERTHREAD_H
30 
31 #include "MVRCore/AbstractMVRApp.H"
32 #include "MVRCore/AbstractWindow.H"
33 #include "MVRCore/DataFileUtils.H"
34 #include <boost/thread.hpp>
35 #include <boost/shared_ptr.hpp>
36 #include <vector>
37 #include <boost/filesystem.hpp>
38 #include "MVRCore/StringUtils.H"
39 
40 #ifdef WIN32
41 #define NOMINMAX
42 #include <windows.h>
43 #endif
44 #include <GL/gl.h>
45 #include "GL/glext.h"
46 
47 namespace MinVR {
48 
49 // forward declaration
51 
52 typedef boost::shared_ptr<class RenderThread> RenderThreadRef;
53 
55 {
56 public:
61  };
62 
63  RenderThread(WindowRef window, AbstractMVREngine* engine, AbstractMVRAppRef app, boost::barrier* swapBarrier, boost::mutex* initializedMutex, boost::condition_variable* initializedCondition, boost::mutex* startRenderingMutex, boost::mutex* renderingCompleteMutex, boost::condition_variable* startRenderingCond, boost::condition_variable* renderingCompleteCond);
64  ~RenderThread();
65 
69  static int numRenderingThreads;
70  static int nextThreadId;
72 
73 private:
74  void render();
75  void initExtensions();
76  void initStereoCompositeShader();
77  void initStereoFramebufferAndTextures();
78  void setShaderVariables();
79 
80  WindowRef _window;
81  AbstractMVREngine* _engine;
82  AbstractMVRAppRef _app;
83  bool _rendering;
84  int _numRenderingThreads;
85  boost::shared_ptr<boost::thread> _thread;
86  boost::barrier* _swapBarrier;
87  boost::mutex* _initMutex;
88  boost::mutex* _startRenderingMutex;
89  boost::mutex* _renderingCompleteMutex;
90  boost::condition_variable* _initCond;
91  boost::condition_variable* _startRenderingCond;
92  boost::condition_variable* _renderingCompleteCond;
93  int _threadId;
94 
95  GLuint _stereoFBO;
96  GLuint _leftEyeTexture;
97  GLuint _rightEyeTexture;
98  GLuint _depthRBO;
99  GLhandleARB _stereoProgram;
100  GLfloat _fullscreenVertices[8];
101  GLuint _fullscreenIndices[4];
102  GLuint _vertexBuffer;
103  GLuint _indexBuffer;
104 
105  // Unfortunately windows does not default to supporting opengl > 1.1
106  // This is a hack to load the framebuffer and shader extensions needed to support
107  // interlaced and checkerboard stereo rendering. We have chosen not to use glew to avoid
108  // an additional dependency that can cause versioning conflicts with app kits that also use glew.
109 #ifdef _WIN32
110  // Framebuffer object
111  PFNGLGENFRAMEBUFFERSPROC pglGenFramebuffers; // FBO name generation procedure
112  PFNGLDELETEFRAMEBUFFERSPROC pglDeleteFramebuffers; // FBO deletion procedure
113  PFNGLBINDFRAMEBUFFERPROC pglBindFramebuffer; // FBO bind procedure
114  PFNGLCHECKFRAMEBUFFERSTATUSPROC pglCheckFramebufferStatus; // FBO completeness test procedure
115  PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC pglGetFramebufferAttachmentParameteriv; // return various FBO parameters
116  PFNGLGENERATEMIPMAPPROC pglGenerateMipmap; // FBO automatic mipmap generation procedure
117  PFNGLFRAMEBUFFERTEXTURE2DPROC pglFramebufferTexture2D; // FBO texdture attachement procedure
118  PFNGLFRAMEBUFFERRENDERBUFFERPROC pglFramebufferRenderbuffer; // FBO renderbuffer attachement procedure
119  // Renderbuffer object
120  PFNGLGENRENDERBUFFERSPROC pglGenRenderbuffers; // renderbuffer generation procedure
121  PFNGLDELETERENDERBUFFERSPROC pglDeleteRenderbuffers; // renderbuffer deletion procedure
122  PFNGLBINDRENDERBUFFERPROC pglBindRenderbuffer; // renderbuffer bind procedure
123  PFNGLRENDERBUFFERSTORAGEPROC pglRenderbufferStorage; // renderbuffer memory allocation procedure
124  PFNGLGETRENDERBUFFERPARAMETERIVPROC pglGetRenderbufferParameteriv; // return various renderbuffer parameters
125  PFNGLISRENDERBUFFERPROC pglIsRenderbuffer; // determine renderbuffer object type
126  // Shaders
127  PFNGLCREATEPROGRAMPROC pglCreateProgram;
128  PFNGLCREATESHADERPROC pglCreateShader;
129  PFNGLSHADERSOURCEPROC pglShaderSource;
130  PFNGLCOMPILESHADERPROC pglCompileShader;
131  PFNGLGETOBJECTPARAMETERIVARBPROC pglGetObjectParameterivARB;
132  PFNGLATTACHSHADERPROC pglAttachShader;
133  PFNGLLINKPROGRAMPROC pglLinkProgram;
134  PFNGLGETSHADERIVPROC pglGetShaderiv;
135  PFNGLGETPROGRAMIVARBPROC pglGetProgramivARB;
136  PFNGLUSEPROGRAMPROC pglUseProgram;
137  PFNGLGETUNIFORMLOCATIONPROC pglGetUniformLocation;
138  PFNGLUNIFORM2FPROC pglUniform2f;
139  PFNGLUNIFORM1IPROC pglUniform1i;
140  // VBO
141  PFNGLBINDBUFFERPROC pglBindBuffer;
142  PFNGLGENBUFFERSPROC pglGenBuffers;
143  PFNGLBUFFERDATAPROC pglBufferData;
144  // Textures
145  PFNGLACTIVETEXTUREPROC pglActiveTexture;
146 
147  #ifndef glGenFramebuffers
148  #define glGenFramebuffers pglGenFramebuffers
149  #endif
150  #ifndef glDeleteFramebuffers
151  #define glDeleteFramebuffers pglDeleteFramebuffers
152  #endif
153  #ifndef glBindFramebuffer
154  #define glBindFramebuffer pglBindFramebuffer
155  #endif
156  #ifndef glCheckFramebufferStatus
157  #define glCheckFramebufferStatus pglCheckFramebufferStatus
158  #endif
159  #ifndef glGetFramebufferAttachmentParameteriv
160  #define glGetFramebufferAttachmentParameteriv pglGetFramebufferAttachmentParameteriv
161  #endif
162  #ifndef glGenerateMipmap
163  #define glGenerateMipmap pglGenerateMipmap
164  #endif
165  #ifndef glFramebufferTexture2D
166  #define glFramebufferTexture2D pglFramebufferTexture2D
167  #endif
168  #ifndef glFramebufferRenderbuffer
169  #define glFramebufferRenderbuffer pglFramebufferRenderbuffer
170  #endif
171 
172  #ifndef glGenRenderbuffers
173  #define glGenRenderbuffers pglGenRenderbuffers
174  #endif
175  #ifndef glDeleteRenderbuffers
176  #define glDeleteRenderbuffers pglDeleteRenderbuffers
177  #endif
178  #ifndef glBindRenderbuffer
179  #define glBindRenderbuffer pglBindRenderbuffer
180  #endif
181  #ifndef glRenderbufferStorage
182  #define glRenderbufferStorage pglRenderbufferStorage
183  #endif
184  #ifndef glGetRenderbufferParameteriv
185  #define glGetRenderbufferParameteriv pglGetRenderbufferParameteriv
186  #endif
187  #ifndef glIsRenderBuffer
188  #define glIsRenderbuffer pglIsRenderbuffer
189  #endif
190 
191  #ifndef glCreateProgram
192  #define glCreateProgram pglCreateProgram
193  #endif
194  #ifndef glCreateShader
195  #define glCreateShader pglCreateShader
196  #endif
197  #ifndef glShaderSource
198  #define glShaderSource pglShaderSource
199  #endif
200  #ifndef glCompileShader
201  #define glCompileShader pglCompileShader
202  #endif
203  #ifndef glGetObjectParameterivARB
204  #define glGetObjectParameterivARB pglGetObjectParameterivARB
205  #endif
206  #ifndef glAttachShader
207  #define glAttachShader pglAttachShader
208  #endif
209  #ifndef glLinkProgram
210  #define glLinkProgram pglLinkProgram
211  #endif
212  #ifndef glGetShaderiv
213  #define glGetShaderiv pglGetShaderiv
214  #endif
215  #ifndef glGetProgramivARB
216  #define glGetProgramivARB pglGetProgramivARB
217  #endif
218  #ifndef glUseProgram
219  #define glUseProgram pglUseProgram
220  #endif
221  #ifndef glGetUniformLocation
222  #define glGetUniformLocation pglGetUniformLocation
223  #endif
224  #ifndef glUniform2f
225  #define glUniform2f pglUniform2f
226  #endif
227  #ifndef glUniform1i
228  #define glUniform1i pglUniform1i
229  #endif
230 
231  #ifndef glBindBuffer
232  #define glBindBuffer pglBindBuffer
233  #endif
234  #ifndef glGenBuffers
235  #define glGenBuffers pglGenBuffers
236  #endif
237  #ifndef glBufferData
238  #define glBufferData pglBufferData
239  #endif
240 
241  #ifndef glActiveTexture
242  #define glActiveTexture pglActiveTexture
243  #endif
244 
245 #endif
246 };
247 
248 }// End namespace
249 
250 #endif