// Copyright 2014 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_SYNCHRONIZER_H_ #define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ #include "gpu/command_buffer/common/mailbox.h" #include #include #include "base/memory/linked_ptr.h" #include "base/synchronization/lock.h" #include "gpu/command_buffer/service/texture_definition.h" #include "gpu/gpu_export.h" namespace gpu { namespace gles2 { class MailboxManager; class Texture; // A thread-safe proxy that can be used to emulate texture sharing across // share-groups. class MailboxSynchronizer { public: ~MailboxSynchronizer(); GPU_EXPORT static bool Initialize(); GPU_EXPORT static void Terminate(); static MailboxSynchronizer* GetInstance(); // Create a texture from a globally visible mailbox. Texture* CreateTextureFromMailbox(unsigned target, const Mailbox& mailbox); void PushTextureUpdates(MailboxManager* manager); void PullTextureUpdates(MailboxManager* manager); void TextureDeleted(Texture* texture); private: MailboxSynchronizer(); struct TargetName { TargetName(unsigned target, const Mailbox& mailbox); bool operator<(const TargetName& rhs) const { return memcmp(this, &rhs, sizeof(rhs)) < 0; } bool operator!=(const TargetName& rhs) const { return memcmp(this, &rhs, sizeof(rhs)) != 0; } bool operator==(const TargetName& rhs) const { return !operator!=(rhs); } unsigned target; Mailbox mailbox; }; base::Lock lock_; struct TextureGroup { explicit TextureGroup(const TextureDefinition& definition); ~TextureGroup(); TextureDefinition definition; std::set mailboxes; private: DISALLOW_COPY_AND_ASSIGN(TextureGroup); }; struct TextureVersion { explicit TextureVersion(linked_ptr group); ~TextureVersion(); unsigned int version; linked_ptr group; }; typedef std::map TextureMap; TextureMap textures_; linked_ptr GetGroupForMailboxLocked( const TargetName& target_name); void ReassociateMailboxLocked( const TargetName& target_name, TextureGroup* group); void UpdateTextureLocked(Texture* texture, TextureVersion& texture_version); DISALLOW_COPY_AND_ASSIGN(MailboxSynchronizer); }; } // namespage gles2 } // namespace gpu #endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_