// redraw the window void display(void) { if(glutGetWindow() == mainwinid) { #ifdef OSG_WITH_NVPERFSDK if(nvDataProvider->nCounters()) { nvDataProvider->sample(); OSG::Char8 str[40]; for(int i = 0; nvStatElems[i] != NULL; ++i) { if(collector != NULL) { sprintf(str, "%s: %f", nvStatElems[i]->getDescription().c_str(), nvDataProvider->value(i)); OSG::StatStringElem *e = dynamic_cast<OSG::StatStringElem*>( collector->getElem(*nvStatElems[i])); e->set(str); } } } if(runExperiment) { int nCount; const char *expCounters[] = { "2D Bottleneck", "2D SOL", "IDX Bottleneck", "IDX SOL", "GEOM Bottleneck", "GEOM SOL", "ZCULL Bottleneck", "ZCULL SOL", "TEX Bottleneck", "TEX SOL", "ROP Bottleneck", "ROP SOL", "SHD Bottleneck", "SHD SOL", "FB Bottleneck", "FB SOL", "GPU Bottleneck", // Needs to be last NULL }; for(int i = 0; expCounters[i] != NULL; ++i) { NVPMAddCounterByName(const_cast<char *>(expCounters[i])); } NVPMBeginExperiment(&nCount); FLOG(("NVPerfKitSDK: Running %d passes\n", nCount)); for(int i = 0; i < nCount; i++) { NVPMBeginPass(i); mgr->redraw(); NVPMEndPass(i); } NVPMEndExperiment(); UINT64 value, cycles; for(int i = 0; expCounters[i] != NULL; ++i) { NVPMGetCounterValueByName(const_cast<char *>(expCounters[i]), 0, &value, &cycles); FLOG(("%s: %lld value, %lld cycles (%.4f%%)\n", expCounters[i], value, cycles, value * 100. / cycles)); } char buffer[1000] = ""; NVPMGetGPUBottleneckName(value, buffer); FLOG(("GPU Bottleneck: '%s'\n", buffer)); for(int i = 0; expCounters[i] != NULL; ++i) { //NVPMRemoveCounterByName(expCounters[i]); } runExperiment = false; } #endif mgr->redraw(); } else if(glutGetWindow() == debugwinid) { // Use RenderAction to prevent new occlusion culling on debug output debugwin->render(debugact); } }