diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/TransformFeedback.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/TransformFeedback.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/TransformFeedback.cpp b/gfx/angle/src/libANGLE/TransformFeedback.cpp new file mode 100755 index 000000000..293c91b31 --- /dev/null +++ b/gfx/angle/src/libANGLE/TransformFeedback.cpp @@ -0,0 +1,206 @@ +// +// 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/ContextState.h" +#include "libANGLE/Program.h" +#include "libANGLE/renderer/GLImplFactory.h" +#include "libANGLE/renderer/TransformFeedbackImpl.h" + +namespace gl +{ + +TransformFeedbackState::TransformFeedbackState(size_t maxIndexedBuffers) + : mLabel(), + mActive(false), + mPrimitiveMode(GL_NONE), + mPaused(false), + mProgram(nullptr), + mGenericBuffer(), + mIndexedBuffers(maxIndexedBuffers) +{ +} + +const BindingPointer<Buffer> &TransformFeedbackState::getGenericBuffer() const +{ + return mGenericBuffer; +} + +const OffsetBindingPointer<Buffer> &TransformFeedbackState::getIndexedBuffer(size_t idx) const +{ + return mIndexedBuffers[idx]; +} + +const std::vector<OffsetBindingPointer<Buffer>> &TransformFeedbackState::getIndexedBuffers() const +{ + return mIndexedBuffers; +} + +TransformFeedback::TransformFeedback(rx::GLImplFactory *implFactory, GLuint id, const Caps &caps) + : RefCountObject(id), + mState(caps.maxTransformFeedbackSeparateAttributes), + mImplementation(implFactory->createTransformFeedback(mState)) +{ + ASSERT(mImplementation != nullptr); +} + +TransformFeedback::~TransformFeedback() +{ + if (mState.mProgram) + { + mState.mProgram->release(); + mState.mProgram = nullptr; + } + mState.mGenericBuffer.set(nullptr); + for (size_t i = 0; i < mState.mIndexedBuffers.size(); i++) + { + mState.mIndexedBuffers[i].set(nullptr); + } + + SafeDelete(mImplementation); +} + +void TransformFeedback::setLabel(const std::string &label) +{ + mState.mLabel = label; +} + +const std::string &TransformFeedback::getLabel() const +{ + return mState.mLabel; +} + +void TransformFeedback::begin(GLenum primitiveMode, Program *program) +{ + mState.mActive = true; + mState.mPrimitiveMode = primitiveMode; + mState.mPaused = false; + mImplementation->begin(primitiveMode); + bindProgram(program); +} + +void TransformFeedback::end() +{ + mState.mActive = false; + mState.mPrimitiveMode = GL_NONE; + mState.mPaused = false; + mImplementation->end(); + if (mState.mProgram) + { + mState.mProgram->release(); + mState.mProgram = nullptr; + } +} + +void TransformFeedback::pause() +{ + mState.mPaused = true; + mImplementation->pause(); +} + +void TransformFeedback::resume() +{ + mState.mPaused = false; + mImplementation->resume(); +} + +bool TransformFeedback::isActive() const +{ + return mState.mActive; +} + +bool TransformFeedback::isPaused() const +{ + return mState.mPaused; +} + +GLenum TransformFeedback::getPrimitiveMode() const +{ + return mState.mPrimitiveMode; +} + +void TransformFeedback::bindProgram(Program *program) +{ + if (mState.mProgram != program) + { + if (mState.mProgram != nullptr) + { + mState.mProgram->release(); + } + mState.mProgram = program; + if (mState.mProgram != nullptr) + { + mState.mProgram->addRef(); + } + } +} + +bool TransformFeedback::hasBoundProgram(GLuint program) const +{ + return mState.mProgram != nullptr && mState.mProgram->id() == program; +} + +void TransformFeedback::bindGenericBuffer(Buffer *buffer) +{ + mState.mGenericBuffer.set(buffer); + mImplementation->bindGenericBuffer(mState.mGenericBuffer); +} + +void TransformFeedback::detachBuffer(GLuint bufferName) +{ + for (size_t index = 0; index < mState.mIndexedBuffers.size(); index++) + { + if (mState.mIndexedBuffers[index].id() == bufferName) + { + mState.mIndexedBuffers[index].set(nullptr); + mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]); + } + } + + if (mState.mGenericBuffer.id() == bufferName) + { + mState.mGenericBuffer.set(nullptr); + mImplementation->bindGenericBuffer(mState.mGenericBuffer); + } +} + +const BindingPointer<Buffer> &TransformFeedback::getGenericBuffer() const +{ + return mState.mGenericBuffer; +} + +void TransformFeedback::bindIndexedBuffer(size_t index, Buffer *buffer, size_t offset, size_t size) +{ + ASSERT(index < mState.mIndexedBuffers.size()); + mState.mIndexedBuffers[index].set(buffer, offset, size); + mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]); +} + +const OffsetBindingPointer<Buffer> &TransformFeedback::getIndexedBuffer(size_t index) const +{ + ASSERT(index < mState.mIndexedBuffers.size()); + return mState.mIndexedBuffers[index]; +} + +size_t TransformFeedback::getIndexedBufferCount() const +{ + return mState.mIndexedBuffers.size(); +} + +rx::TransformFeedbackImpl *TransformFeedback::getImplementation() +{ + return mImplementation; +} + +const rx::TransformFeedbackImpl *TransformFeedback::getImplementation() const +{ + return mImplementation; +} + +} |