1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ 6 #define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ 7 8 #include "gpu/command_buffer/common/mailbox.h" 9 10 #include <map> 11 #include <set> 12 13 #include "base/memory/linked_ptr.h" 14 #include "base/synchronization/lock.h" 15 #include "gpu/command_buffer/service/texture_definition.h" 16 #include "gpu/gpu_export.h" 17 18 namespace gpu { 19 namespace gles2 { 20 21 class MailboxManager; 22 class Texture; 23 24 // A thread-safe proxy that can be used to emulate texture sharing across 25 // share-groups. 26 class MailboxSynchronizer { 27 public: 28 ~MailboxSynchronizer(); 29 30 GPU_EXPORT static bool Initialize(); 31 GPU_EXPORT static void Terminate(); 32 static MailboxSynchronizer* GetInstance(); 33 34 // Create a texture from a globally visible mailbox. 35 Texture* CreateTextureFromMailbox(unsigned target, const Mailbox& mailbox); 36 37 void PushTextureUpdates(MailboxManager* manager); 38 void PullTextureUpdates(MailboxManager* manager); 39 40 void TextureDeleted(Texture* texture); 41 42 private: 43 MailboxSynchronizer(); 44 45 struct TargetName { 46 TargetName(unsigned target, const Mailbox& mailbox); 47 bool operator<(const TargetName& rhs) const { 48 return memcmp(this, &rhs, sizeof(rhs)) < 0; 49 } 50 bool operator!=(const TargetName& rhs) const { 51 return memcmp(this, &rhs, sizeof(rhs)) != 0; 52 } 53 bool operator==(const TargetName& rhs) const { 54 return !operator!=(rhs); 55 } 56 unsigned target; 57 Mailbox mailbox; 58 }; 59 60 base::Lock lock_; 61 62 struct TextureGroup { 63 explicit TextureGroup(const TextureDefinition& definition); 64 ~TextureGroup(); 65 66 TextureDefinition definition; 67 std::set<TargetName> mailboxes; 68 private: 69 DISALLOW_COPY_AND_ASSIGN(TextureGroup); 70 }; 71 72 struct TextureVersion { 73 explicit TextureVersion(linked_ptr<TextureGroup> group); 74 ~TextureVersion(); 75 76 unsigned int version; 77 linked_ptr<TextureGroup> group; 78 }; 79 typedef std::map<Texture*, TextureVersion> TextureMap; 80 TextureMap textures_; 81 82 linked_ptr<TextureGroup> GetGroupForMailboxLocked( 83 const TargetName& target_name); 84 void ReassociateMailboxLocked( 85 const TargetName& target_name, 86 TextureGroup* group); 87 void UpdateTextureLocked(Texture* texture, TextureVersion& texture_version); 88 89 DISALLOW_COPY_AND_ASSIGN(MailboxSynchronizer); 90 }; 91 92 } // namespage gles2 93 } // namespace gpu 94 95 #endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ 96 97