summaryrefslogtreecommitdiffstats
path: root/o3d/core/cross/client.cc
diff options
context:
space:
mode:
authorgman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-25 00:18:47 +0000
committergman@google.com <gman@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-25 00:18:47 +0000
commit2976fe30ed9e0454b0995456e64a5ef7ae216df8 (patch)
tree5194cf65778a90b5a277df3d635b8164da39bb50 /o3d/core/cross/client.cc
parentc874da66d375909e04eb2a0aba669b162c41faba (diff)
downloadchromium_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.cc40
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();
}
}