framebuffer_manager.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FramebufferManager;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Renderbuffer;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderbufferManager;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Texture;
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TextureRef;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureManager;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about a particular Framebuffer.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Attachment : public base::RefCounted<Attachment> {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual GLsizei width() const = 0;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual GLsizei height() const = 0;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual GLenum internal_format() const = 0;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual GLsizei samples() const = 0;
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual GLuint object_name() const = 0;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool cleared() const = 0;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetCleared(
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderbufferManager* renderbuffer_manager,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TextureManager* texture_manager,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool cleared) = 0;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual bool IsTexture(TextureRef* texture) const = 0;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool IsRenderbuffer(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Renderbuffer* renderbuffer) const = 0;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool CanRenderTo() const = 0;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DetachFromFramebuffer() const = 0;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool ValidForAttachmentType(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GLenum attachment_type, uint32 max_color_attachments) = 0;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AddToSignature(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TextureManager* texture_manager, std::string* signature) const = 0;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   protected:
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class base::RefCounted<Attachment>;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Attachment() {}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer(FramebufferManager* manager, GLuint service_id);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id() const {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return service_id_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasUnclearedAttachment(GLenum attachment) const;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAttachmentAsCleared(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderbufferManager* renderbuffer_manager,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TextureManager* texture_manager,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum attachment,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool cleared);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Attaches a renderbuffer to a particlar attachment.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pass null to detach.
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttachRenderbuffer(
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum attachment, Renderbuffer* renderbuffer);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Attaches a texture to a particlar attachment. Pass null to detach.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttachTexture(
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GLenum attachment, TextureRef* texture_ref, GLenum target,
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GLint level, GLsizei samples);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unbinds the given renderbuffer if it is bound.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnbindRenderbuffer(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target, Renderbuffer* renderbuffer);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unbinds the given texture if it is bound.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnbindTexture(
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GLenum target, TextureRef* texture_ref);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Attachment* GetAttachment(GLenum attachment) const;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsDeleted() const {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return deleted_;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsValid() {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    has_been_bound_ = true;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsValid() const {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_been_bound_ && !IsDeleted();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasDepthAttachment() const;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HasStencilAttachment() const;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum GetColorAttachmentFormat() const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify all the rules in OpenGL ES 2.0.25 4.4.5 are followed.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns GL_FRAMEBUFFER_COMPLETE if there are no reasons we know we can't
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use this combination of attachments. Otherwise returns the value
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that glCheckFramebufferStatus should return for this set of attachments.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that receiving GL_FRAMEBUFFER_COMPLETE from this function does
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not mean the real OpenGL will consider it framebuffer complete. It just
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // means it passed our tests.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum IsPossiblyComplete() const;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Implements optimized glGetFramebufferStatus.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum GetStatus(TextureManager* texture_manager, GLenum target) const;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check all attachments are cleared
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsCleared() const;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum GetDrawBuffer(GLenum draw_buffer) const;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDrawBuffers(GLsizei n, const GLenum* bufs);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Return true if any draw buffers has an alpha channel.
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool HasAlphaMRT() const;
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ClearFramebufferCompleteComboMap();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool AllowFramebufferComboCompleteMapForTesting() {
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return allow_framebuffer_combo_complete_map_;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class FramebufferManager;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCounted<Framebuffer>;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~Framebuffer();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsDeleted();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAttachmentsAsCleared(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderbufferManager* renderbuffer_manager,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TextureManager* texture_manager,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool cleared);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsComplete(unsigned state_id) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    framebuffer_complete_state_count_id_ = state_id;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned framebuffer_complete_state_count_id() const {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return framebuffer_complete_state_count_id_;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The managers that owns this.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FramebufferManager* manager_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool deleted_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Service side framebuffer id.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this framebuffer has ever been bound.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_been_bound_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // state count when this framebuffer was last checked for completeness.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned framebuffer_complete_state_count_id_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A map of attachments.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<GLenum, scoped_refptr<Attachment> > AttachmentMap;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AttachmentMap attachments_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A map of successful frame buffer combos. If it's in the map
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it should be FRAMEBUFFER_COMPLETE.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<std::string, bool> FramebufferComboCompleteMap;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static FramebufferComboCompleteMap* framebuffer_combo_complete_map_;
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool allow_framebuffer_combo_complete_map_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<GLenum[]> draw_buffers_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Framebuffer);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct DecoderFramebufferState {
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DecoderFramebufferState();
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~DecoderFramebufferState();
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // State saved for clearing so we can clear render buffers and then
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // restore to these values.
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool clear_state_dirty;
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The currently bound framebuffers
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<Framebuffer> bound_read_framebuffer;
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<Framebuffer> bound_draw_framebuffer;
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the frambebuffers and their attached renderbuffers
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can correctly clear them.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT FramebufferManager {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FramebufferManager(uint32 max_draw_buffers, uint32 max_color_attachments);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FramebufferManager();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a Framebuffer for the given framebuffer.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateFramebuffer(GLuint client_id, GLuint service_id);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the framebuffer info for the given framebuffer.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer* GetFramebuffer(GLuint client_id);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a framebuffer info for the given framebuffer.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveFramebuffer(GLuint client_id);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a client id for a given service id.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetClientId(GLuint service_id, GLuint* client_id) const;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkAttachmentsAsCleared(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Framebuffer* framebuffer,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderbufferManager* renderbuffer_manager,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TextureManager* texture_manager);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsComplete(Framebuffer* framebuffer);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsComplete(Framebuffer* framebuffer);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncFramebufferStateChangeCount() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // make sure this is never 0.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    framebuffer_state_change_count_ =
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (framebuffer_state_change_count_ + 1) | 0x80000000U;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class Framebuffer;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartTracking(Framebuffer* framebuffer);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopTracking(Framebuffer* framebuffer);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each framebuffer in the system.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<Framebuffer> >
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FramebufferMap;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FramebufferMap framebuffers_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Incremented anytime anything changes that might effect framebuffer
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned framebuffer_state_change_count_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Counts the number of Framebuffer allocated with 'this' as its manager.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows to check no Framebuffer will outlive this.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned int framebuffer_count_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_draw_buffers_;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_color_attachments_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FramebufferManager);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
264