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