void PerfQueryGLESNV::FlushOne() { auto& entry = m_query_buffer[m_query_read_pos]; GLuint result = 0; glGetOcclusionQueryuivNV(entry.query_id, GL_OCCLUSION_TEST_RESULT_HP, &result); // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); m_query_read_pos = (m_query_read_pos + 1) % m_query_buffer.size(); --m_query_count; }
//------------------------------------------------------------------ bool GLHardwareOcclusionQuery::isStillOutstanding(void) { GLuint available = GL_FALSE; if(GLEW_VERSION_1_5 || GLEW_ARB_occlusion_query) { glGetQueryObjectuivARB(mQueryID, GL_QUERY_RESULT_AVAILABLE_ARB, &available); } else if (GLEW_NV_occlusion_query) { glGetOcclusionQueryuivNV(mQueryID, GL_PIXEL_COUNT_AVAILABLE_NV, &available); } // GL_TRUE means a wait would occur return !(available == GL_TRUE); }
//------------------------------------------------------------------ bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments ) { if(GLEW_VERSION_1_5 || GLEW_ARB_occlusion_query) { glGetQueryObjectuivARB(mQueryID, GL_QUERY_RESULT_ARB, (GLuint*)NumOfFragments); mPixelCount = *NumOfFragments; return true; } else if (GLEW_NV_occlusion_query) { glGetOcclusionQueryuivNV(mQueryID, GL_PIXEL_COUNT_NV, (GLuint*)NumOfFragments); mPixelCount = *NumOfFragments; return true; } return false; }
void PerfQueryGLESNV::WeakFlush() { while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; GLuint result = GL_FALSE; glGetOcclusionQueryuivNV(entry.query_id, GL_PIXEL_COUNT_AVAILABLE_NV, &result); if (GL_TRUE == result) { FlushOne(); } else { break; } } }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglGetOcclusionQueryuivNV(JNIEnv *env, jclass clazz, jint id, jint pname, jobject params, jint params_position, jlong function_pointer) { GLuint *params_address = ((GLuint *)(*env)->GetDirectBufferAddress(env, params)) + params_position; glGetOcclusionQueryuivNVPROC glGetOcclusionQueryuivNV = (glGetOcclusionQueryuivNVPROC)((intptr_t)function_pointer); glGetOcclusionQueryuivNV(id, pname, params_address); }