more reliably check for Mesa

This commit is contained in:
David Rose 2005-07-20 16:59:30 +00:00
parent af49897d5e
commit d439425648
10 changed files with 183 additions and 74 deletions

View File

@ -116,7 +116,7 @@ set_active(bool active) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool GraphicsStateGuardian:: INLINE bool GraphicsStateGuardian::
is_active() const { is_active() const {
return _active; return _active && _is_valid;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -539,6 +539,19 @@ mark_new() {
_needs_reset = true; _needs_reset = true;
} }
////////////////////////////////////////////////////////////////////
// Function: GraphicsStateGuardian::is_valid
// Access: Public
// Description: Returns true if the GSG has been correctly
// initialized within a graphics context, false if there
// has been some problem or it hasn't been initialized
// yet.
////////////////////////////////////////////////////////////////////
INLINE bool GraphicsStateGuardian::
is_valid() const {
return _is_valid;
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GraphicsStateGuardian::modify_state // Function: GraphicsStateGuardian::modify_state
// Access: Public // Access: Public

View File

@ -105,6 +105,7 @@ GraphicsStateGuardian(const FrameBufferProperties &properties,
_current_display_region = (DisplayRegion*)0L; _current_display_region = (DisplayRegion*)0L;
_current_lens = (Lens *)NULL; _current_lens = (Lens *)NULL;
_needs_reset = true; _needs_reset = true;
_is_valid = false;
_closing_gsg = false; _closing_gsg = false;
_active = true; _active = true;
_prepared_objects = new PreparedGraphicsObjects; _prepared_objects = new PreparedGraphicsObjects;
@ -207,6 +208,7 @@ get_supported_geom_rendering() const {
void GraphicsStateGuardian:: void GraphicsStateGuardian::
reset() { reset() {
_needs_reset = false; _needs_reset = false;
_is_valid = false;
_display_region_stack_level = 0; _display_region_stack_level = 0;
_frame_buffer_stack_level = 0; _frame_buffer_stack_level = 0;
@ -261,6 +263,8 @@ reset() {
_needs_tex_gen = false; _needs_tex_gen = false;
_tex_gen_modifies_mat = false; _tex_gen_modifies_mat = false;
_last_max_stage_index = 0; _last_max_stage_index = 0;
_is_valid = true;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -190,6 +190,7 @@ public:
INLINE bool reset_if_new(); INLINE bool reset_if_new();
INLINE void mark_new(); INLINE void mark_new();
virtual void reset(); virtual void reset();
INLINE bool is_valid() const;
INLINE void modify_state(const RenderState *state); INLINE void modify_state(const RenderState *state);
INLINE void set_state(const RenderState *state); INLINE void set_state(const RenderState *state);
@ -362,6 +363,7 @@ protected:
int _last_max_stage_index; int _last_max_stage_index;
bool _needs_reset; bool _needs_reset;
bool _is_valid;
bool _closing_gsg; bool _closing_gsg;
bool _active; bool _active;

View File

@ -82,6 +82,59 @@ report_my_errors(int line, const char *source_file) {
#endif #endif
} }
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::get_gl_vendor
// Access: Public
// Description: Returns the GL vendor string reported by the driver.
////////////////////////////////////////////////////////////////////
INLINE const string &CLP(GraphicsStateGuardian)::
get_gl_vendor() const {
return _gl_vendor;
}
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::get_gl_renderer
// Access: Public
// Description: Returns the GL renderer string reported by the driver.
////////////////////////////////////////////////////////////////////
INLINE const string &CLP(GraphicsStateGuardian)::
get_gl_renderer() const {
return _gl_renderer;
}
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::get_gl_version_major
// Access: Public
// Description: Returns the major part of the reported GL version
// number.
////////////////////////////////////////////////////////////////////
INLINE int CLP(GraphicsStateGuardian)::
get_gl_version_major() const {
return _gl_version_major;
}
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::get_gl_version_minor
// Access: Public
// Description: Returns the minor part of the reported GL version
// number.
////////////////////////////////////////////////////////////////////
INLINE int CLP(GraphicsStateGuardian)::
get_gl_version_minor() const {
return _gl_version_minor;
}
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::get_gl_version_release
// Access: Public
// Description: Returns the release part of the reported GL version
// number.
////////////////////////////////////////////////////////////////////
INLINE int CLP(GraphicsStateGuardian)::
get_gl_version_release() const {
return _gl_version_release;
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::enable_multisample_antialias // Function: CLP(GraphicsStateGuardian)::enable_multisample_antialias
// Access: Protected // Access: Protected

View File

@ -304,7 +304,7 @@ reset() {
GraphicsStateGuardian::reset(); GraphicsStateGuardian::reset();
// Output the vendor and version strings. // Output the vendor and version strings.
get_gl_version(); query_gl_version();
// Save the extensions tokens. // Save the extensions tokens.
save_extensions((const char *)GLP(GetString)(GL_EXTENSIONS)); save_extensions((const char *)GLP(GetString)(GL_EXTENSIONS));
@ -2932,31 +2932,37 @@ report_errors_loop(int line, const char *source_file, GLenum error_code,
// Function: GLGraphicsStateGuardian::show_gl_string // Function: GLGraphicsStateGuardian::show_gl_string
// Access: Protected // Access: Protected
// Description: Outputs the result of glGetString() on the indicated // Description: Outputs the result of glGetString() on the indicated
// tag. // tag. The output string is returned.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(GraphicsStateGuardian):: string CLP(GraphicsStateGuardian)::
show_gl_string(const string &name, GLenum id) { show_gl_string(const string &name, GLenum id) {
if (GLCAT.is_debug()) { string result;
const GLubyte *text = GLP(GetString)(id); const GLubyte *text = GLP(GetString)(id);
if (text == (const GLubyte *)NULL) { if (text == (const GLubyte *)NULL) {
GLCAT.debug() GLCAT.warning()
<< "Unable to query " << name << "\n"; << "Unable to query " << name << "\n";
} else { } else {
result = (const char *)text;
if (GLCAT.is_debug()) {
GLCAT.debug() GLCAT.debug()
<< name << " = " << (const char *)text << "\n"; << name << " = " << result << "\n";
} }
} }
return result;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GLGraphicsStateGuardian::get_gl_version // Function: GLGraphicsStateGuardian::query_gl_version
// Access: Protected, Virtual // Access: Protected, Virtual
// Description: Queries the runtime version of OpenGL in use. // Description: Queries the runtime version of OpenGL in use.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(GraphicsStateGuardian):: void CLP(GraphicsStateGuardian)::
get_gl_version() { query_gl_version() {
show_gl_string("GL_VENDOR", GL_VENDOR); _gl_vendor = show_gl_string("GL_VENDOR", GL_VENDOR);
show_gl_string("GL_RENDERER", GL_RENDERER); _gl_renderer = show_gl_string("GL_RENDERER", GL_RENDERER);
_gl_version_major = 0; _gl_version_major = 0;
_gl_version_minor = 0; _gl_version_minor = 0;
@ -4360,6 +4366,9 @@ finish_modify_state() {
GLP(TexEnvi)(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); GLP(TexEnvi)(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
got_point_sprites = true; got_point_sprites = true;
break; break;
case TexGenAttrib::M_unused:
break;
} }
} }

View File

@ -158,11 +158,17 @@ public:
INLINE static bool report_errors(int line, const char *source_file); INLINE static bool report_errors(int line, const char *source_file);
INLINE void report_my_errors(int line, const char *source_file); INLINE void report_my_errors(int line, const char *source_file);
INLINE const string &get_gl_vendor() const;
INLINE const string &get_gl_renderer() const;
INLINE int get_gl_version_major() const;
INLINE int get_gl_version_minor() const;
INLINE int get_gl_version_release() const;
protected: protected:
static bool report_errors_loop(int line, const char *source_file, static bool report_errors_loop(int line, const char *source_file,
GLenum error_code, int &error_count); GLenum error_code, int &error_count);
void show_gl_string(const string &name, GLenum id); string show_gl_string(const string &name, GLenum id);
virtual void get_gl_version(); virtual void query_gl_version();
void save_extensions(const char *extensions); void save_extensions(const char *extensions);
virtual void get_extra_extensions(); virtual void get_extra_extensions();
void report_extensions() const; void report_extensions() const;
@ -310,6 +316,8 @@ protected:
int _error_count; int _error_count;
string _gl_vendor;
string _gl_renderer;
int _gl_version_major, _gl_version_minor, _gl_version_release; int _gl_version_major, _gl_version_minor, _gl_version_release;
pset<string> _extensions; pset<string> _extensions;

View File

@ -191,50 +191,25 @@ make_gsg(const FrameBufferProperties &properties,
share_context = share_gsg->_context; share_context = share_gsg->_context;
} }
int frame_buffer_mode = properties.get_frame_buffer_mode();
bool hardware = ((frame_buffer_mode & FrameBufferProperties::FM_hardware) != 0);
bool software = ((frame_buffer_mode & FrameBufferProperties::FM_software) != 0);
// If the user specified neither hardware nor software frame buffer,
// he gets either one.
if (!hardware && !software) {
hardware = true;
software = true;
}
// There's no interface in GLX to query whether we have a software // There's no interface in GLX to query whether we have a software
// or a hardware rendering context. Fortunately, there seems to be // or a hardware rendering context. Fortunately, there seems to be
// only one likely software GLX context, and that's Mesa; we will // only one likely software GLX context, and that's Mesa; we will
// assume that any Mesa GLX context is software-based, and any other // assume that any Mesa GLX context is software-based, and any other
// context is hardware-based. // context is hardware-based.
// To determine whether we are using Mesa, we should strictly create // Unforunately, to determine whether we are using Mesa, we need to
// a GL context, bind it to a window, and then examine the // create a GL context, bind it to a window, and then examine the
// GL_RENDERER string, but as a cheesy shortcut to all of that hard // GL_RENDERER string to see if it contains "Mesa". So we must
// work, we'll just check the X server's GLX_VERSION string to see // create the GSG and its window first, and wait until the GSG has
// if it contains "Mesa". // been reset, before we can ask this question. Therefore we don't
// deal with hardware/software at this point, but rather in
// glxGraphicsStateGuardian::reset().
const char *glx_version = glXQueryServerString(_display, _screen, GLX_VERSION); // We do, however, need to determine ahead of time whether the user
if (glx_version != NULL) { // would prefer a hardware or software context.
if (strstr(glx_version, "Mesa") != NULL) { int frame_buffer_mode = properties.get_frame_buffer_mode();
// It's Mesa, therefore probably a software context. int want_hardware = (frame_buffer_mode & (FrameBufferProperties::FM_hardware |
if (!software) { FrameBufferProperties::FM_software));
glxdisplay_cat.error()
<< "Using GLX version " << glx_version << "; it is probably a software renderer.\n";
glxdisplay_cat.error()
<< "To allow use of this display add FM_software to your frame buffer mode.\n";
return NULL;
}
} else {
// It's some other server, therefore probably a hardware context.
if (!hardware) {
glxdisplay_cat.error()
<< "Using GLX version " << glx_version << "; it is probably hardware-accelerated.\n";
glxdisplay_cat.error()
<< "To allow use of this display add FM_hardware to your frame buffer mode.\n";
return NULL;
}
}
}
FrameBufferProperties new_properties = properties; FrameBufferProperties new_properties = properties;
GLXContext context = NULL; GLXContext context = NULL;
@ -278,13 +253,13 @@ make_gsg(const FrameBufferProperties &properties,
// Now we can make a GSG. // Now we can make a GSG.
PT(glxGraphicsStateGuardian) gsg = PT(glxGraphicsStateGuardian) gsg =
new glxGraphicsStateGuardian(new_properties, share_gsg, context, new glxGraphicsStateGuardian(new_properties, share_gsg, want_hardware,
visual, _display, _screen, fbconfig); context, visual, _display, _screen, fbconfig);
#else #else
PT(glxGraphicsStateGuardian) gsg = PT(glxGraphicsStateGuardian) gsg =
new glxGraphicsStateGuardian(new_properties, share_gsg, context, new glxGraphicsStateGuardian(new_properties, share_gsg, want_hardware,
visual, _display, _screen); context, visual, _display, _screen);
#endif // HAVE_GLXFBCONFIG #endif // HAVE_GLXFBCONFIG
return gsg.p(); return gsg.p();

View File

@ -33,6 +33,7 @@ TypeHandle glxGraphicsStateGuardian::_type_handle;
glxGraphicsStateGuardian:: glxGraphicsStateGuardian::
glxGraphicsStateGuardian(const FrameBufferProperties &properties, glxGraphicsStateGuardian(const FrameBufferProperties &properties,
glxGraphicsStateGuardian *share_with, glxGraphicsStateGuardian *share_with,
int want_hardware,
GLXContext context, XVisualInfo *visual, GLXContext context, XVisualInfo *visual,
Display *display, int screen Display *display, int screen
#ifdef HAVE_GLXFBCONFIG #ifdef HAVE_GLXFBCONFIG
@ -40,6 +41,7 @@ glxGraphicsStateGuardian(const FrameBufferProperties &properties,
#endif // HAVE_GLXFBCONFIG #endif // HAVE_GLXFBCONFIG
) : ) :
GLGraphicsStateGuardian(properties), GLGraphicsStateGuardian(properties),
_want_hardware(want_hardware),
_context(context), _context(context),
_visual(visual), _visual(visual),
_display(display), _display(display),
@ -102,6 +104,51 @@ reset() {
// that supports it. // that supports it.
_glXSwapIntervalSGI(sync_video ? 1 : 0); _glXSwapIntervalSGI(sync_video ? 1 : 0);
} }
// Finally, check that the context is the right kind of context:
// hardware or software. This really means examining the
// _gl_renderer string for "Mesa" (see the comment in
// glxGraphicsPipe).
bool hardware = ((_want_hardware & FrameBufferProperties::FM_hardware) != 0);
bool software = ((_want_hardware & FrameBufferProperties::FM_software) != 0);
// If the user specified neither hardware nor software frame buffer,
// he gets either one.
if (!hardware && !software) {
hardware = true;
software = true;
}
FrameBufferProperties properties = get_properties();
int frame_buffer_mode = properties.get_frame_buffer_mode();
if (_gl_renderer.find("Mesa") != string::npos) {
// It's Mesa, therefore probably a software context.
if (!software) {
glxdisplay_cat.error()
<< "Using GL renderer " << _gl_renderer << "; it is probably a software renderer.\n";
glxdisplay_cat.error()
<< "To allow use of this display add FM_software to your frame buffer mode.\n";
_is_valid = false;
}
frame_buffer_mode = (frame_buffer_mode | FrameBufferProperties::FM_software) & ~FrameBufferProperties::FM_hardware;
} else {
// It's some other renderer, therefore probably a hardware context.
if (!hardware) {
glxdisplay_cat.error()
<< "Using GL renderer " << _gl_renderer << "; it is probably hardware-accelerated.\n";
glxdisplay_cat.error()
<< "To allow use of this display add FM_hardware to your frame buffer mode.\n";
_is_valid = false;
}
frame_buffer_mode = (frame_buffer_mode | FrameBufferProperties::FM_hardware) & ~FrameBufferProperties::FM_software;
}
// Update the GSG's record to indicate whether we believe it is a
// hardware or software renderer.
properties.set_frame_buffer_mode(frame_buffer_mode);
set_properties(properties);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -122,13 +169,13 @@ glx_is_at_least_version(int major_version, int minor_version) const {
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: glxGraphicsStateGuardian::get_gl_version // Function: glxGraphicsStateGuardian::query_gl_version
// Access: Protected, Virtual // Access: Protected, Virtual
// Description: Queries the runtime version of OpenGL in use. // Description: Queries the runtime version of OpenGL in use.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void glxGraphicsStateGuardian:: void glxGraphicsStateGuardian::
get_gl_version() { query_gl_version() {
GLGraphicsStateGuardian::get_gl_version(); GLGraphicsStateGuardian::query_gl_version();
show_glx_client_string("GLX_VENDOR", GLX_VENDOR); show_glx_client_string("GLX_VENDOR", GLX_VENDOR);
show_glx_client_string("GLX_VERSION", GLX_VERSION); show_glx_client_string("GLX_VERSION", GLX_VERSION);

View File

@ -56,18 +56,15 @@ typedef int (* PFNGLXSWAPINTERVALSGIPROC) (int interval);
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class glxGraphicsStateGuardian : public GLGraphicsStateGuardian { class glxGraphicsStateGuardian : public GLGraphicsStateGuardian {
public: public:
glxGraphicsStateGuardian(const FrameBufferProperties &properties,
glxGraphicsStateGuardian *share_with,
int want_hardware,
GLXContext context, XVisualInfo *visual,
Display *display, int screen
#ifdef HAVE_GLXFBCONFIG #ifdef HAVE_GLXFBCONFIG
glxGraphicsStateGuardian(const FrameBufferProperties &properties, , GLXFBConfig fbconfig
glxGraphicsStateGuardian *share_with,
GLXContext context, XVisualInfo *visual,
Display *display, int screen,
GLXFBConfig fbconfig);
#else
glxGraphicsStateGuardian(const FrameBufferProperties &properties,
glxGraphicsStateGuardian *share_with,
GLXContext context, XVisualInfo *visual,
Display *display, int screen);
#endif // HAVE_GLXFBCONFIG #endif // HAVE_GLXFBCONFIG
);
virtual ~glxGraphicsStateGuardian(); virtual ~glxGraphicsStateGuardian();
@ -75,6 +72,7 @@ public:
bool glx_is_at_least_version(int major_version, int minor_version) const; bool glx_is_at_least_version(int major_version, int minor_version) const;
int _want_hardware;
GLXContext _context; GLXContext _context;
XVisualInfo *_visual; XVisualInfo *_visual;
Display *_display; Display *_display;
@ -89,7 +87,7 @@ public:
PFNGLXSWAPINTERVALSGIPROC _glXSwapIntervalSGI; PFNGLXSWAPINTERVALSGIPROC _glXSwapIntervalSGI;
protected: protected:
virtual void get_gl_version(); virtual void query_gl_version();
virtual void get_extra_extensions(); virtual void get_extra_extensions();
virtual void *get_extension_func(const char *prefix, const char *name); virtual void *get_extension_func(const char *prefix, const char *name);

View File

@ -122,7 +122,7 @@ make_context() {
// reset() requires having a current context.) // reset() requires having a current context.)
glxgsg->reset_if_new(); glxgsg->reset_if_new();
return true; return glxgsg->is_valid();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////