bool transformFeedbackActive;
bool framebufferObjectActive;
bool insideBeginEnd;
+ GLuint insideNewEndList;
GLuint activeProgram;
GLenum activeTextureUnit;
}
return;
}
+
+ if (strcmp(name, "glNewList") == 0) {
+ GLuint list = call->arg(0).toUInt();
+
+ insideNewEndList = list;
+ }
}
void stateTrackPostCall(trace::Call *call) {
resources.erase("framebuffer");
return;
}
+
+ if (strcmp(name, "glEndList") == 0) {
+ insideNewEndList = 0;
+ }
}
void recordSideEffects(trace::Call *call) {
const char *name = call->name();
+ /* Handle display lists before any other processing. */
+
+ /* FIXME: If we encode the list of commands that are executed
+ * immediately (as opposed to those that are compiled into a
+ * display list) then we could generate a "display-list-X"
+ * resource just as we do for "texture-X" resources and only
+ * emit it in the trace if a glCallList(X) is emitted. For
+ * now, simply punt and include anything within glNewList and
+ * glEndList in the trim output. This guarantees that display
+ * lists will work, but does not trim out unused display
+ * lists. */
+ if (insideNewEndList != 0) {
+ provide("state", call->no);
+
+ /* Also, any texture bound inside a display list is
+ * conservatively considered required. */
+ if (strcmp(name, "glBindTexture") == 0) {
+ GLuint texture = call->arg(1).toUInt();
+
+ linkf("state", "texture-", texture);
+ }
+
+ return;
+ }
+
/* If call is flagged as no side effects, then we are done here. */
if (call->flags & trace::CALL_FLAG_NO_SIDE_EFFECTS) {
return;
unlinkAll(ss_target.str());
link(ss_target.str(), ss_texture.str());
+ /* FIXME: This really shouldn't be necessary. The effect
+ * this provide() has is that all glBindTexture calls will
+ * be preserved in the output trace (never trimmed). Carl
+ * has a trace ("btr") where a glBindTexture call should
+ * not be necessary at all, (it's immediately followed
+ * with a glBindTexture to a different texture and no
+ * intervening texture-related calls), yet this 'provide'
+ * makes the difference between a trim_stress test failing
+ * and passing.
+ *
+ * More investigation is necessary, but for now, be
+ * conservative and don't trim. */
+ provide("state", call->no);
+
return;
}
TraceAnalyzer(): transformFeedbackActive(false),
framebufferObjectActive(false),
insideBeginEnd(false),
+ insideNewEndList(0),
activeTextureUnit(GL_TEXTURE0)
{}