如何测量GPU上下文切换从计算到渲染着色器

时间:2017-06-28 00:27:37

标签: c++ opengl opengl-es glsl compute-shader

在OpenGL中,我调度计算着色器以基于运动方程计算给定对象模型中的新顶点位置。然后我通过顶点/片段渲染着色器程序渲染这些新的顶点位置。我的理解是每次调度计算着色器时,它都会启动GPU设备上下文切换,这需要花费有限的时间。

有人可以分享如何在OpenGL中测量计算着色器和渲染着色器之间的上下文切换。我假设它的时间非常短,但我需要测量它。感谢您的见解。

2 个答案:

答案 0 :(得分:1)

无法专门测量上下文切换时间。您只能测量特定OpenGL命令之间的时间(通过计时器查询),并且没有OpenGL命令来执行上下文切换。它是您发送的实际OpenGL命令的副产品。

你能得到的最接近的是:

glBindVertexArray(emptyVAO);
glEnable(GL_RASTERIZER_DISCARD); //Do the absolute minimal rendering.
glBindProgramPipeline(minimalComputeTask); //Compute shader that does nothing, using no resources and writing no values.
glDispatchCompute(1, 1, 1); //Done before the timer query, to force a switch to compute contexts.
glBeginQuery(GL_TIME_ELAPSED​, queryObject);
glDispatchCompute(1, 1, 1);
glBindProgramPipeline(minimalRenderShaders); //VS does nothing and takes no inputs; no FS at all, since we're discarding.
glDrawArrays(GL_POINTS, 0, 1);
glEndQuery(GL_TIME_ELAPSED);
glDisable(GL_RASTERIZER_DISCARD);

然后提取查询并读取时间。但即使这样也包括实际执行计算和渲染操作所花费的时间。在你的情况下,你的时间可能应该包含一个glMemoryBarrier,它允许渲染操作读取计算着色器所写的内容。

答案 1 :(得分:0)

Timer queries听起来应该有效,假设你的GL实施meaningfully supports them

  

计时器查询是查询类型GL_TIMESTAMP和GL_TIME_ELAPSED的集合名称。 这些用于测量各种操作的GPU时序。返回的所有时间都以纳秒为单位。