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 <stddef.h>
9 #include <stdint.h>
10 
11 #include <memory>
12 
13 #include "base/macros.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/unsafe_shared_memory_region.h"
16 #include "base/trace_event/memory_allocator_dump.h"
17 #include "gpu/gpu_export.h"
18 
19 namespace gpu {
20 
21 class GPU_EXPORT BufferBacking {
22  public:
23   virtual ~BufferBacking() = default;
24   virtual const base::UnsafeSharedMemoryRegion& shared_memory_region() const;
25   virtual base::UnguessableToken GetGUID() const;
26   virtual void* GetMemory() const = 0;
27   virtual uint32_t GetSize() const = 0;
28 };
29 
30 class GPU_EXPORT MemoryBufferBacking : public BufferBacking {
31  public:
32   explicit MemoryBufferBacking(uint32_t size);
33   ~MemoryBufferBacking() override;
34   void* GetMemory() const override;
35   uint32_t GetSize() const override;
36 
37  private:
38   std::unique_ptr<char[]> memory_;
39   uint32_t size_;
40   DISALLOW_COPY_AND_ASSIGN(MemoryBufferBacking);
41 };
42 
43 
44 class GPU_EXPORT SharedMemoryBufferBacking : public BufferBacking {
45  public:
46   SharedMemoryBufferBacking(
47       base::UnsafeSharedMemoryRegion shared_memory_region,
48       base::WritableSharedMemoryMapping shared_memory_mapping);
49   ~SharedMemoryBufferBacking() override;
50   const base::UnsafeSharedMemoryRegion& shared_memory_region() const override;
51   base::UnguessableToken GetGUID() const override;
52   void* GetMemory() const override;
53   uint32_t GetSize() const override;
54 
55  private:
56   base::UnsafeSharedMemoryRegion shared_memory_region_;
57   base::WritableSharedMemoryMapping shared_memory_mapping_;
58   DISALLOW_COPY_AND_ASSIGN(SharedMemoryBufferBacking);
59 };
60 
61 // Buffer owns a piece of shared-memory of a certain size.
62 class GPU_EXPORT Buffer : public base::RefCountedThreadSafe<Buffer> {
63  public:
64   explicit Buffer(std::unique_ptr<BufferBacking> backing);
65 
backing()66   BufferBacking* backing() const { return backing_.get(); }
memory()67   void* memory() const { return memory_; }
size()68   uint32_t size() const { return size_; }
69 
70   // Returns nullptr if the address overflows the memory.
71   void* GetDataAddress(uint32_t data_offset, uint32_t data_size) const;
72 
73   // Returns nullptr if the address overflows the memory.
74   void* GetDataAddressAndSize(uint32_t data_offset, uint32_t* data_size) const;
75 
76   // Returns the remaining size of the buffer after an offset
77   uint32_t GetRemainingSize(uint32_t data_offset) const;
78 
79  private:
80   friend class base::RefCountedThreadSafe<Buffer>;
81   ~Buffer();
82 
83   std::unique_ptr<BufferBacking> backing_;
84   void* memory_;
85   uint32_t size_;
86 
87   DISALLOW_COPY_AND_ASSIGN(Buffer);
88 };
89 
MakeBackingFromSharedMemory(base::UnsafeSharedMemoryRegion shared_memory_region,base::WritableSharedMemoryMapping shared_memory_mapping)90 static inline std::unique_ptr<BufferBacking> MakeBackingFromSharedMemory(
91     base::UnsafeSharedMemoryRegion shared_memory_region,
92     base::WritableSharedMemoryMapping shared_memory_mapping) {
93   return std::make_unique<SharedMemoryBufferBacking>(
94       std::move(shared_memory_region), std::move(shared_memory_mapping));
95 }
MakeBufferFromSharedMemory(base::UnsafeSharedMemoryRegion shared_memory_region,base::WritableSharedMemoryMapping shared_memory_mapping)96 static inline scoped_refptr<Buffer> MakeBufferFromSharedMemory(
97     base::UnsafeSharedMemoryRegion shared_memory_region,
98     base::WritableSharedMemoryMapping shared_memory_mapping) {
99   return base::MakeRefCounted<Buffer>(MakeBackingFromSharedMemory(
100       std::move(shared_memory_region), std::move(shared_memory_mapping)));
101 }
102 
MakeMemoryBuffer(uint32_t size)103 static inline scoped_refptr<Buffer> MakeMemoryBuffer(uint32_t size) {
104   return base::MakeRefCounted<Buffer>(
105       std::make_unique<MemoryBufferBacking>(size));
106 }
107 
108 // Generates a process unique buffer ID which can be safely used with
109 // GetBufferGUIDForTracing.
110 GPU_EXPORT int32_t GetNextBufferId();
111 
112 // Generates GUID which can be used to trace buffer using an Id.
113 GPU_EXPORT base::trace_event::MemoryAllocatorDumpGuid GetBufferGUIDForTracing(
114     uint64_t tracing_process_id,
115     int32_t buffer_id);
116 
117 }  // namespace gpu
118 
119 #endif  // GPU_COMMAND_BUFFER_COMMON_BUFFER_H_
120