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