void MetricBackend_AMD_perfmon::endPass() { if (supported && numPasses) { for (unsigned k = 0; k < curMonitor; k++) { freeMonitor(k); } glDeletePerfMonitorsAMD(NUM_MONITORS, monitors); } curPass++; collector.endPass(); }
void MetricBackend_AMD_perfmon::beginQuery(QueryBoundary boundary) { if (!supported || !numPasses) return; if (boundary == QUERY_BOUNDARY_CALL) return; if ((boundary == QUERY_BOUNDARY_FRAME) && !perFrame) return; if ((boundary == QUERY_BOUNDARY_DRAWCALL) && perFrame) return; curMonitor %= NUM_MONITORS; if (!firstRound) freeMonitor(curMonitor); // get existing data monitorEvent[curMonitor] = curEvent; // save monitored event glBeginPerfMonitorAMD(monitors[curMonitor]); queryInProgress = true; }
void MetricBackend_AMD_perfmon::pausePass() { if (!supported || !numPasses) return; // clear all queries and monitors // ignore data from the query in progress if (queryInProgress) { glEndPerfMonitorAMD(monitors[curMonitor]); curEvent++; queryInProgress = false; } for (unsigned k = 0; k < curMonitor; k++) { freeMonitor(k); } glDeletePerfMonitorsAMD(NUM_MONITORS, monitors); }
/* * Frees monitor objects belonging to unmarked objects. */ void dvmSweepMonitorList(Monitor** mon, int (*isUnmarkedObject)(void*)) { Monitor handle; Monitor *prev, *curr; Object *obj; assert(mon != NULL); assert(isUnmarkedObject != NULL); prev = &handle; prev->next = curr = *mon; while (curr != NULL) { obj = curr->obj; if (obj != NULL && (*isUnmarkedObject)(obj) != 0) { prev->next = curr->next; freeMonitor(curr); curr = prev->next; } else { prev = curr; curr = curr->next; } } *mon = handle.next; }