我想使用查询系统来检索片段着色器的执行时间。
我正在创建一个包含两个时间戳查询的查询池,而我正在使用vkCmdWriteTimestamp
。
device.cmd_draw_indexed(draw_command_buffer, 6, 1, 0, 0, 1);
device.cmd_write_timestamp(
draw_command_buffer,
vk::PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
query_pool,
0,
);
device.cmd_write_timestamp(
draw_command_buffer,
vk::PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
query_pool,
1,
);
device.cmd_end_render_pass(draw_command_buffer);
我需要指定哪些管道阶段才能跟踪片段着色器的时间?
当所有先前的命令已完成执行到指定的管道阶段时,vkCmdWriteTimestamp锁存定时器的值,并将时间戳值写入内存。写入时间戳值时,查询的可用性状态将设置为可用。
这是否包含指定的管道阶段?例如,如果我指定VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
,它会在片段着色器完成之前或之后锁定计时器吗?
我何时需要致电vkCmdWriteTimestamp
?我注意到如果两个对vkCmdWriteTimestamp
的调用都直接在彼此之上,那么得到的delta将接近0.最初我认为当我调用它们时它不应该是因为我指定了管道阶段
答案 0 :(得分:3)
您似乎误解了这些功能正在做什么。它们不会检测执行这些阶段所需的时间。它们检测系统在命令流中到达那个阶段所需的时间。
也就是说,如果您使用“EARLY_FRAGMENT_TESTS_BIT”,那么您要问的问题是“所有先前命令执行完毕直到他们完成早期片段测试的时间是什么时候。” “FRAGMENT_SHADER_BIT”也是如此。这意味着它们之间的时间差异实际上是不存在的;它将是最后一个原始数据执行其片段着色器的最后一个原始数据所花费的时间。
或者更糟糕的是,执行两个查询命令之间的时间。毕竟,他们不是免费的。
请记住:渲染命令是流水线的。虽然一些基元正在进行早期的片段测试,但其他基元正在运行片段着色器,而其他基元仍在运行FS后的东西。等等。
正如标准所说,时间戳用于“定时执行命令”,而不是执行流水线阶段。无法测量管道阶段的执行时间。