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);
}
Exemplo n.º 4
0
/*
 * 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;
}