11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/size.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content {
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Provides common implementation of a GPU memory buffer.
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer {
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef base::Callback<void(scoped_ptr<GpuMemoryBufferImpl> buffer)>
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CreationCallback;
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(const gfx::GpuMemoryBufferHandle& handle)>
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      AllocationCallback;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef base::Closure DestructionCallback;
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~GpuMemoryBufferImpl();
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Creates a GPU memory buffer instance with |size| and |internalformat| for
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |usage| by the current process and |client_id|.
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void Create(const gfx::Size& size,
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     unsigned internalformat,
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     unsigned usage,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     int client_id,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const CreationCallback& callback);
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Allocates a GPU memory buffer with |size| and |internalformat| for |usage|
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // by |child_process| and |child_client_id|. The |handle| returned can be
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // used by the |child_process| to create an instance of this class.
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static void AllocateForChildProcess(const gfx::Size& size,
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      unsigned internalformat,
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      unsigned usage,
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      base::ProcessHandle child_process,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      int child_client_id,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const AllocationCallback& callback);
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Notify that GPU memory buffer has been deleted by |child_process|.
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void DeletedByChildProcess(gfx::GpuMemoryBufferType type,
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const gfx::GpuMemoryBufferId& id,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    base::ProcessHandle child_process);
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Creates an instance from the given |handle|. |size| and |internalformat|
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // should match what was used to allocate the |handle|. |callback| is
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // called when instance is deleted, which is not necessarily on the same
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // thread as this function was called on and instance was created on.
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static scoped_ptr<GpuMemoryBufferImpl> CreateFromHandle(
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::GpuMemoryBufferHandle& handle,
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const gfx::Size& size,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      unsigned internalformat,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const DestructionCallback& callback);
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns true if |internalformat| is a format recognized by this base class.
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static bool IsFormatValid(unsigned internalformat);
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns true if |usage| is recognized by this base class.
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool IsUsageValid(unsigned usage);
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns the number of bytes per pixel that must be used by an
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // implementation when using |internalformat|.
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static size_t BytesPerPixel(unsigned internalformat);
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Overridden from gfx::GpuMemoryBuffer:
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsMapped() const OVERRIDE;
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuMemoryBufferImpl(const gfx::Size& size,
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      unsigned internalformat,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const DestructionCallback& callback);
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::Size size_;
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const unsigned internalformat_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const DestructionCallback callback_;
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool mapped_;
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl);
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace content
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
88