Index: plugin/cross/o3d_glue.cc |
=================================================================== |
--- plugin/cross/o3d_glue.cc (revision 75475) |
+++ plugin/cross/o3d_glue.cc (working copy) |
@@ -257,6 +257,12 @@ |
} |
void PluginObject::CreateRenderer(const o3d::DisplayWindow& display_window) { |
+ // In case CreateRenderer is called more than once, reset to the |
+ // uninitialized state.. |
+ DeleteRenderer(); |
+ renderer_init_status_ = o3d::Renderer::UNINITIALIZED; |
+ |
+#if !defined(FORCE_CAIRO) |
if (!o3d::CheckConfig(npp_)) { |
renderer_init_status_ = o3d::Renderer::GPU_NOT_UP_TO_SPEC; |
} else { |
@@ -269,6 +275,24 @@ |
DeleteRenderer(); |
} |
} |
+#endif |
+ |
+#if defined(SUPPORT_CAIRO) |
+ if (renderer_init_status_ != o3d::Renderer::SUCCESS) { |
+ // Attempt to fall back to o2d renderer |
+ renderer_ = o3d::Renderer::Create2DRenderer(&service_locator_); |
+ if (renderer_) { |
+ renderer_init_status_ = renderer_->Init(display_window, false); |
+ if (renderer_init_status_ != o3d::Renderer::SUCCESS) { |
+ DeleteRenderer(); |
+ } else { |
+ ClientInfoManager* client_info_manager = |
+ service_locator()->GetService<ClientInfoManager>(); |
+ client_info_manager->SetRender2d(true); |
+ } |
+ } |
+ } |
+#endif |
} |
void PluginObject::DeleteRenderer() { |