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)65static 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)72static 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