summaryrefslogtreecommitdiffstats
path: root/cc/quads
diff options
context:
space:
mode:
authorjbauman <jbauman@chromium.org>2015-07-31 13:12:44 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-31 20:13:24 +0000
commit0e05ec9a0ff13b5096a4aa08758f3c021813a8c8 (patch)
treea48de7b881670d47865ff1d73be5deda03763192 /cc/quads
parenta59ab9210515e9e01aa9201bd57726a8e9bb2963 (diff)
downloadchromium_src-0e05ec9a0ff13b5096a4aa08758f3c021813a8c8.zip
chromium_src-0e05ec9a0ff13b5096a4aa08758f3c021813a8c8.tar.gz
chromium_src-0e05ec9a0ff13b5096a4aa08758f3c021813a8c8.tar.bz2
Avoid destroying webview Surface too early
Suppose a Surface W is referenced by surfaces A, B, and C. There's currently no mechanism to ensure that W will be deleted when all of A, B, and C are. This currently causes problems if a Surface containing an embedded renderer is resized, and then the previous embedded Surface is destroyed. To fix this, allow each surface to keep track of what child surfaces it references. Then whenever those references change or when a surface is destroyed the SurfaceManager can do a GC to remove surfaces that aren't referenced anymore. BUG=510826 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1229053006 Cr-Commit-Position: refs/heads/master@{#341397}
Diffstat (limited to 'cc/quads')
-rw-r--r--cc/quads/render_pass.h5
-rw-r--r--cc/quads/render_pass_unittest.cc3
2 files changed, 8 insertions, 0 deletions
diff --git a/cc/quads/render_pass.h b/cc/quads/render_pass.h
index 8c31d82..14caeba 100644
--- a/cc/quads/render_pass.h
+++ b/cc/quads/render_pass.h
@@ -14,6 +14,7 @@
#include "cc/base/list_container.h"
#include "cc/base/scoped_ptr_vector.h"
#include "cc/quads/render_pass_id.h"
+#include "cc/surfaces/surface_id.h"
#include "skia/ext/refptr.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
@@ -116,6 +117,10 @@ class CC_EXPORT RenderPass {
QuadList quad_list;
SharedQuadStateList shared_quad_state_list;
+ // This vector contains the complete set of SurfaceIds referenced by
+ // DrawQuads in quad_list.
+ std::vector<SurfaceId> referenced_surfaces;
+
protected:
explicit RenderPass(size_t num_layers);
RenderPass();
diff --git a/cc/quads/render_pass_unittest.cc b/cc/quads/render_pass_unittest.cc
index 65183af..5ab8c31 100644
--- a/cc/quads/render_pass_unittest.cc
+++ b/cc/quads/render_pass_unittest.cc
@@ -30,6 +30,7 @@ struct RenderPassSize {
gfx::Rect output_rect;
gfx::Rect damage_rect;
bool has_transparent_background;
+ std::vector<SurfaceId> referenced_surfaces;
ScopedPtrVector<CopyOutputRequest> copy_callbacks;
};
@@ -51,6 +52,7 @@ static void CompareRenderPassLists(const RenderPassList& expected_list,
EXPECT_EQ(expected->shared_quad_state_list.size(),
actual->shared_quad_state_list.size());
EXPECT_EQ(expected->quad_list.size(), actual->quad_list.size());
+ EXPECT_EQ(expected->referenced_surfaces, actual->referenced_surfaces);
for (auto exp_iter = expected->quad_list.cbegin(),
act_iter = actual->quad_list.cbegin();
@@ -104,6 +106,7 @@ TEST(RenderPassTest, CopyShouldBeIdenticalExceptIdAndQuads) {
EXPECT_EQ(pass->damage_rect, copy->damage_rect);
EXPECT_EQ(pass->has_transparent_background, copy->has_transparent_background);
EXPECT_EQ(0u, copy->quad_list.size());
+ EXPECT_EQ(0u, copy->referenced_surfaces.size());
// The copy request should not be copied/duplicated.
EXPECT_EQ(1u, pass->copy_requests.size());