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 3 // found in the LICENSE file. 4 5 #ifndef GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 6 #define GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 7 8 #include <GLES2/gl2.h> 9 10 #include <queue> 11 #include "base/containers/hash_tables.h" 12 #include "gles2_impl_export.h" 13 #include "gpu/command_buffer/common/gles2_cmd_format.h" 14 15 namespace gpu { 16 17 class CommandBufferHelper; 18 class MappedMemoryManager; 19 20 namespace gles2 { 21 22 // Tracks buffer objects for client side of command buffer. 23 class GLES2_IMPL_EXPORT BufferTracker { 24 public: 25 class GLES2_IMPL_EXPORT Buffer { 26 public: 27 Buffer(GLuint id, 28 unsigned int size, 29 int32 shm_id, 30 uint32 shm_offset, 31 void* address) 32 : id_(id), 33 size_(size), 34 shm_id_(shm_id), 35 shm_offset_(shm_offset), 36 address_(address), 37 mapped_(false), 38 last_usage_token_(0), 39 last_async_upload_token_(0) { 40 } 41 42 GLenum id() const { 43 return id_; 44 } 45 46 unsigned int size() const { 47 return size_; 48 } 49 50 int32 shm_id() const { 51 return shm_id_; 52 } 53 54 uint32 shm_offset() const { 55 return shm_offset_; 56 } 57 58 void* address() const { 59 return address_; 60 } 61 62 void set_mapped(bool mapped) { 63 mapped_ = mapped; 64 } 65 66 bool mapped() const { 67 return mapped_; 68 } 69 70 void set_last_usage_token(int token) { 71 last_usage_token_ = token; 72 } 73 74 int last_usage_token() const { 75 return last_usage_token_; 76 } 77 78 void set_last_async_upload_token(uint32 async_token) { 79 last_async_upload_token_ = async_token; 80 } 81 82 GLuint last_async_upload_token() const { 83 return last_async_upload_token_; 84 } 85 86 private: 87 friend class BufferTracker; 88 friend class BufferTrackerTest; 89 90 GLuint id_; 91 unsigned int size_; 92 int32 shm_id_; 93 uint32 shm_offset_; 94 void* address_; 95 bool mapped_; 96 int32 last_usage_token_; 97 GLuint last_async_upload_token_; 98 }; 99 100 BufferTracker(MappedMemoryManager* manager); 101 ~BufferTracker(); 102 103 Buffer* CreateBuffer(GLuint id, GLsizeiptr size); 104 Buffer* GetBuffer(GLuint id); 105 void RemoveBuffer(GLuint id); 106 107 // Frees the block of memory associated with buffer, pending the passage 108 // of a token. 109 void FreePendingToken(Buffer* buffer, int32 token); 110 void Unmanage(Buffer* buffer); 111 void Free(Buffer* buffer); 112 113 private: 114 typedef base::hash_map<GLuint, Buffer*> BufferMap; 115 116 MappedMemoryManager* mapped_memory_; 117 BufferMap buffers_; 118 119 DISALLOW_COPY_AND_ASSIGN(BufferTracker); 120 }; 121 122 } // namespace gles2 123 } // namespace gpu 124 125 #endif // GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 126