diff options
author | Carl Worth <[email protected]> | 2012-12-13 15:23:10 -0800 |
---|---|---|
committer | Carl Worth <[email protected]> | 2013-01-15 13:34:18 -0800 |
commit | d9d857e24fef2ae5576523b861f46c426b94ba0d (patch) | |
tree | 690e2411f0cda487abe9f21f33254cb765da8246 /src/mesa/drivers | |
parent | c0b768ffee1ba84a4fcfcf41adf60e6d50cbafee (diff) |
i965: Force even an empty query to flush all previous queries.
The specification requires that query results are processed in order, (when
one query result is returned, all previous query of the same type must also be
available). The implementation was failing this requirement in the case of
BeginQuery and EndQuery with no intervening drawing, (the result would be made
available immediately without flushing previous queries).
This fixes the following es3conform test:
occlusion_query_query_order
as well as the following piglit test:
occlusion_query_order
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_queryobj.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c index b6143f9fc52..cd9c8488ba4 100644 --- a/src/mesa/drivers/dri/i965/brw_queryobj.c +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c @@ -320,6 +320,23 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q) case GL_ANY_SAMPLES_PASSED: case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: case GL_SAMPLES_PASSED_ARB: + + /* No query->bo means that EndQuery was called after BeginQuery with no + * intervening drawing. Rather than doing nothing at all here in this + * case, we emit the query_begin and query_end state to the + * hardware. This is to guarantee that waiting on the result of this + * empty state will cause all previous queries to complete at all, as + * required by the specification: + * + * It must always be true that if any query object + * returns a result available of TRUE, all queries of the + * same type issued prior to that query must also return + * TRUE. [Open GL 4.3 (Core Profile) Section 4.2.1] + */ + if (!query->bo) { + brw_emit_query_begin(brw); + } + if (query->bo) { brw_emit_query_end(brw); |