00001
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
00023 if (valid)
00024 destroy();
00025
00026 width = w;
00027 height = h;
00028
00029
00030
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
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