Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

float_pbuffer_lnx.h

Go to the documentation of this file.
00001 /* this stuff is snarfed from the NVIDIA SDK available from developer.nvidia.com */
00002 #ifndef __NVSDK_FLOAT_PBUFFER_LNX_H
00003 #define __NVSDK_FLOAT_PBUFFER_LNX_H
00004 #include <GL/glx.h>
00005 #include <GL/glxext.h>
00006 
00012 class CFPBuffer
00013 {
00014     public:
00015         CFPBuffer() 
00016           : width(0), height(0), m_pDisplay(0), m_glxPbuffer(0), m_glxContext(0),
00017             m_pOldDisplay(0), m_glxOldDrawable(0), m_glxOldContext(0), valid(false)
00018         { }
00019 
00020         bool create(int w, int h)
00021         {
00022             // clean up pbuffer resources if already created
00023             if (valid)
00024                 destroy();
00025     
00026             width = w;
00027             height = h;
00028             
00029             // get a copy of the main windows device context and rendering
00030             // context
00031             
00032             m_pOldDisplay = glXGetCurrentDisplay();
00033             m_glxOldDrawable = glXGetCurrentDrawable();
00034             m_glxOldContext = glXGetCurrentContext();
00035             int iScreen = DefaultScreen(m_pOldDisplay);
00036     
00037             GLXFBConfig *glxConfig;
00038             int iConfigCount;   
00039             
00040             int pfAttribList[] = 
00041             {
00042                 GLX_RED_SIZE,               32,
00043                 GLX_GREEN_SIZE,             32,
00044                 GLX_BLUE_SIZE,              32,
00045                 GLX_ALPHA_SIZE,             32,
00046                 GLX_STENCIL_SIZE,           8,
00047                 GLX_DEPTH_SIZE,             24,
00048                 GLX_FLOAT_COMPONENTS_NV,    true,
00049                 GLX_DRAWABLE_TYPE,          GLX_PBUFFER_BIT,
00050                 0,
00051             };
00052     
00053             glxConfig = glXChooseFBConfigSGIX(m_pOldDisplay, iScreen, pfAttribList, &iConfigCount);
00054             if (!glxConfig)
00055             {
00056                 fprintf(stderr, "pbuffer creation error:  glXChooseFBConfigSGIX() failed\n");
00057                 return false;
00058             }
00059             
00060             int pbAttribList[] = 
00061             {
00062                 GLX_LARGEST_PBUFFER, true,
00063                 GLX_PRESERVED_CONTENTS, true,
00064                 0,
00065             };
00066     
00067             m_glxPbuffer = glXCreateGLXPbufferSGIX(m_pOldDisplay, glxConfig[0], width, height, pbAttribList);
00068     
00069             if (!m_glxPbuffer)
00070             {
00071                 fprintf(stderr, "pbuffer creation error:  glXCreatePbufferSGIX() failed\n");
00072                 return false;
00073             }
00074     
00075             m_glxContext = glXCreateContextWithConfigSGIX(m_pOldDisplay, glxConfig[0], GLX_RGBA_TYPE, m_glxOldContext, true);
00076             if (!glxConfig)
00077             {
00078                 fprintf(stderr, "pbuffer creation error:  glXCreateContextWithConfigSGIX() failed\n");
00079                 return false;
00080             }
00081             
00082             m_pDisplay = m_pOldDisplay;
00083             
00084             valid = true;
00085             
00086             return true;
00087         }
00088     
00089         void activate()
00090         {
00091             if (valid)
00092                 glXMakeCurrent(m_pDisplay, m_glxPbuffer, m_glxContext);
00093         }
00094     
00095         void deactivate()
00096         {
00097             if (valid)
00098                 glXMakeCurrent(m_pOldDisplay, m_glxOldDrawable, m_glxOldContext);
00099         }
00100     
00101         void destroy()
00102         {
00103             if (valid)
00104             {
00105                 glXDestroyContext(m_pDisplay, m_glxContext);
00106                 glXDestroyGLXPbufferSGIX(m_pDisplay, m_glxPbuffer);        
00107         
00108                 // Return to the normal context
00109                 glXMakeCurrent(m_pOldDisplay, m_glxOldDrawable, m_glxOldContext);
00110     
00111                 width = 0;
00112                 height = 0;
00113                 
00114                 m_pDisplay = 0;
00115                 m_glxPbuffer = 0;
00116                 m_glxContext = 0;
00117 
00118                 m_pOldDisplay = 0;
00119                 m_glxOldDrawable = 0;
00120                 m_glxOldContext = 0;
00121                 
00122                 valid = false;
00123             }
00124         }
00125     
00126         int getWidth()
00127         { return width; }
00128 
00129         int getHeight()
00130         { return height; }
00131 
00132         ~CFPBuffer()
00133         {
00134             destroy();
00135         }
00136     
00137     private:
00138         int width;
00139         int height;
00140 
00141         Display    *m_pDisplay;
00142         GLXPbuffer  m_glxPbuffer;
00143         GLXContext  m_glxContext;
00144 
00145         Display    *m_pOldDisplay;
00146         GLXPbuffer  m_glxOldDrawable;
00147         GLXContext  m_glxOldContext;
00148 
00149         bool valid;
00150 };
00151 
00152 #endif

Generated on Mon Jun 27 14:54:29 2005 for OPENVIDIA by  doxygen 1.4.0