• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef GPU_COMMAND_BUFFER_COMMON_BUFFER_H_
6 #define GPU_COMMAND_BUFFER_COMMON_BUFFER_H_
7 
8 #include "base/macros.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/shared_memory.h"
12 #include "gpu/gpu_export.h"
13 
14 namespace base {
15   class SharedMemory;
16 }
17 
18 namespace gpu {
19 
20 class GPU_EXPORT BufferBacking {
21  public:
~BufferBacking()22   virtual ~BufferBacking() {}
23   virtual void* GetMemory() const = 0;
24   virtual size_t GetSize() const = 0;
25 };
26 
27 class GPU_EXPORT SharedMemoryBufferBacking : public BufferBacking {
28  public:
29   SharedMemoryBufferBacking(scoped_ptr<base::SharedMemory> shared_memory,
30                             size_t size);
31   virtual ~SharedMemoryBufferBacking();
32   virtual void* GetMemory() const OVERRIDE;
33   virtual size_t GetSize() const OVERRIDE;
shared_memory()34   base::SharedMemory* shared_memory() { return shared_memory_.get(); }
35 
36  private:
37   scoped_ptr<base::SharedMemory> shared_memory_;
38   size_t size_;
39   DISALLOW_COPY_AND_ASSIGN(SharedMemoryBufferBacking);
40 };
41 
42 // Buffer owns a piece of shared-memory of a certain size.
43 class GPU_EXPORT Buffer : public base::RefCountedThreadSafe<Buffer> {
44  public:
45   explicit Buffer(scoped_ptr<BufferBacking> backing);
46 
backing()47   BufferBacking* backing() const { return backing_.get(); }
memory()48   void* memory() const { return memory_; }
size()49   size_t size() const { return size_; }
50 
51   // Returns NULL if the address overflows the memory.
52   void* GetDataAddress(uint32 data_offset, uint32 data_size) const;
53 
54  private:
55   friend class base::RefCountedThreadSafe<Buffer>;
56   ~Buffer();
57 
58   scoped_ptr<BufferBacking> backing_;
59   void* memory_;
60   size_t size_;
61 
62   DISALLOW_COPY_AND_ASSIGN(Buffer);
63 };
64 
MakeBackingFromSharedMemory(scoped_ptr<base::SharedMemory> shared_memory,size_t size)65 static inline scoped_ptr<BufferBacking> MakeBackingFromSharedMemory(
66     scoped_ptr<base::SharedMemory> shared_memory,
67     size_t size) {
68   return scoped_ptr<BufferBacking>(
69       new SharedMemoryBufferBacking(shared_memory.Pass(), size));
70 }
71 
MakeBufferFromSharedMemory(scoped_ptr<base::SharedMemory> shared_memory,size_t size)72 static inline scoped_refptr<Buffer> MakeBufferFromSharedMemory(
73     scoped_ptr<base::SharedMemory> shared_memory,
74     size_t size) {
75   return new Buffer(MakeBackingFromSharedMemory(shared_memory.Pass(), size));
76 }
77 
78 }  // namespace gpu
79 
80 #endif  // GPU_COMMAND_BUFFER_COMMON_BUFFER_H_
81