// Copyright (c) 2012 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_MAILBOX_MANAGER_H_ #define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ #include <functional> #include <map> #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "gpu/command_buffer/common/constants.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/gpu_export.h" typedef signed char GLbyte; namespace gpu { namespace gles2 { class MailboxSynchronizer; class Texture; class TextureManager; // Manages resources scoped beyond the context or context group level. class GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { public: MailboxManager(); // Look up the texture definition from the named mailbox. Texture* ConsumeTexture(unsigned target, const Mailbox& mailbox); // Put the texture into the named mailbox. void ProduceTexture(unsigned target, const Mailbox& mailbox, Texture* texture); // Returns whether this manager synchronizes with other instances. bool UsesSync() { return sync_ != NULL; } // Used with the MailboxSynchronizer to push/pull texture state to/from // other manager instances. void PushTextureUpdates(); void PullTextureUpdates(); // Destroy any mailbox that reference the given texture. void TextureDeleted(Texture* texture); private: friend class base::RefCounted<MailboxManager>; friend class MailboxSynchronizer; ~MailboxManager(); struct TargetName { TargetName(unsigned target, const Mailbox& mailbox); unsigned target; Mailbox mailbox; }; void InsertTexture(TargetName target_name, Texture* texture); static bool TargetNameLess(const TargetName& lhs, const TargetName& rhs); // This is a bidirectional map between mailbox and textures. We can have // multiple mailboxes per texture, but one texture per mailbox. We keep an // iterator in the MailboxToTextureMap to be able to manage changes to // the TextureToMailboxMap efficiently. typedef std::multimap<Texture*, TargetName> TextureToMailboxMap; typedef std::map<TargetName, TextureToMailboxMap::iterator, std::pointer_to_binary_function<const TargetName&, const TargetName&, bool> > MailboxToTextureMap; MailboxToTextureMap mailbox_to_textures_; TextureToMailboxMap textures_to_mailboxes_; MailboxSynchronizer* sync_; DISALLOW_COPY_AND_ASSIGN(MailboxManager); }; } // namespage gles2 } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_