+ /* Rendering often has no side effects, but it can in some cases,
+ * (such as when transform feedback is active, or when rendering
+ * targets a framebuffer object). */
+ bool renderingHasSideEffect() {
+ return transformFeedbackActive || framebufferObjectActive;
+ }
+
+ /* Provide: Record that the given call affects the given resource
+ * as a side effect. */
+ void provide(const char *resource, trace::CallNo call_no) {
+ resources[resource].insert(call_no);
+ }
+
+ /* Consume: Add all calls that provide the given resource to the
+ * required list, then clear the list for this resource. */
+ void consume(const char *resource) {
+
+ std::set<unsigned> *calls;
+ std::set<unsigned>::iterator call;
+
+ /* Insert as required all calls that provide 'resource',
+ * then clear these calls. */
+ if (resources.count(resource)) {
+ calls = &resources[resource];
+ for (call = calls->begin(); call != calls->end(); call++) {
+ required.insert(*call);
+ }
+ resources.erase(resource);
+ }
+ }
+
+ void stateTrackPreCall(trace::Call *call) {
+
+ if (strcmp(call->name(), "glBegin") == 0) {
+ insideBeginEnd = true;
+ return;
+ }
+
+ if (strcmp(call->name(), "glBeginTransformFeedback") == 0) {
+ transformFeedbackActive = true;
+ return;
+ }
+
+ if (strcmp(call->name(), "glBindFramebuffer") == 0) {
+ GLenum target;
+ GLuint framebuffer;
+
+ target = static_cast<GLenum>(call->arg(0).toSInt());
+ framebuffer = call->arg(1).toUInt();
+
+ if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) {
+ if (framebuffer == 0) {
+ framebufferObjectActive = false;
+ } else {
+ framebufferObjectActive = true;
+ }
+ }
+ return;
+ }
+ }
+
+ void stateTrackPostCall(trace::Call *call) {
+
+ if (strcmp(call->name(), "glEnd") == 0) {
+ insideBeginEnd = false;
+ return;
+ }
+
+ if (strcmp(call->name(), "glEndTransformFeedback") == 0) {
+ transformFeedbackActive = false;
+ return;
+ }
+
+ if (call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET &&
+ call->flags & trace::CALL_FLAG_END_FRAME) {
+ resources.erase("framebuffer");
+ return;
+ }
+ }
+
+ void recordSideEffects(trace::Call *call) {
+ /* If call is flagged as no side effects, then we are done here. */