Validate that transform feedback buffers are not mapped.
Mapping a buffer that is bound for active transform feedback or starting
transform feedback on a mapped buffer is undefined behaviour under
section 2.10.3.2 of the ES 3.0 spec "Effects of Mapping Buffers on Other
GL Commands". The spec suggests that an error is generated in this
case.
TEST=ES3MapBufferRangeTest.TransformFeedback
BUG=754000
Change-Id: I613defd07cc1a4348682d992cda61cc898936720
Reviewed-on: https://chromium-review.googlesource.com/614483
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 2810c11..3ad049c 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -2777,7 +2777,7 @@
return false;
}
- return true;
+ return ValidateMapBufferBase(context, target);
}
bool ValidateUnmapBufferOES(Context *context, GLenum target)
@@ -2806,6 +2806,30 @@
return ValidateMapBufferRangeBase(context, target, offset, length, access);
}
+bool ValidateMapBufferBase(Context *context, GLenum target)
+{
+ Buffer *buffer = context->getGLState().getTargetBuffer(target);
+ ASSERT(buffer != nullptr);
+
+ // Check if this buffer is currently being used as a transform feedback output buffer
+ TransformFeedback *transformFeedback = context->getGLState().getCurrentTransformFeedback();
+ if (transformFeedback != nullptr && transformFeedback->isActive())
+ {
+ for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
+ {
+ const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
+ if (transformFeedbackBuffer.get() == buffer)
+ {
+ context->handleError(InvalidOperation()
+ << "Buffer is currently bound for transform feedback.");
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
bool ValidateFlushMappedBufferRangeEXT(Context *context,
GLenum target,
GLintptr offset,