mailbox_manager.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Use of this source code is governed by a BSD-style license that can be 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// found in the LICENSE file. 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#ifndef GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <functional> 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <map> 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "base/memory/linked_ptr.h" 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "base/memory/ref_counted.h" 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "crypto/hmac.h" 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "gpu/command_buffer/common/constants.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "gpu/gpu_export.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 17af8fa25c0d4e0540952a50bbd06dc1558954ccd9Ted Kremenek// From gl2/gl2ext.h. 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef GL_MAILBOX_SIZE_CHROMIUM 199c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek#define GL_MAILBOX_SIZE_CHROMIUM 64 20eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner#endif 215d75de0f821023f4ed4815825bf3aea8a0b5e40dChris Lattner 226137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenektypedef signed char GLbyte; 231b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner 24d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramernamespace gpu { 25c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattnernamespace gles2 { 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 27cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattnerclass TextureDefinition; 284f32786ac45210143654390177105eb749b614e9Ted Kremenekclass TextureManager; 290827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 30caaa7df2c78bbd40197823034c0275f3dcbd63e7Ted Kremenek// Identifies a mailbox where a texture definition can be stored for 31f4d5eb4866a27d497f0bb75b12c2ffd48ad4d9c0Benjamin Kramer// transferring textures between contexts that are not in the same context 325b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis// group. It is a random key signed with a hash of a private key. 330ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenekstruct MailboxName { 342e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor GLbyte key[GL_MAILBOX_SIZE_CHROMIUM / 2]; 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer GLbyte signature[GL_MAILBOX_SIZE_CHROMIUM / 2]; 368fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer}; 378fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer 388fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer// Manages resources scoped beyond the context or context group level. 398fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramerclass GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MailboxManager(); 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor // Generate a unique mailbox name signed with the manager's private key. 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void GenerateMailboxName(MailboxName* name); 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Remove the texture definition from the named mailbox and empty the mailbox. 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TextureDefinition* ConsumeTexture(unsigned target, const MailboxName& name); 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 492e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor // Put the texture definition in the named mailbox. 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool ProduceTexture(unsigned target, 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const MailboxName& name, 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TextureDefinition* definition, 53f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor TextureManager* owner); 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5594dc8f640ebea52241412512ed48601626edbc58Douglas Gregor // Destroy any texture definitions and mailboxes owned by the given texture 566aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor // manager. 57ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie void DestroyOwnedTextures(TextureManager* owner, bool have_context); 58e5956bd2730c051835f9acd9e957c5d79f99e7c3Chris Lattner 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::string private_key() { 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return std::string(private_key_, sizeof(private_key_)); 6158bf98725b6d4588338e191d2ab981b104471dabJames Dennett } 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 63c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith private: 64d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer friend class base::RefCounted<MailboxManager>; 654e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie 66998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor ~MailboxManager(); 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void SignMailboxName(MailboxName* name); 695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsMailboxNameValid(const MailboxName& name); 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 716aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor struct TargetName { 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TargetName(unsigned target, const MailboxName& name); 7388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor unsigned target; 7488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor MailboxName name; 75a5d10c4df435964600e104ebef6a96b106e416b7Kovarththanan Rajaratnam }; 76ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 776137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek static bool TargetNameLess(const TargetName& lhs, const TargetName& rhs); 786137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek 796f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith struct OwnedTextureDefinition { 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwnedTextureDefinition(TextureDefinition* definition, 810ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek TextureManager* owner); 820ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek ~OwnedTextureDefinition(); 830ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek linked_ptr<TextureDefinition> definition; 841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TextureManager* owner; 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer typedef std::map< 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TargetName, 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OwnedTextureDefinition, 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::pointer_to_binary_function< 91c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner const TargetName&, const TargetName&, bool> > TextureDefinitionMap; 921ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall 931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall char private_key_[GL_MAILBOX_SIZE_CHROMIUM / 2]; 94148772a841cae6f32db16d890e788b92a763bb3fChris Lattner crypto::HMAC hmac_; 95c1b5fa41f09512c74030b9a2a0d1564535e22a76Peter Collingbourne TextureDefinitionMap textures_; 96148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 97cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson DISALLOW_COPY_AND_ASSIGN(MailboxManager); 9892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson}; 9992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} // namespage gles2 100d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenek} // namespace gpu 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ 103c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer