toge's diary

コンピュータ関連の趣味をつらつらと。

GL_EXT_timer_queryで遊んでみました

#define GL_TIME_ELAPSED_EXT 0x88BF 

としましょう。後はGL_ARB_occlusion_queryと同じですね。

  GLuint queryID;
  glGenQueries(1, &queryID);
  glBeginQuery(GL_TIME_ELAPSED_EXT);
  ...(何か描画)...
  glEndQuery(GL_TIME_ELAPSED_EXT);
  
  GLint resultAvailable = GL_FALSE;
  glGetQueryObjectiv(queryID_, GL_QUERY_RESULT_AVAILABLE, &resultAvailable);
  if (resultAvailable) {
    GLint result;
    glGetQueryObjectiv(queryID_, GL_QUERY_RESULT, &result);
    printf("query time %d\n", result);
  }

うーんGL_QUERY_RESULT_AVAILABLEは常に0を返しちゃうな。それを無視して値を取るとなんか中途半端な値が取れました。
左がGetQueryObjectivの値、右がgettimeofdayで取得した値です。

269504, 0.000223sec
271233, 0.000160sec
272897, 0.000166sec

どういう値が取れているのか知りたいんですけど、GL_EXT_timer_queryもGL_NV_timer_queryもファイルがないのよね。
http://oss.sgi.com/projects/ogl-sample/registry/NV/timer_query.txt

なんとなくの予想でGPUでかかった時間を10^(-10)secの値で入っているのかなぁと思ったりしますが、うーん-10乗(0.1 nano or 100 pico)ってちょっと中途半端だよね。gettimeofdayの値が正しいかどうかも不明だし。
正しい仕様が知りたいなぁ。

その後にふとGPUのクロック数かと考えたのですが、nvclockでGPUのclockを変更すると値が線形で変化するので、やっぱり時間みたいだ。