11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CONTENT_BROWSER_COMPOSITOR_BUFFERED_OUTPUT_SURFACE_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CONTENT_BROWSER_COMPOSITOR_BUFFERED_OUTPUT_SURFACE_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <queue> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/content_export.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/rect.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/size.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace cc { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ContextProvider; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Provides a surface that manages its own uffers, backed by 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// CreateImageCHROMIUM. Double/triple buffering is implemented 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// internally. Doublebuffering occurs if PageFlipComplete is called before 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the next BindFramebuffer call, otherwise it creates extra buffers. 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CONTENT_EXPORT BufferQueue { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferQueue(scoped_refptr<cc::ContextProvider> context_provider, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int internalformat); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BufferQueue(); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Initialize(); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void BindFramebuffer(); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SwapBuffers(const gfx::Rect& damage); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void PageFlipComplete(); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Reshape(const gfx::Size& size, float scale_factor); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int current_texture_id() { return current_surface_.texture; } 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class BufferQueueTest; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct AllocatedSurface { 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AllocatedSurface() : texture(0), image(0) {} 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AllocatedSurface(unsigned int texture, 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int image, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& rect) 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : texture(texture), image(image), damage(rect) {} 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int texture; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int image; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect damage; // This is the damage for this frame from the previous. 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void FreeAllSurfaces(); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void FreeSurface(AllocatedSurface* surface); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Copy everything that is in |copy_rect|, except for what is in 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |exclude_rect| from |source_texture| to |texture|. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void CopyBufferDamage(int texture, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int source_texture, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& new_damage, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& old_damage); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void UpdateBufferDamage(const gfx::Rect& damage); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Return a surface, available to be drawn into. 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AllocatedSurface GetNextSurface(); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size size_; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<cc::ContextProvider> context_provider_; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int fbo_; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t allocated_count_; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int internalformat_; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AllocatedSurface current_surface_; // This surface is currently bound. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<AllocatedSurface> available_surfaces_; // These are free for use. 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::deque<AllocatedSurface> in_flight_surfaces_; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BufferQueue); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace content 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CONTENT_BROWSER_COMPOSITOR_BUFFERED_OUTPUT_SURFACE_H_ 87