Added methods for applying the current transform feedback buffers.
BUG=angle:495
Change-Id: I2d9fbf9c245bc519b8c5a724ca3912aaa7a23d97
Reviewed-on: https://chromium-review.googlesource.com/185034
Tested-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 8c1cd3c..a6dba2a 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1,6 +1,6 @@
#include "precompiled.h"
//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-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.
//
@@ -2619,7 +2619,38 @@
return programBinary->applyUniformBuffers(boundBuffers);
}
+bool Context::applyTransformFeedbackBuffers()
+{
+ TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
+ if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
+ {
+ Buffer *transformFeedbackBuffers[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
+ GLintptr transformFeedbackOffsets[IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS];
+ for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
+ {
+ transformFeedbackBuffers[i] = mState.transformFeedbackBuffers[i].get();
+ transformFeedbackOffsets[i] = mState.transformFeedbackBuffers[i].getOffset();
+ }
+ mRenderer->applyTransformFeedbackBuffers(transformFeedbackBuffers, transformFeedbackOffsets);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+void Context::markTransformFeedbackUsage()
+{
+ for (size_t i = 0; i < IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS; i++)
+ {
+ Buffer *buffer = mState.transformFeedbackBuffers[i].get();
+ if (buffer)
+ {
+ buffer->markTransformFeedbackUsage();
+ }
+ }
+}
void Context::clear(GLbitfield mask)
{
@@ -2945,6 +2976,8 @@
return gl::error(err);
}
+ bool transformFeedbackActive = applyTransformFeedbackBuffers();
+
applyShaders(programBinary);
applyTextures(programBinary);
@@ -2961,6 +2994,11 @@
if (!skipDraw(mode))
{
mRenderer->drawArrays(mode, count, instances);
+
+ if (transformFeedbackActive)
+ {
+ markTransformFeedbackUsage();
+ }
}
}
@@ -3008,6 +3046,11 @@
return gl::error(err);
}
+ bool transformFeedbackActive = applyTransformFeedbackBuffers();
+ // Transform feedback is not allowed for DrawElements, this error should have been caught at the API validation
+ // layer.
+ ASSERT(!transformFeedbackActive);
+
applyShaders(programBinary);
applyTextures(programBinary);