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_MAILBOX_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h" 1410fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org#include "gpu/command_buffer/common/mailbox.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From gl2/gl2ext.h. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GL_MAILBOX_SIZE_CHROMIUM 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_MAILBOX_SIZE_CHROMIUM 64 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed char GLbyte; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.orgclass MailboxSynchronizer; 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Texture; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextureManager; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages resources scoped beyond the context or context group level. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MailboxManager(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3610fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org // Generate a unique unguessable mailbox name. 3710fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org void GenerateMailbox(Mailbox* mailbox); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Look up the texture definition from the named mailbox. 4010fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org Texture* ConsumeTexture(unsigned target, const Mailbox& mailbox); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Put the texture into the named mailbox. 4310fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org void ProduceTexture(unsigned target, 4410fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org const Mailbox& mailbox, 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Texture* texture); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org // Returns whether this manager synchronizes with other instances. 48871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org bool UsesSync() { return sync_ != NULL; } 49871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org 50871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org // Used with the MailboxSynchronizer to push/pull texture state to/from 51871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org // other manager instances. 52871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org void PushTextureUpdates(); 53871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org void PullTextureUpdates(); 54871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Destroy any mailbox that reference the given texture. 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void TextureDeleted(Texture* texture); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<MailboxManager>; 60871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org friend class MailboxSynchronizer; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MailboxManager(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TargetName { 6510fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org TargetName(unsigned target, const Mailbox& mailbox); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned target; 6710fa3987b403dcc25174693e4947dd4cd8b8612epiman@chromium.org Mailbox mailbox; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 69871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org void InsertTexture(TargetName target_name, Texture* texture); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool TargetNameLess(const TargetName& lhs, const TargetName& rhs); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This is a bidirectional map between mailbox and textures. We can have 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // multiple mailboxes per texture, but one texture per mailbox. We keep an 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // iterator in the MailboxToTextureMap to be able to manage changes to 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the TextureToMailboxMap efficiently. 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef std::multimap<Texture*, TargetName> TextureToMailboxMap; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map< 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TargetName, 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TextureToMailboxMap::iterator, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pointer_to_binary_function< 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const TargetName&, const TargetName&, bool> > MailboxToTextureMap; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MailboxToTextureMap mailbox_to_textures_; 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TextureToMailboxMap textures_to_mailboxes_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org MailboxSynchronizer* sync_; 88871ad5406650fa38062582bc125fffcd2f6d5159sievers@chromium.org 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MailboxManager); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespage gles2 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97