// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_ #define GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_ #include #include "base/basictypes.h" #include "base/logging.h" #include "base/ref_counted.h" #include "base/scoped_ptr.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/renderbuffer_manager.h" namespace gpu { namespace gles2 { // This class keeps track of the frambebuffers and their attached renderbuffers // so we can correctly clear them. class FramebufferManager { public: // Info about Framebuffers currently in the system. class FramebufferInfo : public base::RefCounted { public: typedef scoped_refptr Ref; explicit FramebufferInfo(GLuint framebuffer_id) : framebuffer_id_(framebuffer_id) { } GLuint framebuffer_id() const { return framebuffer_id_; } // Attaches a renderbuffer to a particlar attachment. // Pass null to detach. void AttachRenderbuffer( GLenum attachment, RenderbufferManager::RenderbufferInfo* renderbuffer); bool IsDeleted() { return framebuffer_id_ == 0; } private: friend class FramebufferManager; friend class base::RefCounted; ~FramebufferInfo() { } void MarkAsDeleted() { framebuffer_id_ = 0; renderbuffers_.clear(); } // Service side framebuffer id. GLuint framebuffer_id_; // A map of attachments to renderbuffers. typedef std::map AttachmentToRenderbufferMap; AttachmentToRenderbufferMap renderbuffers_; }; FramebufferManager() { } // Creates a FramebufferInfo for the given framebuffer. void CreateFramebufferInfo(GLuint framebuffer_id); // Gets the framebuffer info for the given framebuffer. FramebufferInfo* GetFramebufferInfo(GLuint framebuffer_id); // Removes a framebuffer info for the given framebuffer. void RemoveFramebufferInfo(GLuint framebuffer_id); private: // Info for each framebuffer in the system. // TODO(gman): Choose a faster container. typedef std::map FramebufferInfoMap; FramebufferInfoMap framebuffer_infos_; DISALLOW_COPY_AND_ASSIGN(FramebufferManager); }; } // namespace gles2 } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_FRAMEBUFFER_MANAGER_H_