Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Unified Diff: cc/surfaces/surface.cc

Issue 2831213004: cc: Reject CompositorFrames to old child surfaces (Closed)
Patch Set: Address Dana's comment Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/surfaces/surface.cc
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc
index 2ceae59329081c2295c5aadac3d04fb171d0742e..68c820d8b054989ee55dd287e943a277e94e43df 100644
--- a/cc/surfaces/surface.cc
+++ b/cc/surfaces/surface.cc
@@ -15,7 +15,9 @@
#include "cc/surfaces/local_surface_id_allocator.h"
#include "cc/surfaces/pending_frame_observer.h"
#include "cc/surfaces/surface_factory.h"
+#include "cc/surfaces/surface_factory_client.h"
#include "cc/surfaces/surface_manager.h"
+#include "cc/surfaces/surface_resource_holder_client.h"
namespace cc {
@@ -50,9 +52,23 @@ void Surface::SetPreviousFrameSurface(Surface* surface) {
surface->TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info);
}
+void Surface::Close() {
+ closed_ = true;
+}
+
void Surface::QueueFrame(CompositorFrame frame,
const DrawCallback& callback,
const WillDrawCallback& will_draw_callback) {
+ if (closed_) {
+ if (factory_ && factory_->resource_holder_client()) {
+ ReturnedResourceArray resources;
+ TransferableResource::ReturnResources(frame.resource_list, &resources);
+ factory_->resource_holder_client()->ReturnResources(resources);
+ }
+ callback.Run();
+ return;
+ }
+
TakeLatencyInfoFromPendingFrame(&frame.metadata.latency_info);
base::Optional<FrameData> previous_pending_frame_data =
@@ -68,6 +84,23 @@ void Surface::QueueFrame(CompositorFrame frame,
bool is_pending_frame = !blocking_surfaces_.empty();
if (is_pending_frame) {
+ // Reject CompositorFrames to surfaces referenced from CompositorFrame while
danakj 2017/05/04 21:39:13 CompositorFrame is a type, you're using it in this
Fady Samuel 2017/05/04 22:44:04 I'm not sure what you mean. I do agree this is con
+ // it is blocked. This saves some CPU cycles to allow children to catch up
+ // to this surface's client.
+ base::flat_set<FrameSinkId> embedded_frame_sink_ids;
+ for (const SurfaceId& surface_id : frame.metadata.embedded_surfaces)
+ embedded_frame_sink_ids.insert(surface_id.frame_sink_id());
+ for (const SurfaceId& surface_id : frame.metadata.referenced_surfaces) {
+ // If this surface is a fallback surface, then we close the fallback to
+ // accepting new frames.
+ bool is_fallback_surface =
+ embedded_frame_sink_ids.count(surface_id.frame_sink_id()) > 0;
danakj 2017/05/04 21:39:13 Didnt ur other CL just make it not possible to be
Fady Samuel 2017/05/04 22:44:04 I'm comparing FrameSinkIds not SurfaceIds. Basica
+ if (is_fallback_surface) {
+ Surface* surface = factory_->manager()->GetSurfaceForId(surface_id);
+ DCHECK(surface);
+ surface->Close();
+ }
+ }
pending_frame_data_ =
FrameData(std::move(frame), callback, will_draw_callback);
// Ask the surface manager to inform |this| when its dependencies are

Powered by Google App Engine
This is Rietveld 408576698