Index: gpu/command_buffer/client/mapped_memory.h |
=================================================================== |
--- gpu/command_buffer/client/mapped_memory.h (revision 0) |
+++ gpu/command_buffer/client/mapped_memory.h (revision 0) |
@@ -0,0 +1,146 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef GPU_COMMAND_BUFFER_CLIENT_MAPPED_MEMORY_H_ |
+#define GPU_COMMAND_BUFFER_CLIENT_MAPPED_MEMORY_H_ |
+ |
+#include <vector> |
+#include "base/basictypes.h" |
+#include "base/ref_counted.h" |
+#include "gpu/command_buffer/client/fenced_allocator.h" |
+#include "gpu/command_buffer/common/buffer.h" |
+ |
+namespace gpu { |
+ |
+class CommandBufferHelper; |
+ |
+// Manages a shared memory segment. |
+class MemoryChunk : public base::RefCounted<MemoryChunk> { |
+ public: |
+ typedef scoped_refptr<MemoryChunk> Ref; |
+ |
+ MemoryChunk(int32 shm_id, gpu::Buffer shm, CommandBufferHelper* helper); |
+ |
+ // Gets the size of the largest free block that is available without waiting. |
+ unsigned int GetLargestFreeSizeWithoutWaiting() { |
+ return allocator_.GetLargestFreeSize(); |
+ } |
+ |
+ // Gets the size of the largest free block that can be allocated if the |
+ // caller can wait. |
+ unsigned int GetLargestFreeSizeWithWaiting() { |
+ return allocator_.GetLargestFreeOrPendingSize(); |
+ } |
+ |
+ // Gets the size of the chunk. |
+ unsigned int GetSize() const { |
+ return shm_.size; |
+ } |
+ |
+ // The shared memory id for this chunk. |
+ int32 shm_id() const { |
+ return shm_id_; |
+ } |
+ |
+ // Allocates a block of memory. If the buffer is out of directly available |
+ // memory, this function may wait until memory that was freed "pending a |
+ // token" can be re-used. |
+ // |
+ // Parameters: |
+ // size: the size of the memory block to allocate. |
+ // |
+ // Returns: |
+ // the pointer to the allocated memory block, or NULL if out of |
+ // memory. |
+ void* Alloc(unsigned int size) { |
+ return allocator_.Alloc(size); |
+ } |
+ |
+ // Gets the offset to a memory block given the base memory and the address. |
+ // It translates NULL to FencedAllocator::kInvalidOffset. |
+ unsigned int GetOffset(void* pointer) { |
+ return allocator_.GetOffset(pointer); |
+ } |
+ |
+ // Frees a block of memory. |
+ // |
+ // Parameters: |
+ // pointer: the pointer to the memory block to free. |
+ void Free(void* pointer) { |
+ allocator_.Free(pointer); |
+ } |
+ |
+ // Frees a block of memory, pending the passage of a token. That memory won't |
+ // be re-allocated until the token has passed through the command stream. |
+ // |
+ // Parameters: |
+ // pointer: the pointer to the memory block to free. |
+ // token: the token value to wait for before re-using the memory. |
+ void FreePendingToken(void* pointer, unsigned int token) { |
+ allocator_.FreePendingToken(pointer, token); |
+ } |
+ |
+ // Frees any blocks who's tokens have passed. |
+ void FreeUnused() { |
+ allocator_.FreeUnused(); |
+ } |
+ |
+ // Returns true if pointer is in the range of this block. |
+ bool IsInChunk(void* pointer) const { |
+ return pointer >= shm_.ptr && |
+ pointer < reinterpret_cast<const int8*>(shm_.ptr) + shm_.size; |
+ } |
+ |
+ private: |
+ int32 shm_id_; |
+ gpu::Buffer shm_; |
+ FencedAllocatorWrapper allocator_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MemoryChunk); |
+}; |
+ |
+// Manages MemoryChucks. |
+class MappedMemoryManager { |
+ public: |
+ explicit MappedMemoryManager(CommandBufferHelper* helper) |
+ : helper_(helper) { |
+ } |
+ |
+ // Allocates a block of memory |
+ // Parameters: |
+ // size: size of memory to allocate. |
+ // shm_id: pointer to variable to receive the shared memory id. |
+ // shm_offset: pointer to variable to receive the shared memory offset. |
+ // Returns: |
+ // pointer to allocated block of memory. NULL if failure. |
+ void* Alloc( |
+ unsigned int size, int32* shm_id, unsigned int* shm_offset); |
+ |
+ // Frees a block of memory. |
+ // |
+ // Parameters: |
+ // pointer: the pointer to the memory block to free. |
+ void Free(void* pointer); |
+ |
+ // Frees a block of memory, pending the passage of a token. That memory won't |
+ // be re-allocated until the token has passed through the command stream. |
+ // |
+ // Parameters: |
+ // pointer: the pointer to the memory block to free. |
+ // token: the token value to wait for before re-using the memory. |
+ void FreePendingToken(void* pointer, int32 token); |
+ |
+ private: |
+ typedef std::vector<MemoryChunk::Ref> MemoryChunkVector; |
+ |
+ CommandBufferHelper* helper_; |
+ MemoryChunkVector chunks_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MappedMemoryManager); |
+}; |
+ |
+} // namespace gpu |
+ |
+#endif // GPU_COMMAND_BUFFER_CLIENT_MAPPED_MEMORY_H_ |
+ |
Property changes on: gpu\command_buffer\client\mapped_memory.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |