diff options
author | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-25 00:18:47 +0000 |
---|---|---|
committer | gman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-25 00:18:47 +0000 |
commit | 2976fe30ed9e0454b0995456e64a5ef7ae216df8 (patch) | |
tree | 5194cf65778a90b5a277df3d635b8164da39bb50 /o3d/core/cross/client.cc | |
parent | c874da66d375909e04eb2a0aba669b162c41faba (diff) | |
download | chromium_src-2976fe30ed9e0454b0995456e64a5ef7ae216df8.zip chromium_src-2976fe30ed9e0454b0995456e64a5ef7ae216df8.tar.gz chromium_src-2976fe30ed9e0454b0995456e64a5ef7ae216df8.tar.bz2 |
Cleanup Renderer.
I believe there were some mis-understandings
about the code. It's supposed to work
StartRendering();
BeginDraw();
EndDraw();
BeginDraw();
EndDraw();
BeginDraw();
EndDraw();
FinishRendering();
To try to enforce correct usage I separated
some platform dependant stuff from shared
stuff and added a few flags.
Also in this CL I made Texture::GetRenderSurface
not require a pack. This is so I because it feels
cleaner that way but also because I wanted to
use surfaces without a pack to take a screenshot.
Finally I put some screenshot code in for GL.
Also fixed some bugs with locking textures.
1) I thought it was x, y, width, height but it's
actually x1, y1, x2, y2
2) I was using width in places I should have been
using mip_width
Review URL: http://codereview.chromium.org/174199
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24188 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/core/cross/client.cc')
-rw-r--r-- | o3d/core/cross/client.cc | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/o3d/core/cross/client.cc b/o3d/core/cross/client.cc index cfbce23..4e8ebac 100644 --- a/o3d/core/cross/client.cc +++ b/o3d/core/cross/client.cc @@ -79,7 +79,6 @@ Client::Client(ServiceLocator* service_locator) profiler_(service_locator), renderer_(service_locator), evaluation_counter_(service_locator), - rendering_(false), render_tree_called_(false), render_mode_(RENDERMODE_CONTINUOUS), event_manager_(), @@ -225,7 +224,6 @@ void Client::ClearLostResourcesCallback() { void Client::RenderClient(bool send_callback) { ElapsedTimeTimer timer; - rendering_ = true; render_tree_called_ = false; total_time_to_render_ = 0.0f; @@ -247,18 +245,19 @@ void Client::RenderClient(bool send_callback) { if (!rendergraph_root || rendergraph_root->children().empty()) { renderer_->Clear(Float4(0.4f, 0.3f, 0.3f, 1.0f), true, 1.0, true, 0, true); + renderer_->set_need_to_render(false); } else if (rendergraph_root) { RenderTree(rendergraph_root); } } + renderer_->FinishRendering(); + // Call post render callback. profiler_->ProfileStart("Post-render callback"); post_render_callback_manager_.Run(render_event_); profiler_->ProfileStop("Post-render callback"); - renderer_->FinishRendering(); - // Update Render stats. render_event_.set_elapsed_time( render_elapsed_time_timer_.GetElapsedTimeAndReset()); @@ -295,18 +294,25 @@ void Client::RenderClient(bool send_callback) { metric_render_prims_rendered.AddSample(render_event_.primitives_rendered()); #endif // OS_WIN } - - rendering_ = false; } // Executes draw calls for all visible shapes in a subtree void Client::RenderTree(RenderNode *tree_root) { - render_tree_called_ = true; - if (!renderer_.IsAvailable()) return; + if (!renderer_->rendering()) { + // Render tree can not be called if we are not rendering because all calls + // to RenderTree must happen inside renderer->StartRendering() / + // renderer->FinishRendering() calls. + O3D_ERROR(service_locator_) + << "RenderTree must not be called outside of rendering."; + return; + } + + render_tree_called_ = true; + // Only render the shapes if BeginDraw() succeeds profiler_->ProfileStart("RenderTree"); ElapsedTimeTimer time_to_render_timer; @@ -406,13 +412,19 @@ String Client::ToDataURL() { if (!renderer_.IsAvailable()) { O3D_ERROR(service_locator_) << "No Render Device Available"; return dataurl::kEmptyDataURL; + } + + if (renderer_->rendering()) { + O3D_ERROR(service_locator_) + << "Can not take a screenshot while rendering"; + return dataurl::kEmptyDataURL; + } + + Bitmap::Ref bitmap(renderer_->TakeScreenshot()); + if (bitmap.IsNull()) { + return dataurl::kEmptyDataURL; } else { - Bitmap::Ref bitmap(renderer_->TakeScreenshot()); - if (bitmap.IsNull()) { - return dataurl::kEmptyDataURL; - } else { - return bitmap->ToDataURL(); - } + return bitmap->ToDataURL(); } } |