diff --git a/third_party/angle/src/libANGLE/validationES3.cpp b/third_party/angle/src/libANGLE/validationES3.cpp index 9ad4e63d68..a9287df02f 100644 --- a/third_party/angle/src/libANGLE/validationES3.cpp +++ b/third_party/angle/src/libANGLE/validationES3.cpp @@ -4149,6 +4149,30 @@ bool ValidateResumeTransformFeedback(const Context *context, angle::EntryPoint e return false; } + // Mirror the checks performed by ValidateBeginTransformFeedback: it is + // possible to map an XFB output buffer while the TF is paused (via a + // second TF object), so re-check on resume. + for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++) + { + const OffsetBindingPointer &buffer = transformFeedback->getIndexedBuffer(i); + if (buffer.get()) + { + if (buffer->isMapped()) + { + ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferMapped); + return false; + } + if ((context->getLimitations().noDoubleBoundTransformFeedbackBuffers || + context->getExtensions().webglCompatibilityANGLE) && + buffer->isDoubleBoundForTransformFeedback()) + { + ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, + kTransformFeedbackBufferMultipleOutputs); + return false; + } + } + } + if (!ValidateProgramExecutableXFBBuffersPresent( context, context->getState().getLinkedProgramExecutable(context))) {