At the very least the query API is coming in WebGL 2.0, and it seems like everyone is OK with the API format described in that spec. That gets us over one of the bigger hurdles, and may open the way for queries to be exposed to WebGL 1.0 as an extension.
I'm not sure about the rest of the arguments surrounding support or non-intuitive results.
glFinish() can be used to determine when previous rendering commands have been completed, but will idle the graphics pipeline and adversely affect application performance.
(10) What about tile-based implementations? The effects of a command are not complete until the frame is completely rendered. Timing recorded before the frame is complete may not be what developers expect. Also the amount of time needed to render the same primitives is not consistent, which conflicts with issue (8) above. The time depends on how early or late in the scene it is placed. RESOLVED: The current language supports tile-based rendering okay as it is written. Developers are warned that using timers on tile-based implementation may not produce results they expect since rendering is not done in a linear order. Timing results are calculated when the frame is completed and may depend on how early or late in the scene it is placed.
In order to know if the value returned from GetIntegerv or GetQuery is valid
GPU_DISJOINT_EXT needs to be used to make sure the GPU did not perform any
disjoint operation. This can be done through GetIntegerv by using GPU_-
DISJOINT_EXT for <pname>. <params> will be filled with a non-zero value if
a disjoint operation occurred since the last time GetIntegerv was used with
GPU_DISJOINT_EXT. A zero value will be returned if no disjoint operation
occurred, indicating the values returned by this extension that are found
in-between subsequent GetIntegerv calls will be valid for performance
Disjoint operations occur whenever a change in the GPU occurs that will
make the values returned by this extension unusable for performance
metrics. An example can be seen with how mobile GPUs need to proactively
try to conserve power, which might cause the GPU to go to sleep at the
lower levers. This means disjoint states will occur at different times on
different platforms and are implementation dependent. When the returned
value is non-zero, all time values that were filled since the previous
disjoint check should be considered undefined."