diff options
Diffstat (limited to 'gpu/command_buffer/client/mapped_memory.h')
-rw-r--r-- | gpu/command_buffer/client/mapped_memory.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/gpu/command_buffer/client/mapped_memory.h b/gpu/command_buffer/client/mapped_memory.h new file mode 100644 index 0000000..95ff24b --- /dev/null +++ b/gpu/command_buffer/client/mapped_memory.h @@ -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_ + |