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

Unified Diff: content/browser/compositor/software_output_device_mac.h

Issue 2866683003: Use more than double buffering in SoftwareOutputDeviceMac (Closed)
Patch Set: Created 3 years, 7 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: content/browser/compositor/software_output_device_mac.h
diff --git a/content/browser/compositor/software_output_device_mac.h b/content/browser/compositor/software_output_device_mac.h
index 77c61fcd7e5ff5bf3e81251a25b4c123d453514c..8548d16d3c6b353d59e06a7b22741b5a8235c883 100644
--- a/content/browser/compositor/software_output_device_mac.h
+++ b/content/browser/compositor/software_output_device_mac.h
@@ -42,27 +42,35 @@ class SoftwareOutputDeviceMac :
const gfx::VSyncProvider::UpdateVSyncCallback& callback) override;
private:
- bool EnsureBuffersExist();
-
- // Copy the pixels from the previous buffer to the new buffer.
- void CopyPreviousBufferDamage(const SkRegion& new_damage_rect);
-
- ui::Compositor* compositor_;
+ //
+ struct Buffer {
+ Buffer();
+ ~Buffer();
+ base::ScopedCFTypeRef<IOSurfaceRef> io_surface;
+ // The damage of all BeginPaints since this buffer was the back buffer.
+ SkRegion accumulated_damage;
+ };
+
+ // Copy the pixels from the previous buffer to the new buffer, and union
+ // |new_damage_rect| into all |buffer_queue_|'s accumulated damages.
+ void UpdateAndCopyBufferDamage(Buffer* previous_paint_buffer,
+ const SkRegion& new_damage_rect);
+
+ ui::Compositor* compositor_ = nullptr;
gfx::Size pixel_size_;
- float scale_factor_;
+ float scale_factor_ = 1;
// This surface is double-buffered. The two buffers are in |io_surfaces_|,
jbauman 2017/05/05 19:19:25 Fix comment.
ccameron 2017/05/05 22:06:08 Done.
// and the index of the current buffer is |current_buffer_|.
- base::ScopedCFTypeRef<IOSurfaceRef> io_surfaces_[2];
- int current_index_;
+ std::list<std::unique_ptr<Buffer>> buffer_queue_;
- // The previous frame's damage rectangle. Used to copy unchanged content
- // between buffers in CopyPreviousBufferDamage.
- SkRegion previous_buffer_damage_region_;
+ // A pointer to the last element of |buffer_queue_| during paint. It is only
+ // valid between BeginPaint and EndPaint.
+ Buffer* current_paint_buffer_ = nullptr;
- // The SkCanvas wrapps the mapped current IOSurface. It is valid only between
- // BeginPaint and EndPaint.
- std::unique_ptr<SkCanvas> canvas_;
+ // The SkCanvas wraps the mapped |current_paint_buffer_|'s IOSurface. It is
+ // valid only between BeginPaint and EndPaint.
+ std::unique_ptr<SkCanvas> current_paint_canvas_ = nullptr;
gfx::VSyncProvider::UpdateVSyncCallback update_vsync_callback_;

Powered by Google App Engine
This is Rietveld 408576698