Index: gpu/command_buffer/service/transform_feedback_manager.cc |
diff --git a/gpu/command_buffer/service/transform_feedback_manager.cc b/gpu/command_buffer/service/transform_feedback_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46057630c803a8fab544e1fbbe68f3784fe3793e |
--- /dev/null |
+++ b/gpu/command_buffer/service/transform_feedback_manager.cc |
@@ -0,0 +1,124 @@ |
+// Copyright (c) 2016 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. |
+ |
+#include "gpu/command_buffer/service/transform_feedback_manager.h" |
+ |
+#include "gpu/command_buffer/service/buffer_manager.h" |
+#include "ui/gl/gl_version_info.h" |
+ |
+namespace gpu { |
+namespace gles2 { |
+ |
+TransformFeedback::TransformFeedback(TransformFeedbackManager* manager, |
+ GLuint service_id) |
+ : IndexedBufferBindingHost( |
+ manager->max_transform_feedback_separate_attribs()), |
+ manager_(manager), |
+ service_id_(service_id), |
+ deleted_(false), |
+ active_(false), |
+ paused_(false), |
+ primitive_mode_(GL_NONE) { |
+ DCHECK_LT(0u, service_id); |
+} |
+ |
+TransformFeedback::~TransformFeedback() { |
+ if (manager_->have_context()) { |
+ glDeleteTransformFeedbacks(1, &service_id_); |
+ } |
+} |
+ |
+void TransformFeedback::DoBindTransformFeedback( |
+ const gfx::GLVersionInfo& gl_version_info, GLenum target) { |
+ DCHECK_LT(0u, service_id_); |
+ glBindTransformFeedback(target, service_id_); |
+ OnBindHost(gl_version_info, target); |
+ if (active_ && !paused_) { |
+ // This could only happen during virtual context switching. |
+ // Otherwise the validation should generate a GL error without calling |
+ // into this function. |
+ glResumeTransformFeedback(); |
+ } |
+} |
+ |
+void TransformFeedback::DoBeginTransformFeedback(GLenum primitive_mode) { |
+ DCHECK(!active_); |
+ DCHECK(primitive_mode == GL_POINTS || |
+ primitive_mode == GL_LINES || |
+ primitive_mode == GL_TRIANGLES); |
+ glBeginTransformFeedback(primitive_mode); |
+ active_ = true; |
+ primitive_mode_ = primitive_mode; |
+} |
+ |
+void TransformFeedback::DoEndTransformFeedback() { |
+ DCHECK(active_); |
+ glEndTransformFeedback(); |
+ active_ = false; |
+ paused_ = false; |
+} |
+ |
+void TransformFeedback::DoPauseTransformFeedback() { |
+ DCHECK(active_ && !paused_); |
+ glPauseTransformFeedback(); |
+ paused_ = true; |
+} |
+ |
+void TransformFeedback::DoResumeTransformFeedback() { |
+ DCHECK(active_ && paused_); |
+ glResumeTransformFeedback(); |
+ paused_ = false; |
+} |
+ |
+ |
+TransformFeedbackManager::TransformFeedbackManager( |
+ GLuint max_transform_feedback_separate_attribs) |
+ : max_transform_feedback_separate_attribs_( |
+ max_transform_feedback_separate_attribs), |
+ have_context_(true) { |
+} |
+ |
+TransformFeedbackManager::~TransformFeedbackManager() { |
+ DCHECK(transform_feedbacks_.empty()); |
+} |
+ |
+void TransformFeedbackManager::Destroy(bool have_context) { |
+ have_context_ = have_context; |
+ transform_feedbacks_.clear(); |
+} |
+ |
+TransformFeedback* TransformFeedbackManager::CreateTransformFeedback( |
+ GLuint client_id, GLuint service_id) { |
+ scoped_refptr<TransformFeedback> transform_feedback( |
+ new TransformFeedback(this, service_id)); |
+ auto result = transform_feedbacks_.insert( |
+ std::make_pair(client_id, transform_feedback)); |
+ DCHECK(result.second); |
+ return result.first->second.get(); |
+} |
+ |
+TransformFeedback* TransformFeedbackManager::GetTransformFeedback( |
+ GLuint client_id) { |
+ auto it = transform_feedbacks_.find(client_id); |
+ return it != transform_feedbacks_.end() ? it->second.get() : nullptr; |
+} |
+ |
+void TransformFeedbackManager::RemoveTransformFeedback(GLuint client_id) { |
+ auto it = transform_feedbacks_.find(client_id); |
+ if (it != transform_feedbacks_.end()) { |
+ TransformFeedback* transform_feedback = it->second.get(); |
+ transform_feedback->MarkAsDeleted(); |
+ transform_feedbacks_.erase(it); |
+ } |
+} |
+ |
+void TransformFeedbackManager::RemoveBoundBuffer(Buffer* buffer) { |
+ for (auto iter = transform_feedbacks_.begin(); |
+ iter != transform_feedbacks_.end(); ++iter) { |
+ iter->second->RemoveBoundBuffer(buffer); |
+ } |
+} |
+ |
+} // namespace gles2 |
+} // namespace gpu |