summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp')
-rwxr-xr-xgfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp b/gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
new file mode 100755
index 000000000..ae75a0f47
--- /dev/null
+++ b/gfx/angle/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp
@@ -0,0 +1,131 @@
+//
+// Copyright 2015 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.
+//
+
+// TransformFeedbackGL.cpp: Implements the class methods for TransformFeedbackGL.
+
+#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
+
+#include "common/debug.h"
+#include "libANGLE/ContextState.h"
+#include "libANGLE/renderer/gl/BufferGL.h"
+#include "libANGLE/renderer/gl/FunctionsGL.h"
+#include "libANGLE/renderer/gl/StateManagerGL.h"
+
+namespace rx
+{
+
+TransformFeedbackGL::TransformFeedbackGL(const gl::TransformFeedbackState &state,
+ const FunctionsGL *functions,
+ StateManagerGL *stateManager)
+ : TransformFeedbackImpl(state),
+ mFunctions(functions),
+ mStateManager(stateManager),
+ mTransformFeedbackID(0),
+ mIsActive(false),
+ mIsPaused(false)
+{
+ mFunctions->genTransformFeedbacks(1, &mTransformFeedbackID);
+}
+
+TransformFeedbackGL::~TransformFeedbackGL()
+{
+ mStateManager->deleteTransformFeedback(mTransformFeedbackID);
+ mTransformFeedbackID = 0;
+}
+
+void TransformFeedbackGL::begin(GLenum primitiveMode)
+{
+ // Do not begin directly, StateManagerGL will handle beginning and resuming transform feedback.
+}
+
+void TransformFeedbackGL::end()
+{
+ syncActiveState(false, GL_NONE);
+}
+
+void TransformFeedbackGL::pause()
+{
+ syncPausedState(true);
+}
+
+void TransformFeedbackGL::resume()
+{
+ // Do not resume directly, StateManagerGL will handle beginning and resuming transform feedback.
+}
+
+void TransformFeedbackGL::bindGenericBuffer(const BindingPointer<gl::Buffer> &binding)
+{
+}
+
+void TransformFeedbackGL::bindIndexedBuffer(size_t index, const OffsetBindingPointer<gl::Buffer> &binding)
+{
+ // Directly bind buffer (not through the StateManager methods) because the buffer bindings are
+ // tracked per transform feedback object
+ mStateManager->bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+ if (binding.get() != nullptr)
+ {
+ const BufferGL *bufferGL = GetImplAs<BufferGL>(binding.get());
+ if (binding.getSize() != 0)
+ {
+ mFunctions->bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, static_cast<GLuint>(index),
+ bufferGL->getBufferID(), binding.getOffset(),
+ binding.getSize());
+ }
+ else
+ {
+ mFunctions->bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, static_cast<GLuint>(index),
+ bufferGL->getBufferID());
+ }
+ }
+ else
+ {
+ mFunctions->bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, static_cast<GLuint>(index), 0);
+ }
+}
+
+GLuint TransformFeedbackGL::getTransformFeedbackID() const
+{
+ return mTransformFeedbackID;
+}
+
+void TransformFeedbackGL::syncActiveState(bool active, GLenum primitiveMode) const
+{
+ if (mIsActive != active)
+ {
+ mIsActive = active;
+ mIsPaused = false;
+
+ mStateManager->bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+ if (mIsActive)
+ {
+ mFunctions->beginTransformFeedback(primitiveMode);
+ }
+ else
+ {
+ mFunctions->endTransformFeedback();
+ }
+ }
+}
+
+void TransformFeedbackGL::syncPausedState(bool paused) const
+{
+ if (mIsActive && mIsPaused != paused)
+ {
+ mIsPaused = paused;
+
+ mStateManager->bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+ if (mIsPaused)
+ {
+ mFunctions->pauseTransformFeedback();
+ }
+ else
+ {
+ mFunctions->resumeTransformFeedback();
+ }
+ }
+}
+
+}