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..e474c0bc07baf69eb65dac5056ac713f9ecbeee8 |
--- /dev/null |
+++ b/gpu/command_buffer/service/transform_feedback_manager.cc |
@@ -0,0 +1,125 @@ |
+// 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->needs_emulation()), |
+ manager_(manager), |
+ service_id_(service_id), |
+ has_been_bound_(false), |
+ active_(false), |
+ paused_(false), |
+ primitive_mode_(GL_NONE) { |
+ DCHECK_LT(0u, service_id); |
+} |
+ |
+TransformFeedback::~TransformFeedback() { |
+ if (!manager_->lost_context()) { |
+ glDeleteTransformFeedbacks(1, &service_id_); |
+ } |
+} |
+ |
+void TransformFeedback::DoBindTransformFeedback(GLenum target) { |
+ DCHECK_LT(0u, service_id_); |
+ glBindTransformFeedback(target, service_id_); |
+ has_been_bound_ = true; |
+ OnBindHost(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, bool needs_emulation) |
+ : max_transform_feedback_separate_attribs_( |
+ max_transform_feedback_separate_attribs), |
+ needs_emulation_(needs_emulation), |
+ lost_context_(false) { |
+} |
+ |
+TransformFeedbackManager::~TransformFeedbackManager() { |
+ DCHECK(transform_feedbacks_.empty()); |
+} |
+ |
+void TransformFeedbackManager::Destroy() { |
+ 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) { |
+ if (client_id == 0) { |
+ return nullptr; |
+ } |
+ auto it = transform_feedbacks_.find(client_id); |
+ return it != transform_feedbacks_.end() ? it->second.get() : nullptr; |
+} |
+ |
+void TransformFeedbackManager::RemoveTransformFeedback(GLuint client_id) { |
+ if (client_id) { |
+ transform_feedbacks_.erase(client_id); |
+ } |
+} |
+ |
+void TransformFeedbackManager::RemoveBoundBuffer(Buffer* buffer) { |
+ for (auto iter = transform_feedbacks_.begin(); |
+ iter != transform_feedbacks_.end(); ++iter) { |
+ iter->second->RemoveBoundBuffer(buffer); |
+ } |
+} |
+ |
+} // namespace gles2 |
+} // namespace gpu |