diff --git a/panda/src/glxdisplay/config_glxdisplay.cxx b/panda/src/glxdisplay/config_glxdisplay.cxx index 1e08a4e56a..99a3b02b6f 100644 --- a/panda/src/glxdisplay/config_glxdisplay.cxx +++ b/panda/src/glxdisplay/config_glxdisplay.cxx @@ -31,6 +31,12 @@ ConfigureFn(config_glxdisplay) { init_libglxdisplay(); } +ConfigVariableString display_cfg +("display", ""); + +ConfigVariableBool glx_error_abort +("glx-error-abort", false); + //////////////////////////////////////////////////////////////////// // Function: init_libglxdisplay // Description: Initializes the library. This must be called at @@ -58,6 +64,3 @@ init_libglxdisplay() { selection->add_pipe_type(glxGraphicsPipe::get_class_type(), glxGraphicsPipe::pipe_constructor); } - -const string display_cfg = config_glxdisplay.GetString("display", ""); -const bool glx_error_abort = config_glxdisplay.GetBool("glx-error-abort", false); diff --git a/panda/src/glxdisplay/config_glxdisplay.h b/panda/src/glxdisplay/config_glxdisplay.h index b2a1c1817e..30f66bbd92 100644 --- a/panda/src/glxdisplay/config_glxdisplay.h +++ b/panda/src/glxdisplay/config_glxdisplay.h @@ -21,12 +21,14 @@ #include "pandabase.h" #include "notifyCategoryProxy.h" +#include "configVariableString.h" +#include "configVariableBool.h" NotifyCategoryDecl(glxdisplay, EXPCL_PANDAGL, EXPTP_PANDAGL); extern EXPCL_PANDAGL void init_libglxdisplay(); -extern const string display_cfg; -extern const bool glx_error_abort; +extern ConfigVariableString display_cfg; +extern ConfigVariableBool glx_error_abort; #endif /* __CONFIG_GLXDISPLAY_H__ */ diff --git a/panda/src/glxdisplay/glxGraphicsPipe.cxx b/panda/src/glxdisplay/glxGraphicsPipe.cxx index 9fa747641e..f84d92f868 100644 --- a/panda/src/glxdisplay/glxGraphicsPipe.cxx +++ b/panda/src/glxdisplay/glxGraphicsPipe.cxx @@ -285,33 +285,20 @@ make_buffer(GraphicsStateGuardian *gsg, const string &name, GLXFBConfig glxGraphicsPipe:: choose_fbconfig(FrameBufferProperties &properties) const { int frame_buffer_mode = 0; - int want_depth_bits = 0; - int want_color_bits = 0; if (properties.has_frame_buffer_mode()) { frame_buffer_mode = properties.get_frame_buffer_mode(); } - if (properties.has_depth_bits()) { - want_depth_bits = properties.get_depth_bits(); - } - - if (properties.has_color_bits()) { - want_color_bits = properties.get_color_bits(); - } - - /* - if (frame_buffer_mode & FrameBufferProperties::FM_multisample) { - if (!glx_supports("GLX_SGIS_multisample")) { - glxdisplay_cat.info() - << "multisample not supported by this glx implementation.\n"; - frame_buffer_mode &= ~FrameBufferProperties::FM_multisample; - } - } - */ + int want_depth_bits = properties.get_depth_bits(); + int want_color_bits = properties.get_color_bits(); + int want_alpha_bits = properties.get_alpha_bits(); + int want_stencil_bits = properties.get_stencil_bits(); + int want_multisample_bits = properties.get_multisample_bits(); GLXFBConfig fbconfig = - try_for_fbconfig(frame_buffer_mode, want_depth_bits, want_color_bits); + try_for_fbconfig(frame_buffer_mode, want_depth_bits, want_color_bits, + want_alpha_bits, want_stencil_bits, want_multisample_bits); // This is the severity level at which we'll report the details of // the fbconfig we actually do find. Normally, it's debug-level @@ -341,7 +328,7 @@ choose_fbconfig(FrameBufferProperties &properties) const { // Actually, first we'll eliminate all of the minimum sizes, to // try to open a window with all of the requested options, but // maybe not as many bits in some options as we'd like. - fbconfig = try_for_fbconfig(frame_buffer_mode, 1, 1); + fbconfig = try_for_fbconfig(frame_buffer_mode); } if (fbconfig == None) { @@ -388,7 +375,9 @@ choose_fbconfig(FrameBufferProperties &properties) const { int new_frame_buffer_mode = frame_buffer_mode & ~strip_properties[i]; if (tried_masks.insert(new_frame_buffer_mode).second) { fbconfig = try_for_fbconfig(new_frame_buffer_mode, want_depth_bits, - want_color_bits); + want_color_bits, want_alpha_bits, + want_stencil_bits, want_multisample_bits); + } } @@ -402,7 +391,7 @@ choose_fbconfig(FrameBufferProperties &properties) const { for (i = 0; fbconfig == None && strip_properties[i] != 0; i++) { int new_frame_buffer_mode = frame_buffer_mode & ~strip_properties[i]; if (tried_masks.insert(new_frame_buffer_mode).second) { - fbconfig = try_for_fbconfig(new_frame_buffer_mode, 1, 1); + fbconfig = try_for_fbconfig(new_frame_buffer_mode); } } } @@ -411,7 +400,7 @@ choose_fbconfig(FrameBufferProperties &properties) const { if (fbconfig == None) { // Here's our last-ditch desparation attempt: give us any GLX // fbconfig at all! - fbconfig = try_for_fbconfig(0, 1, 1); + fbconfig = try_for_fbconfig(0); } if (fbconfig == None) { @@ -506,7 +495,9 @@ choose_fbconfig(FrameBufferProperties &properties) const { //////////////////////////////////////////////////////////////////// GLXFBConfig glxGraphicsPipe:: try_for_fbconfig(int framebuffer_mode, - int want_depth_bits, int want_color_bits) const { + int want_depth_bits, int want_color_bits, + int want_alpha_bits, int want_stencil_bits, + int want_multisample_bits) const { static const int max_attrib_list = 32; int attrib_list[max_attrib_list]; int n=0; @@ -514,12 +505,7 @@ try_for_fbconfig(int framebuffer_mode, glxdisplay_cat.debug() << "Trying for fbconfig with: RGB(" << want_color_bits << ")"; - int want_color_component_bits; - if (framebuffer_mode & FrameBufferProperties::FM_alpha) { - want_color_component_bits = max(want_color_bits / 4, 1); - } else { - want_color_component_bits = max(want_color_bits / 3, 1); - } + int want_color_component_bits = max(want_color_bits / 3, 1); attrib_list[n++] = GLX_RED_SIZE; attrib_list[n++] = want_color_component_bits; @@ -529,9 +515,9 @@ try_for_fbconfig(int framebuffer_mode, attrib_list[n++] = want_color_component_bits; if (framebuffer_mode & FrameBufferProperties::FM_alpha) { - glxdisplay_cat.debug(false) << " ALPHA"; + glxdisplay_cat.debug(false) << " ALPHA(" << want_alpha_bits << ")"; attrib_list[n++] = GLX_ALPHA_SIZE; - attrib_list[n++] = want_color_component_bits; + attrib_list[n++] = want_alpha_bits; } switch (framebuffer_mode & FrameBufferProperties::FM_buffer) { @@ -565,9 +551,9 @@ try_for_fbconfig(int framebuffer_mode, } if (framebuffer_mode & FrameBufferProperties::FM_stencil) { - glxdisplay_cat.debug(false) << " STENCIL"; + glxdisplay_cat.debug(false) << " STENCIL(" << want_stencil_bits << ")"; attrib_list[n++] = GLX_STENCIL_SIZE; - attrib_list[n++] = 1; + attrib_list[n++] = want_stencil_bits; } if (framebuffer_mode & FrameBufferProperties::FM_accum) { @@ -580,15 +566,14 @@ try_for_fbconfig(int framebuffer_mode, attrib_list[n++] = want_color_component_bits; if (framebuffer_mode & FrameBufferProperties::FM_alpha) { attrib_list[n++] = GLX_ACCUM_ALPHA_SIZE; - attrib_list[n++] = want_color_component_bits; + attrib_list[n++] = want_alpha_bits; } } if (framebuffer_mode & FrameBufferProperties::FM_multisample) { - glxdisplay_cat.debug(false) << " MULTISAMPLE"; + glxdisplay_cat.debug(false) << " MULTISAMPLE(" << want_multisample_bits << ")"; attrib_list[n++] = GLX_SAMPLES; - // We decide 4 is minimum number of samples - attrib_list[n++] = 4; + attrib_list[n++] = want_multisample_bits; } // Terminate the list @@ -639,23 +624,20 @@ try_for_fbconfig(int framebuffer_mode, XVisualInfo *glxGraphicsPipe:: choose_visual(FrameBufferProperties &properties) const { int frame_buffer_mode = 0; - int want_depth_bits = 0; - int want_color_bits = 0; if (properties.has_frame_buffer_mode()) { frame_buffer_mode = properties.get_frame_buffer_mode(); } - if (properties.has_depth_bits()) { - want_depth_bits = properties.get_depth_bits(); - } - - if (properties.has_color_bits()) { - want_color_bits = properties.get_color_bits(); - } + int want_depth_bits = properties.get_depth_bits(); + int want_color_bits = properties.get_color_bits(); + int want_alpha_bits = properties.get_alpha_bits(); + int want_stencil_bits = properties.get_stencil_bits(); + int want_multisample_bits = properties.get_multisample_bits(); XVisualInfo *visual = - try_for_visual(frame_buffer_mode, want_depth_bits, want_color_bits); + try_for_visual(frame_buffer_mode, want_depth_bits, want_color_bits, + want_alpha_bits, want_stencil_bits, want_multisample_bits); // This is the severity level at which we'll report the details of // the visual we actually do find. Normally, it's debug-level @@ -685,7 +667,7 @@ choose_visual(FrameBufferProperties &properties) const { // Actually, first we'll eliminate all of the minimum sizes, to // try to open a window with all of the requested options, but // maybe not as many bits in some options as we'd like. - visual = try_for_visual(frame_buffer_mode, 1, 1); + visual = try_for_visual(frame_buffer_mode); } if (visual == NULL) { @@ -732,7 +714,9 @@ choose_visual(FrameBufferProperties &properties) const { int new_frame_buffer_mode = frame_buffer_mode & ~strip_properties[i]; if (tried_masks.insert(new_frame_buffer_mode).second) { visual = try_for_visual(new_frame_buffer_mode, want_depth_bits, - want_color_bits); + want_color_bits, want_alpha_bits, + want_stencil_bits, want_multisample_bits); + } } @@ -746,7 +730,7 @@ choose_visual(FrameBufferProperties &properties) const { for (i = 0; visual == NULL && strip_properties[i] != 0; i++) { int new_frame_buffer_mode = frame_buffer_mode & ~strip_properties[i]; if (tried_masks.insert(new_frame_buffer_mode).second) { - visual = try_for_visual(new_frame_buffer_mode, 1, 1); + visual = try_for_visual(new_frame_buffer_mode); } } } @@ -755,7 +739,7 @@ choose_visual(FrameBufferProperties &properties) const { if (visual == NULL) { // Here's our last-ditch desparation attempt: give us any GLX // visual at all! - visual = try_for_visual(0, 1, 1); + visual = try_for_visual(0); } if (visual == NULL) { @@ -851,7 +835,9 @@ choose_visual(FrameBufferProperties &properties) const { //////////////////////////////////////////////////////////////////// XVisualInfo *glxGraphicsPipe:: try_for_visual(int framebuffer_mode, - int want_depth_bits, int want_color_bits) const { + int want_depth_bits, int want_color_bits, + int want_alpha_bits, int want_stencil_bits, + int want_multisample_bits) const { static const int max_attrib_list = 32; int attrib_list[max_attrib_list]; int n=0; @@ -859,12 +845,7 @@ try_for_visual(int framebuffer_mode, glxdisplay_cat.debug() << "Trying for visual with: RGB(" << want_color_bits << ")"; - int want_color_component_bits; - if (framebuffer_mode & FrameBufferProperties::FM_alpha) { - want_color_component_bits = max(want_color_bits / 4, 1); - } else { - want_color_component_bits = max(want_color_bits / 3, 1); - } + int want_color_component_bits = max(want_color_bits / 3, 1); attrib_list[n++] = GLX_RGBA; attrib_list[n++] = GLX_RED_SIZE; @@ -875,9 +856,9 @@ try_for_visual(int framebuffer_mode, attrib_list[n++] = want_color_component_bits; if (framebuffer_mode & FrameBufferProperties::FM_alpha) { - glxdisplay_cat.debug(false) << " ALPHA"; + glxdisplay_cat.debug(false) << " ALPHA(" << want_alpha_bits << ")"; attrib_list[n++] = GLX_ALPHA_SIZE; - attrib_list[n++] = want_color_component_bits; + attrib_list[n++] = want_alpha_bits; } if (framebuffer_mode & FrameBufferProperties::FM_double_buffer) { glxdisplay_cat.debug(false) << " DOUBLEBUFFER"; @@ -893,9 +874,9 @@ try_for_visual(int framebuffer_mode, attrib_list[n++] = want_depth_bits; } if (framebuffer_mode & FrameBufferProperties::FM_stencil) { - glxdisplay_cat.debug(false) << " STENCIL"; + glxdisplay_cat.debug(false) << " STENCIL(" << want_stencil_bits << ")"; attrib_list[n++] = GLX_STENCIL_SIZE; - attrib_list[n++] = 1; + attrib_list[n++] = want_stencil_bits; } if (framebuffer_mode & FrameBufferProperties::FM_accum) { glxdisplay_cat.debug(false) << " ACCUM"; @@ -907,14 +888,13 @@ try_for_visual(int framebuffer_mode, attrib_list[n++] = want_color_component_bits; if (framebuffer_mode & FrameBufferProperties::FM_alpha) { attrib_list[n++] = GLX_ACCUM_ALPHA_SIZE; - attrib_list[n++] = want_color_component_bits; + attrib_list[n++] = want_alpha_bits; } } if (framebuffer_mode & FrameBufferProperties::FM_multisample) { - glxdisplay_cat.debug(false) << " MULTISAMPLE"; + glxdisplay_cat.debug(false) << " MULTISAMPLE(" << want_multisample_bits << ")"; attrib_list[n++] = GLX_SAMPLES; - // We decide 4 is minimum number of samples - attrib_list[n++] = 4; + attrib_list[n++] = want_multisample_bits; } // Terminate the list diff --git a/panda/src/glxdisplay/glxGraphicsPipe.h b/panda/src/glxdisplay/glxGraphicsPipe.h index acf805a328..03f15a0fbe 100644 --- a/panda/src/glxdisplay/glxGraphicsPipe.h +++ b/panda/src/glxdisplay/glxGraphicsPipe.h @@ -106,12 +106,20 @@ private: #ifdef HAVE_GLXFBCONFIG GLXFBConfig choose_fbconfig(FrameBufferProperties &properties) const; GLXFBConfig try_for_fbconfig(int framebuffer_mode, - int want_depth_bits, int want_color_bits) const; + int want_depth_bits = 1, + int want_color_bits = 1, + int want_alpha_bits = 1, + int want_stencil_bits = 1, + int want_multisample_bits = 1) const; #endif XVisualInfo *choose_visual(FrameBufferProperties &properties) const; XVisualInfo *try_for_visual(int framebuffer_mode, - int want_depth_bits, int want_color_bits) const; + int want_depth_bits = 1, + int want_color_bits = 1, + int want_alpha_bits = 1, + int want_stencil_bits = 1, + int want_multisample_bits = 1) const; void make_hidden_cursor(); void release_hidden_cursor();