void MetricBackend_INTEL_perfquery::freeQuery(unsigned event) { GLuint size; GLuint bWritten; glGetPerfQueryInfoINTEL(curQueryMetrics->first, 0, nullptr, &size, nullptr, nullptr, nullptr); unsigned char* data = collector.newDataBuffer(event, size); glFlush(); glGetPerfQueryDataINTEL(curQuery, GL_PERFQUERY_WAIT_INTEL, size, data, &bWritten); // bWritten != size -> should generate error TODO }
void MetricBackend_INTEL_perfquery::enumMetrics(unsigned group, enumMetricsCallback callback, void* userData) { unsigned numMetrics; glGetPerfQueryInfoINTEL(group, 0, nullptr, nullptr, &numMetrics, nullptr, nullptr); for (int i = 1; i <= numMetrics; i++) { Metric_INTEL_perfquery metric = Metric_INTEL_perfquery(group, i); callback(&metric, 0, userData); } }
int MetricBackend_INTEL_perfquery::enableMetric(Metric* metric_, QueryBoundary pollingRule) { if (pollingRule == QUERY_BOUNDARY_CALL) return 1; unsigned id = metric_->id(); unsigned gid = metric_->groupId(); unsigned numCounters; /* check that counter id is in valid range and group exists */ glGetError(); glGetPerfQueryInfoINTEL(gid, 0, nullptr, nullptr, &numCounters, nullptr, nullptr); GLenum err = glGetError(); if (gid >= numCounters || err == GL_INVALID_VALUE) { return 1; } Metric_INTEL_perfquery metric(gid, id); metric.offset(); // triggers metric vars precache (in case context changes) passes[pollingRule][gid].push_back(metric); return 0; }
std::string MetricBackend_INTEL_perfquery::getGroupName(unsigned group) { char name[INTEL_NAME_LENGTH]; glGetPerfQueryInfoINTEL(group, INTEL_NAME_LENGTH, name, nullptr, nullptr, nullptr, nullptr); return std::string(name); }
bool initPerf() { GLint QueryNameMaxLength = 0; glGetIntegerv(GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL, &QueryNameMaxLength); GLint CounterNameMaxLength = 0; glGetIntegerv(GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL, &CounterNameMaxLength); GLint CounterDescMaxLength = 0; glGetIntegerv(GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL, &CounterDescMaxLength); const GLuint queryNameLen = 1024; GLchar queryName[queryNameLen]; const GLuint counterNameLen = 1024; GLchar counterName[counterNameLen]; const GLuint counterDescLen = 4096; GLchar counterDesc[counterDescLen]; GLuint queryId; glGetFirstPerfQueryIdINTEL(&queryId); while(queryId) { GLuint dataSize = 0; GLuint noCounters = 0; GLuint noInstances = 0; GLuint capsMask = 0; memset(queryName, 0, sizeof(queryName)); glGetPerfQueryInfoINTEL( queryId, QueryNameMaxLength, queryName, &dataSize, &noCounters, &noInstances, &capsMask); printf("%d - %s (%s)/ output size: %d, counters: %d, instances: %d\n", queryId, queryName, capsMask & GL_PERFQUERY_GLOBAL_CONTEXT_INTEL ? "global" : "local", dataSize, noCounters, noInstances); glGetNextPerfQueryIdINTEL(queryId, &queryId); for(GLuint counterId = 1; counterId <= noCounters; counterId++) { GLuint counterOffset = 0; GLuint counterDataSize = 0; GLuint counterTypeEnum = 0; GLuint counterDataTypeEnum = 0; GLuint64 rawCounterMaxValue = 0; memset(counterName, 0, sizeof(counterName)); memset(counterDesc, 0, sizeof(counterDesc)); glGetPerfCounterInfoINTEL( queryId, counterId, CounterNameMaxLength, counterName, CounterDescMaxLength, counterDesc, &counterOffset, &counterDataSize, &counterTypeEnum, &counterDataTypeEnum, &rawCounterMaxValue); printf("- %d - %s output: %s - %s - %d, max counter values: %lld\n", counterId, counterName, GetCounterTypeString(counterTypeEnum), GetCounterDataTypeString(counterDataTypeEnum), dataSize, rawCounterMaxValue); printf("\t%s\n", counterDesc); continue; } } return true; }