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
14namespace base {
15  class SharedMemory;
16}
17
18namespace gpu {
19
20class GPU_EXPORT BufferBacking {
21 public:
22  virtual ~BufferBacking() {}
23  virtual void* GetMemory() const = 0;
24  virtual size_t GetSize() const = 0;
25};
26
27class 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;
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.
43class GPU_EXPORT Buffer : public base::RefCountedThreadSafe<Buffer> {
44 public:
45  explicit Buffer(scoped_ptr<BufferBacking> backing);
46
47  BufferBacking* backing() const { return backing_.get(); }
48  void* memory() const { return memory_; }
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
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
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