mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
nv50,nvc0: use condition for occlusion queries when already complete
For the NO_WAIT variants, we would jump into the ALWAYS case for both nested and inverted occlusion queries. However if the query had previously completed, the application could reasonably expect that the render condition would follow that result. To resolve this, we remove the nesting distinction which unnecessarily created an imbalance between the regular and inverted cases (since there's no "zero" condition mode). We also use the proper comparison if we know that the query has completed (which could happen as a result of an earlier get_query_result call). Fixes KHR-GL45.conditional_render_inverted.functional Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: 19.0 <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
162352e671
commit
e00799d3dc
6 changed files with 25 additions and 28 deletions
|
|
@ -98,12 +98,10 @@ nv50_render_condition(struct pipe_context *pipe,
|
|||
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
|
||||
if (hq->state == NV50_HW_QUERY_STATE_READY)
|
||||
wait = true;
|
||||
if (likely(!condition)) {
|
||||
if (unlikely(hq->nesting))
|
||||
cond = wait ? NV50_3D_COND_MODE_NOT_EQUAL :
|
||||
NV50_3D_COND_MODE_ALWAYS;
|
||||
else
|
||||
cond = NV50_3D_COND_MODE_RES_NON_ZERO;
|
||||
cond = wait ? NV50_3D_COND_MODE_NOT_EQUAL : NV50_3D_COND_MODE_ALWAYS;
|
||||
} else {
|
||||
cond = wait ? NV50_3D_COND_MODE_EQUAL : NV50_3D_COND_MODE_ALWAYS;
|
||||
}
|
||||
|
|
@ -129,7 +127,7 @@ nv50_render_condition(struct pipe_context *pipe,
|
|||
|
||||
PUSH_SPACE(push, 9);
|
||||
|
||||
if (wait) {
|
||||
if (wait && hq->state != NV50_HW_QUERY_STATE_READY) {
|
||||
BEGIN_NV04(push, SUBC_3D(NV50_GRAPH_SERIALIZE), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,11 +29,6 @@
|
|||
#include "nv50/nv50_query_hw_sm.h"
|
||||
#include "nv_object.xml.h"
|
||||
|
||||
#define NV50_HW_QUERY_STATE_READY 0
|
||||
#define NV50_HW_QUERY_STATE_ACTIVE 1
|
||||
#define NV50_HW_QUERY_STATE_ENDED 2
|
||||
#define NV50_HW_QUERY_STATE_FLUSHED 3
|
||||
|
||||
/* XXX: Nested queries, and simultaneous queries on multiple gallium contexts
|
||||
* (since we use only a single GPU channel per screen) will not work properly.
|
||||
*
|
||||
|
|
@ -158,8 +153,7 @@ nv50_hw_begin_query(struct nv50_context *nv50, struct nv50_query *q)
|
|||
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
|
||||
hq->nesting = nv50->screen->num_occlusion_queries_active++;
|
||||
if (hq->nesting) {
|
||||
if (nv50->screen->num_occlusion_queries_active++) {
|
||||
nv50_hw_query_get(push, q, 0x10, 0x0100f002);
|
||||
} else {
|
||||
PUSH_SPACE(push, 4);
|
||||
|
|
|
|||
|
|
@ -6,6 +6,11 @@
|
|||
|
||||
#include "nv50_query.h"
|
||||
|
||||
#define NV50_HW_QUERY_STATE_READY 0
|
||||
#define NV50_HW_QUERY_STATE_ACTIVE 1
|
||||
#define NV50_HW_QUERY_STATE_ENDED 2
|
||||
#define NV50_HW_QUERY_STATE_FLUSHED 3
|
||||
|
||||
#define NVA0_HW_QUERY_STREAM_OUTPUT_BUFFER_OFFSET (PIPE_QUERY_TYPES + 0)
|
||||
|
||||
struct nv50_hw_query;
|
||||
|
|
@ -29,7 +34,6 @@ struct nv50_hw_query {
|
|||
uint8_t state;
|
||||
bool is64bit;
|
||||
uint8_t rotate;
|
||||
int nesting; /* only used for occlusion queries */
|
||||
struct nouveau_mm_allocation *mm;
|
||||
struct nouveau_fence *fence;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -121,12 +121,10 @@ nvc0_render_condition(struct pipe_context *pipe,
|
|||
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
|
||||
if (hq->state == NVC0_HW_QUERY_STATE_READY)
|
||||
wait = true;
|
||||
if (likely(!condition)) {
|
||||
if (unlikely(hq->nesting))
|
||||
cond = wait ? NVC0_3D_COND_MODE_NOT_EQUAL :
|
||||
NVC0_3D_COND_MODE_ALWAYS;
|
||||
else
|
||||
cond = NVC0_3D_COND_MODE_RES_NON_ZERO;
|
||||
cond = wait ? NVC0_3D_COND_MODE_NOT_EQUAL : NVC0_3D_COND_MODE_ALWAYS;
|
||||
} else {
|
||||
cond = wait ? NVC0_3D_COND_MODE_EQUAL : NVC0_3D_COND_MODE_ALWAYS;
|
||||
}
|
||||
|
|
@ -151,7 +149,7 @@ nvc0_render_condition(struct pipe_context *pipe,
|
|||
return;
|
||||
}
|
||||
|
||||
if (wait)
|
||||
if (wait && hq->state != NVC0_HW_QUERY_STATE_READY)
|
||||
nvc0_hw_query_fifo_wait(nvc0, q);
|
||||
|
||||
PUSH_SPACE(push, 10);
|
||||
|
|
|
|||
|
|
@ -28,11 +28,6 @@
|
|||
#include "nvc0/nvc0_query_hw_metric.h"
|
||||
#include "nvc0/nvc0_query_hw_sm.h"
|
||||
|
||||
#define NVC0_HW_QUERY_STATE_READY 0
|
||||
#define NVC0_HW_QUERY_STATE_ACTIVE 1
|
||||
#define NVC0_HW_QUERY_STATE_ENDED 2
|
||||
#define NVC0_HW_QUERY_STATE_FLUSHED 3
|
||||
|
||||
#define NVC0_HW_QUERY_ALLOC_SPACE 256
|
||||
|
||||
bool
|
||||
|
|
@ -158,14 +153,18 @@ nvc0_hw_begin_query(struct nvc0_context *nvc0, struct nvc0_query *q)
|
|||
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE:
|
||||
case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
|
||||
hq->nesting = nvc0->screen->num_occlusion_queries_active++;
|
||||
if (hq->nesting) {
|
||||
if (nvc0->screen->num_occlusion_queries_active++) {
|
||||
nvc0_hw_query_get(push, q, 0x10, 0x0100f002);
|
||||
} else {
|
||||
PUSH_SPACE(push, 3);
|
||||
BEGIN_NVC0(push, NVC0_3D(COUNTER_RESET), 1);
|
||||
PUSH_DATA (push, NVC0_3D_COUNTER_RESET_SAMPLECNT);
|
||||
IMMED_NVC0(push, NVC0_3D(SAMPLECNT_ENABLE), 1);
|
||||
/* Given that the counter is reset, the contents at 0x10 are
|
||||
* equivalent to doing the query -- we would get hq->sequence as the
|
||||
* payload and 0 as the reported value. This is already set up above
|
||||
* as in the hq->rotate case.
|
||||
*/
|
||||
}
|
||||
break;
|
||||
case PIPE_QUERY_PRIMITIVES_GENERATED:
|
||||
|
|
|
|||
|
|
@ -6,6 +6,11 @@
|
|||
|
||||
#include "nvc0_query.h"
|
||||
|
||||
#define NVC0_HW_QUERY_STATE_READY 0
|
||||
#define NVC0_HW_QUERY_STATE_ACTIVE 1
|
||||
#define NVC0_HW_QUERY_STATE_ENDED 2
|
||||
#define NVC0_HW_QUERY_STATE_FLUSHED 3
|
||||
|
||||
#define NVC0_HW_QUERY_TFB_BUFFER_OFFSET (PIPE_QUERY_TYPES + 0)
|
||||
|
||||
struct nvc0_hw_query;
|
||||
|
|
@ -29,7 +34,6 @@ struct nvc0_hw_query {
|
|||
uint8_t state;
|
||||
boolean is64bit;
|
||||
uint8_t rotate;
|
||||
int nesting; /* only used for occlusion queries */
|
||||
struct nouveau_mm_allocation *mm;
|
||||
struct nouveau_fence *fence;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue