Index: o3d/gpu_plugin/command_buffer.cc |
=================================================================== |
--- o3d/gpu_plugin/command_buffer.cc (revision 26762) |
+++ o3d/gpu_plugin/command_buffer.cc (working copy) |
@@ -12,6 +12,8 @@ |
size_(0), |
get_offset_(0), |
put_offset_(0) { |
+ // Element zero is always NULL. |
+ registered_objects_.push_back(NPObjectPointer<NPObject>()); |
} |
CommandBuffer::~CommandBuffer() { |
@@ -97,5 +99,59 @@ |
put_offset_change_callback_.reset(callback); |
} |
+int32 CommandBuffer::RegisterObject(NPObjectPointer<NPObject> object) { |
+ if (!object.Get()) |
+ return 0; |
+ |
+ if (unused_registered_object_elements_.empty()) { |
+ // Check we haven't exceeded the range that fits in the range of a 32-bit |
+ // integer. |
+ int32 handle = static_cast<int32>(registered_objects_.size()); |
+ if (handle != registered_objects_.size()) |
+ return -1; |
+ |
+ registered_objects_.push_back(object); |
+ return handle; |
+ } |
+ |
+ int32 handle = *unused_registered_object_elements_.begin(); |
+ unused_registered_object_elements_.erase( |
+ unused_registered_object_elements_.begin()); |
+ DCHECK(!registered_objects_[handle].Get()); |
+ registered_objects_[handle] = object; |
+ return handle; |
+} |
+ |
+void CommandBuffer::UnregisterObject(NPObjectPointer<NPObject> object, |
+ int32 handle) { |
+ if (handle <= 0) |
+ return; |
+ |
+ if (static_cast<size_t>(handle) >= registered_objects_.size()) |
+ return; |
+ |
+ if (registered_objects_[handle] != object) |
+ return; |
+ |
+ registered_objects_[handle] = NPObjectPointer<NPObject>(); |
+ unused_registered_object_elements_.insert(handle); |
+ |
+ // Remove all null objects from the end of the vector. This allows the vector |
+ // to shrink when, for example, all objects are unregistered. Note that this |
+ // loop never removes element zero, which is always NULL. |
+ while (registered_objects_.size() > 1 && !registered_objects_.back().Get()) { |
+ registered_objects_.pop_back(); |
+ unused_registered_object_elements_.erase( |
+ static_cast<int32>(registered_objects_.size())); |
+ } |
+} |
+ |
+NPObjectPointer<NPObject> CommandBuffer::GetRegisteredObject(int32 handle) { |
+ DCHECK_GE(handle, 0); |
+ DCHECK_LT(static_cast<size_t>(handle), registered_objects_.size()); |
+ |
+ return registered_objects_[handle]; |
+} |
+ |
} // namespace gpu_plugin |
} // namespace o3d |