// // Copyright (c) 2014 The ANGLE Project 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 "libANGLE/TransformFeedback.h" #include "libANGLE/Buffer.h" #include "libANGLE/Caps.h" #include "libANGLE/renderer/TransformFeedbackImpl.h" namespace gl { TransformFeedback::TransformFeedback(rx::TransformFeedbackImpl* impl, GLuint id, const Caps &caps) : RefCountObject(id), mImplementation(impl), mActive(false), mPrimitiveMode(GL_NONE), mPaused(false), mGenericBuffer(), mIndexedBuffers(caps.maxTransformFeedbackSeparateAttributes) { ASSERT(impl != NULL); } TransformFeedback::~TransformFeedback() { mGenericBuffer.set(nullptr); for (size_t i = 0; i < mIndexedBuffers.size(); i++) { mIndexedBuffers[i].set(nullptr); } SafeDelete(mImplementation); } void TransformFeedback::begin(GLenum primitiveMode) { mActive = true; mPrimitiveMode = primitiveMode; mPaused = false; mImplementation->begin(primitiveMode); } void TransformFeedback::end() { mActive = false; mPrimitiveMode = GL_NONE; mPaused = false; mImplementation->end(); } void TransformFeedback::pause() { mPaused = true; mImplementation->pause(); } void TransformFeedback::resume() { mPaused = false; mImplementation->resume(); } bool TransformFeedback::isActive() const { return mActive; } bool TransformFeedback::isPaused() const { return mPaused; } GLenum TransformFeedback::getPrimitiveMode() const { return mPrimitiveMode; } void TransformFeedback::bindGenericBuffer(Buffer *buffer) { mGenericBuffer.set(buffer); mImplementation->bindGenericBuffer(mGenericBuffer); } const BindingPointer &TransformFeedback::getGenericBuffer() const { return mGenericBuffer; } void TransformFeedback::bindIndexedBuffer(size_t index, Buffer *buffer, size_t offset, size_t size) { ASSERT(index < mIndexedBuffers.size()); mIndexedBuffers[index].set(buffer, offset, size); mImplementation->bindIndexedBuffer(index, mIndexedBuffers[index]); } const OffsetBindingPointer &TransformFeedback::getIndexedBuffer(size_t index) const { ASSERT(index < mIndexedBuffers.size()); return mIndexedBuffers[index]; } size_t TransformFeedback::getIndexedBufferCount() const { return mIndexedBuffers.size(); } rx::TransformFeedbackImpl *TransformFeedback::getImplementation() { return mImplementation; } const rx::TransformFeedbackImpl *TransformFeedback::getImplementation() const { return mImplementation; } }