framebuffer_manager.h revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the frambebuffers and their attached renderbuffers
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can correctly clear them.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT FramebufferManager {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FramebufferManager(uint32 max_draw_buffers, uint32 max_color_attachments);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FramebufferManager();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a Framebuffer for the given framebuffer.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateFramebuffer(GLuint client_id, GLuint service_id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the framebuffer info for the given framebuffer.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer* GetFramebuffer(GLuint client_id);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a framebuffer info for the given framebuffer.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveFramebuffer(GLuint client_id);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a client id for a given service id.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetClientId(GLuint service_id, GLuint* client_id) const;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkAttachmentsAsCleared(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Framebuffer* framebuffer,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderbufferManager* renderbuffer_manager,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TextureManager* texture_manager);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkAsComplete(Framebuffer* framebuffer);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsComplete(Framebuffer* framebuffer);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncFramebufferStateChangeCount() {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // make sure this is never 0.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    framebuffer_state_change_count_ =
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (framebuffer_state_change_count_ + 1) | 0x80000000U;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class Framebuffer;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartTracking(Framebuffer* framebuffer);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopTracking(Framebuffer* framebuffer);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each framebuffer in the system.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<Framebuffer> >
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FramebufferMap;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FramebufferMap framebuffers_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Incremented anytime anything changes that might effect framebuffer
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned framebuffer_state_change_count_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Counts the number of Framebuffer allocated with 'this' as its manager.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows to check no Framebuffer will outlive this.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned int framebuffer_count_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_draw_buffers_;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_color_attachments_;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FramebufferManager);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_
251