summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp159
1 files changed, 115 insertions, 44 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp b/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
index b7961971d0..99235debd4 100644
--- a/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
+++ b/src/3rdparty/angle/src/libANGLE/TransformFeedback.cpp
@@ -8,133 +8,204 @@
#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
{
-TransformFeedback::TransformFeedback(rx::TransformFeedbackImpl *impl, GLuint id, const Caps &caps)
- : RefCountObject(id),
- mImplementation(impl),
- mLabel(),
+TransformFeedbackState::TransformFeedbackState(size_t maxIndexedBuffers)
+ : mLabel(),
mActive(false),
mPrimitiveMode(GL_NONE),
mPaused(false),
+ mProgram(nullptr),
mGenericBuffer(),
- mIndexedBuffers(caps.maxTransformFeedbackSeparateAttributes)
+ mIndexedBuffers(maxIndexedBuffers)
{
- ASSERT(impl != NULL);
}
-TransformFeedback::~TransformFeedback()
+TransformFeedbackState::~TransformFeedbackState()
+{
+}
+
+const BindingPointer<Buffer> &TransformFeedbackState::getGenericBuffer() const
{
- mGenericBuffer.set(nullptr);
- for (size_t i = 0; i < mIndexedBuffers.size(); i++)
+ 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);
+}
+
+Error TransformFeedback::onDestroy(const Context *context)
+{
+ if (mState.mProgram)
{
- mIndexedBuffers[i].set(nullptr);
+ mState.mProgram->release(context);
+ mState.mProgram = nullptr;
}
+ ASSERT(!mState.mProgram);
+ mState.mGenericBuffer.set(context, nullptr);
+ for (size_t i = 0; i < mState.mIndexedBuffers.size(); i++)
+ {
+ mState.mIndexedBuffers[i].set(context, nullptr);
+ }
+
+ return NoError();
+}
+
+TransformFeedback::~TransformFeedback()
+{
SafeDelete(mImplementation);
}
void TransformFeedback::setLabel(const std::string &label)
{
- mLabel = label;
+ mState.mLabel = label;
}
const std::string &TransformFeedback::getLabel() const
{
- return mLabel;
+ return mState.mLabel;
}
-void TransformFeedback::begin(GLenum primitiveMode)
+void TransformFeedback::begin(const Context *context, GLenum primitiveMode, Program *program)
{
- mActive = true;
- mPrimitiveMode = primitiveMode;
- mPaused = false;
+ mState.mActive = true;
+ mState.mPrimitiveMode = primitiveMode;
+ mState.mPaused = false;
mImplementation->begin(primitiveMode);
+ bindProgram(context, program);
}
-void TransformFeedback::end()
+void TransformFeedback::end(const Context *context)
{
- mActive = false;
- mPrimitiveMode = GL_NONE;
- mPaused = false;
+ mState.mActive = false;
+ mState.mPrimitiveMode = GL_NONE;
+ mState.mPaused = false;
mImplementation->end();
+ if (mState.mProgram)
+ {
+ mState.mProgram->release(context);
+ mState.mProgram = nullptr;
+ }
}
void TransformFeedback::pause()
{
- mPaused = true;
+ mState.mPaused = true;
mImplementation->pause();
}
void TransformFeedback::resume()
{
- mPaused = false;
+ mState.mPaused = false;
mImplementation->resume();
}
bool TransformFeedback::isActive() const
{
- return mActive;
+ return mState.mActive;
}
bool TransformFeedback::isPaused() const
{
- return mPaused;
+ return mState.mPaused;
}
GLenum TransformFeedback::getPrimitiveMode() const
{
- return mPrimitiveMode;
+ return mState.mPrimitiveMode;
+}
+
+void TransformFeedback::bindProgram(const Context *context, Program *program)
+{
+ if (mState.mProgram != program)
+ {
+ if (mState.mProgram != nullptr)
+ {
+ mState.mProgram->release(context);
+ }
+ mState.mProgram = program;
+ if (mState.mProgram != nullptr)
+ {
+ mState.mProgram->addRef();
+ }
+ }
}
-void TransformFeedback::bindGenericBuffer(Buffer *buffer)
+bool TransformFeedback::hasBoundProgram(GLuint program) const
{
- mGenericBuffer.set(buffer);
- mImplementation->bindGenericBuffer(mGenericBuffer);
+ return mState.mProgram != nullptr && mState.mProgram->id() == program;
}
-void TransformFeedback::detachBuffer(GLuint bufferName)
+void TransformFeedback::bindGenericBuffer(const Context *context, Buffer *buffer)
{
- for (size_t index = 0; index < mIndexedBuffers.size(); index++)
+ mState.mGenericBuffer.set(context, buffer);
+ mImplementation->bindGenericBuffer(mState.mGenericBuffer);
+}
+
+void TransformFeedback::detachBuffer(const Context *context, GLuint bufferName)
+{
+ for (size_t index = 0; index < mState.mIndexedBuffers.size(); index++)
{
- if (mIndexedBuffers[index].id() == bufferName)
+ if (mState.mIndexedBuffers[index].id() == bufferName)
{
- mIndexedBuffers[index].set(nullptr);
- mImplementation->bindIndexedBuffer(index, mIndexedBuffers[index]);
+ mState.mIndexedBuffers[index].set(context, nullptr);
+ mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]);
}
}
- if (mGenericBuffer.id() == bufferName)
+ if (mState.mGenericBuffer.id() == bufferName)
{
- mGenericBuffer.set(nullptr);
- mImplementation->bindGenericBuffer(mGenericBuffer);
+ mState.mGenericBuffer.set(context, nullptr);
+ mImplementation->bindGenericBuffer(mState.mGenericBuffer);
}
}
const BindingPointer<Buffer> &TransformFeedback::getGenericBuffer() const
{
- return mGenericBuffer;
+ return mState.mGenericBuffer;
}
-void TransformFeedback::bindIndexedBuffer(size_t index, Buffer *buffer, size_t offset, size_t size)
+void TransformFeedback::bindIndexedBuffer(const Context *context,
+ 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]);
+ ASSERT(index < mState.mIndexedBuffers.size());
+ mState.mIndexedBuffers[index].set(context, buffer, offset, size);
+ mImplementation->bindIndexedBuffer(index, mState.mIndexedBuffers[index]);
}
const OffsetBindingPointer<Buffer> &TransformFeedback::getIndexedBuffer(size_t index) const
{
- ASSERT(index < mIndexedBuffers.size());
- return mIndexedBuffers[index];
+ ASSERT(index < mState.mIndexedBuffers.size());
+ return mState.mIndexedBuffers[index];
}
size_t TransformFeedback::getIndexedBufferCount() const
{
- return mIndexedBuffers.size();
+ return mState.mIndexedBuffers.size();
}
rx::TransformFeedbackImpl *TransformFeedback::getImplementation()