Add program cache transform feedback workaround.
On Qualcomm devices, they don't seem to correctly save transform
feedback info. Work around this by disabling caching on these devices.
This mirrors a Chromium workaround.
BUG=angleproject:2088
Change-Id: I6496d2fb6a03788379a6968bcd5eb3a9cb9d15d4
Reviewed-on: https://chromium-review.googlesource.com/549981
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp
index a7c6dc1..c851762 100644
--- a/src/libANGLE/MemoryProgramCache.cpp
+++ b/src/libANGLE/MemoryProgramCache.cpp
@@ -151,6 +151,15 @@
}
unsigned int transformFeedbackVaryingCount = stream.readInt<unsigned int>();
+
+ // Reject programs that use transform feedback varyings if the hardware cannot support them.
+ if (transformFeedbackVaryingCount > 0 &&
+ context->getWorkarounds().disableProgramCachingForTransformFeedback)
+ {
+ infoLog << "Current driver does not support transform feedback in binary programs.";
+ return false;
+ }
+
ASSERT(state->mLinkedTransformFeedbackVaryings.empty());
for (unsigned int transformFeedbackVaryingIndex = 0;
transformFeedbackVaryingIndex < transformFeedbackVaryingCount;
@@ -305,6 +314,14 @@
}
}
+ // Warn the app layer if saving a binary with unsupported transform feedback.
+ if (!state.getLinkedTransformFeedbackVaryings().empty() &&
+ context->getWorkarounds().disableProgramCachingForTransformFeedback)
+ {
+ WARN() << "Saving program binary with transform feedback, which is not supported on this "
+ "driver.";
+ }
+
stream.writeInt(state.getLinkedTransformFeedbackVaryings().size());
for (const auto &var : state.getLinkedTransformFeedbackVaryings())
{