gpu_memory_buffer_impl.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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:
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(const gfx::GpuMemoryBufferHandle& handle)>
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      AllocationCallback;
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~GpuMemoryBufferImpl();
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Creates a GPU memory buffer instance with |size| and |internalformat| for
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |usage|.
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static scoped_ptr<GpuMemoryBufferImpl> Create(const gfx::Size& size,
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                unsigned internalformat,
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                unsigned usage);
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Allocates a GPU memory buffer with |size| and |internalformat| for |usage|
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // by |child_process|. The |handle| returned can be used by the
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |child_process| to create an instance of this class.
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static void AllocateForChildProcess(const gfx::Size& size,
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      unsigned internalformat,
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      unsigned usage,
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      base::ProcessHandle child_process,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const AllocationCallback& callback);
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Notify that GPU memory buffer has been deleted by |child_process|.
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void DeletedByChildProcess(gfx::GpuMemoryBufferType type,
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const gfx::GpuMemoryBufferId& id,
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    base::ProcessHandle child_process);
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Creates an instance from the given |handle|. |size| and |internalformat|
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // should match what was used to allocate the |handle|.
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static scoped_ptr<GpuMemoryBufferImpl> CreateFromHandle(
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::GpuMemoryBufferHandle& handle,
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const gfx::Size& size,
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      unsigned internalformat);
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns true if |internalformat| is a format recognized by this base class.
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static bool IsFormatValid(unsigned internalformat);
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns true if |usage| is recognized by this base class.
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool IsUsageValid(unsigned usage);
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns the number of bytes per pixel that must be used by an
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // implementation when using |internalformat|.
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static size_t BytesPerPixel(unsigned internalformat);
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Overridden from gfx::GpuMemoryBuffer:
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsMapped() const OVERRIDE;
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GpuMemoryBufferImpl(const gfx::Size& size, unsigned internalformat);
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::Size size_;
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const unsigned internalformat_;
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool mapped_;
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl);
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace content
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_
76