00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GLXGRAPHICSSTATEGUARDIAN_H
00016 #define GLXGRAPHICSSTATEGUARDIAN_H
00017
00018 #include "pandabase.h"
00019
00020 #include "glgsg.h"
00021 #include "glxGraphicsPipe.h"
00022 #include "posixGraphicsStateGuardian.h"
00023
00024 #if defined(GLX_VERSION_1_4)
00025
00026
00027 #define HAVE_GLXGETPROCADDRESS 1
00028
00029 #elif defined(GLX_ARB_get_proc_address)
00030
00031 #define HAVE_GLXGETPROCADDRESSARB 1
00032
00033
00034
00035 extern "C" void (*glXGetProcAddressARB(const GLubyte *procName))( void );
00036
00037 #endif
00038
00039
00040
00041 #include "panda_glxext.h"
00042
00043
00044
00045
00046
00047 #ifndef GLX_SAMPLE_BUFFERS
00048 #define GLX_SAMPLE_BUFFERS 100000
00049 #endif
00050 #ifndef GLX_SAMPLES
00051 #define GLX_SAMPLES 100001
00052 #endif
00053
00054
00055
00056
00057
00058
00059 #ifndef __EDG__ // Protect the following from the Tau instrumentor.
00060 typedef __GLXextFuncPtr (* PFNGLXGETPROCADDRESSPROC) (const GLubyte *procName);
00061 typedef int (* PFNGLXSWAPINTERVALSGIPROC) (int interval);
00062
00063 typedef GLXFBConfig * (* PFNGLXCHOOSEFBCONFIGPROC) (X11_Display *dpy, int screen, const int *attrib_list, int *nelements);
00064 typedef GLXContext (* PFNGLXCREATENEWCONTEXTPROC) (X11_Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
00065 typedef XVisualInfo * (* PFNGLXGETVISUALFROMFBCONFIGPROC) (X11_Display *dpy, GLXFBConfig config);
00066 typedef int (* PFNGLXGETFBCONFIGATTRIBPROC) (X11_Display *dpy, GLXFBConfig config, int attribute, int *value);
00067 typedef GLXPixmap (* PFNGLXCREATEPIXMAPPROC) (X11_Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
00068 typedef GLXPbuffer (* PFNGLXCREATEPBUFFERPROC) (X11_Display *dpy, GLXFBConfig config, const int *attrib_list);
00069 typedef void (* PFNGLXDESTROYPBUFFERPROC) (X11_Display *dpy, GLXPbuffer pbuf);
00070
00071 #endif // __EDG__
00072
00073
00074
00075
00076
00077
00078 class glxGraphicsStateGuardian : public PosixGraphicsStateGuardian {
00079 public:
00080 INLINE const FrameBufferProperties &get_fb_properties() const;
00081 void get_properties(FrameBufferProperties &properties, XVisualInfo *visual);
00082 void get_properties_advanced(FrameBufferProperties &properties,
00083 bool &context_has_pbuffer, bool &pixmap_supported,
00084 bool &slow, GLXFBConfig config);
00085 void choose_pixel_format(const FrameBufferProperties &properties,
00086 X11_Display *_display,
00087 int _screen,
00088 bool need_pbuffer, bool need_pixmap);
00089
00090 glxGraphicsStateGuardian(GraphicsEngine *engine, GraphicsPipe *pipe,
00091 glxGraphicsStateGuardian *share_with);
00092
00093 virtual ~glxGraphicsStateGuardian();
00094
00095 virtual void reset();
00096
00097 bool glx_is_at_least_version(int major_version, int minor_version) const;
00098
00099 GLXContext _share_context;
00100 GLXContext _context;
00101 X11_Display *_display;
00102 int _screen;
00103 XVisualInfo *_visual;
00104 XVisualInfo *_visuals;
00105
00106 GLXFBConfig _fbconfig;
00107 FrameBufferProperties _fbprops;
00108 bool _context_has_pbuffer;
00109 bool _context_has_pixmap;
00110 bool _slow;
00111
00112 public:
00113 bool _supports_swap_control;
00114 PFNGLXSWAPINTERVALSGIPROC _glXSwapIntervalSGI;
00115
00116 bool _supports_fbconfig;
00117 PFNGLXCHOOSEFBCONFIGPROC _glXChooseFBConfig;
00118 PFNGLXCREATENEWCONTEXTPROC _glXCreateNewContext;
00119 PFNGLXGETVISUALFROMFBCONFIGPROC _glXGetVisualFromFBConfig;
00120 PFNGLXGETFBCONFIGATTRIBPROC _glXGetFBConfigAttrib;
00121 PFNGLXCREATEPIXMAPPROC _glXCreatePixmap;
00122
00123 bool _supports_pbuffer;
00124 bool _uses_sgix_pbuffer;
00125 PFNGLXCREATEPBUFFERPROC _glXCreatePbuffer;
00126 PFNGLXCREATEGLXPBUFFERSGIXPROC _glXCreateGLXPbufferSGIX;
00127 PFNGLXDESTROYPBUFFERPROC _glXDestroyPbuffer;
00128
00129 protected:
00130 virtual void gl_flush() const;
00131 virtual GLenum gl_get_error() const;
00132
00133 virtual void query_gl_version();
00134 virtual void get_extra_extensions();
00135 virtual void *do_get_extension_func(const char *prefix, const char *name);
00136
00137 private:
00138 void show_glx_client_string(const string &name, int id);
00139 void show_glx_server_string(const string &name, int id);
00140 void choose_temp_visual(const FrameBufferProperties &properties);
00141 void init_temp_context();
00142 void destroy_temp_xwindow();
00143
00144 int _glx_version_major, _glx_version_minor;
00145
00146 bool _checked_get_proc_address;
00147 PFNGLXGETPROCADDRESSPROC _glXGetProcAddress;
00148
00149 GLXContext _temp_context;
00150 X11_Window _temp_xwindow;
00151 Colormap _temp_colormap;
00152
00153 public:
00154 static TypeHandle get_class_type() {
00155 return _type_handle;
00156 }
00157 static void init_type() {
00158 PosixGraphicsStateGuardian::init_type();
00159 register_type(_type_handle, "glxGraphicsStateGuardian",
00160 PosixGraphicsStateGuardian::get_class_type());
00161 }
00162 virtual TypeHandle get_type() const {
00163 return get_class_type();
00164 }
00165 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00166
00167 private:
00168 static TypeHandle _type_handle;
00169 };
00170
00171 #include "glxGraphicsStateGuardian.I"
00172
00173 #endif