| 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
|
|
|