| // |
| // 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<Buffer> &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<Buffer> &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; |
| } |
| |
| } |