OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains the definition of the FencedAllocator class. | 5 // This file contains the definition of the FencedAllocator class. |
6 | 6 |
7 #ifndef GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ | 7 #ifndef GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ |
8 #define GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ | 8 #define GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ |
9 | 9 |
10 #include <vector> | 10 #include <vector> |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 void Free(Offset offset); | 58 void Free(Offset offset); |
59 | 59 |
60 // Frees a block of memory, pending the passage of a token. That memory won't | 60 // Frees a block of memory, pending the passage of a token. That memory won't |
61 // be re-allocated until the token has passed through the command stream. | 61 // be re-allocated until the token has passed through the command stream. |
62 // | 62 // |
63 // Parameters: | 63 // Parameters: |
64 // offset: the offset of the memory block to free. | 64 // offset: the offset of the memory block to free. |
65 // token: the token value to wait for before re-using the memory. | 65 // token: the token value to wait for before re-using the memory. |
66 void FreePendingToken(Offset offset, int32 token); | 66 void FreePendingToken(Offset offset, int32 token); |
67 | 67 |
| 68 void FreePendingSerial(Offset offset, uint32 token); |
| 69 |
68 // Frees any blocks pending a token for which the token has been read. | 70 // Frees any blocks pending a token for which the token has been read. |
69 void FreeUnused(); | 71 void FreeUnused(); |
70 | 72 |
71 // Gets the size of the largest free block that is available without waiting. | 73 // Gets the size of the largest free block that is available without waiting. |
72 unsigned int GetLargestFreeSize(); | 74 unsigned int GetLargestFreeSize(); |
73 | 75 |
74 // Gets the size of the largest free block that can be allocated if the | 76 // Gets the size of the largest free block that can be allocated if the |
75 // caller can wait. Allocating a block of this size will succeed, but may | 77 // caller can wait. Allocating a block of this size will succeed, but may |
76 // block. | 78 // block. |
77 unsigned int GetLargestFreeOrPendingSize(); | 79 unsigned int GetLargestFreeOrPendingSize(); |
78 | 80 |
79 // Checks for consistency inside the book-keeping structures. Used for | 81 // Checks for consistency inside the book-keeping structures. Used for |
80 // testing. | 82 // testing. |
81 bool CheckConsistency(); | 83 bool CheckConsistency(); |
82 | 84 |
83 // True if any memory is allocated. | 85 // True if any memory is allocated. |
84 bool InUse(); | 86 bool InUse(); |
85 | 87 |
86 // Return bytes of memory that is IN_USE | 88 // Return bytes of memory that is IN_USE |
87 size_t bytes_in_use() const { return bytes_in_use_; } | 89 size_t bytes_in_use() const { return bytes_in_use_; } |
88 | 90 |
89 private: | 91 private: |
90 // Status of a block of memory, for book-keeping. | 92 // Status of a block of memory, for book-keeping. |
91 enum State { | 93 enum State { |
92 IN_USE, | 94 IN_USE, |
93 FREE, | 95 FREE, |
94 FREE_PENDING_TOKEN | 96 FREE_PENDING_TOKEN, |
| 97 FREE_PENDING_SERIAL |
95 }; | 98 }; |
96 | 99 |
97 // Book-keeping sturcture that describes a block of memory. | 100 // Book-keeping sturcture that describes a block of memory. |
98 struct Block { | 101 struct Block { |
99 State state; | 102 State state; |
100 Offset offset; | 103 Offset offset; |
101 unsigned int size; | 104 unsigned int size; |
102 int32 token; // token to wait for in the FREE_PENDING_TOKEN case. | 105 int32 token; // token to wait for in the FREE_PENDING_TOKEN case. |
| 106 uint32 serial; |
103 }; | 107 }; |
104 | 108 |
105 // Comparison functor for memory block sorting. | 109 // Comparison functor for memory block sorting. |
106 class OffsetCmp { | 110 class OffsetCmp { |
107 public: | 111 public: |
108 bool operator() (const Block &left, const Block &right) { | 112 bool operator() (const Block &left, const Block &right) { |
109 return left.offset < right.offset; | 113 return left.offset < right.offset; |
110 } | 114 } |
111 }; | 115 }; |
112 | 116 |
113 typedef std::vector<Block> Container; | 117 typedef std::vector<Block> Container; |
114 typedef unsigned int BlockIndex; | 118 typedef unsigned int BlockIndex; |
115 | 119 |
116 static const int32 kUnusedToken = 0; | 120 static const int32 kUnusedToken = 0; |
| 121 static const uint32 kUnusedSerial = 0; |
117 | 122 |
118 // Gets the index of a memory block, given its offset. | 123 // Gets the index of a memory block, given its offset. |
119 BlockIndex GetBlockByOffset(Offset offset); | 124 BlockIndex GetBlockByOffset(Offset offset); |
120 | 125 |
121 // Collapse a free block with its neighbours if they are free. Returns the | 126 // Collapse a free block with its neighbours if they are free. Returns the |
122 // index of the collapsed block. | 127 // index of the collapsed block. |
123 // NOTE: this will invalidate block indices. | 128 // NOTE: this will invalidate block indices. |
124 BlockIndex CollapseFreeBlock(BlockIndex index); | 129 BlockIndex CollapseFreeBlock(BlockIndex index); |
125 | 130 |
126 // Waits for a FREE_PENDING_TOKEN block to be usable, and free it. Returns | 131 // Waits for a FREE_PENDING_TOKEN block to be usable, and free it. Returns |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 // be re-allocated until the token has passed through the command stream. | 200 // be re-allocated until the token has passed through the command stream. |
196 // | 201 // |
197 // Parameters: | 202 // Parameters: |
198 // pointer: the pointer to the memory block to free. | 203 // pointer: the pointer to the memory block to free. |
199 // token: the token value to wait for before re-using the memory. | 204 // token: the token value to wait for before re-using the memory. |
200 void FreePendingToken(void *pointer, int32 token) { | 205 void FreePendingToken(void *pointer, int32 token) { |
201 DCHECK(pointer); | 206 DCHECK(pointer); |
202 allocator_.FreePendingToken(GetOffset(pointer), token); | 207 allocator_.FreePendingToken(GetOffset(pointer), token); |
203 } | 208 } |
204 | 209 |
| 210 void FreePendingSerial(void *pointer, uint32 serial) { |
| 211 DCHECK(pointer); |
| 212 allocator_.FreePendingSerial(GetOffset(pointer), serial); |
| 213 } |
| 214 |
205 // Frees any blocks pending a token for which the token has been read. | 215 // Frees any blocks pending a token for which the token has been read. |
206 void FreeUnused() { | 216 void FreeUnused() { |
207 allocator_.FreeUnused(); | 217 allocator_.FreeUnused(); |
208 } | 218 } |
209 | 219 |
210 // Gets a pointer to a memory block given the base memory and the offset. | 220 // Gets a pointer to a memory block given the base memory and the offset. |
211 // It translates FencedAllocator::kInvalidOffset to NULL. | 221 // It translates FencedAllocator::kInvalidOffset to NULL. |
212 void *GetPointer(FencedAllocator::Offset offset) { | 222 void *GetPointer(FencedAllocator::Offset offset) { |
213 return (offset == FencedAllocator::kInvalidOffset) ? | 223 return (offset == FencedAllocator::kInvalidOffset) ? |
214 NULL : static_cast<char *>(base_) + offset; | 224 NULL : static_cast<char *>(base_) + offset; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 | 261 |
252 private: | 262 private: |
253 FencedAllocator allocator_; | 263 FencedAllocator allocator_; |
254 void* base_; | 264 void* base_; |
255 DISALLOW_IMPLICIT_CONSTRUCTORS(FencedAllocatorWrapper); | 265 DISALLOW_IMPLICIT_CONSTRUCTORS(FencedAllocatorWrapper); |
256 }; | 266 }; |
257 | 267 |
258 } // namespace gpu | 268 } // namespace gpu |
259 | 269 |
260 #endif // GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ | 270 #endif // GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ |
OLD | NEW |