diff options
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 11 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_emit.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_flush.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_query.c | 7 | 
5 files changed, 16 insertions, 9 deletions
| diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 3a01869ba1..7826ed1452 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -175,6 +175,8 @@ struct r300_query {      unsigned offset;      /* if we've flushed the query */      boolean flushed; +    /* if begin has been emitted */ +    boolean begin_emitted;      /* Linked list members. */      struct r300_query* prev;      struct r300_query* next; diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index babbe0dd74..6e616cd5b2 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -340,6 +340,7 @@ void r300_emit_query_start(struct r300_context *r300)      }      OUT_CS_REG(R300_ZB_ZPASS_DATA, 0);      END_CS; +    query->begin_emitted = TRUE;  } @@ -429,10 +430,16 @@ static void rv530_emit_query_double(struct r300_context *r300,      END_CS;  } -void r300_emit_query_end(struct r300_context* r300, -                         struct r300_query* query) +void r300_emit_query_end(struct r300_context* r300)  {      struct r300_capabilities *caps = r300_screen(r300->context.screen)->caps; +    struct r300_query *query = r300->query_current; + +    if (!query) +	return; + +    if (query->begin_emitted == FALSE) +        return;      if (!r300->winsys->add_buffer(r300->winsys, r300->oqbo,                  0, RADEON_GEM_DOMAIN_GTT)) { diff --git a/src/gallium/drivers/r300/r300_emit.h b/src/gallium/drivers/r300/r300_emit.h index c4002b8e5d..b62aa9fec5 100644 --- a/src/gallium/drivers/r300/r300_emit.h +++ b/src/gallium/drivers/r300/r300_emit.h @@ -58,8 +58,7 @@ void r300_emit_fb_state(struct r300_context* r300,  void r300_emit_query_begin(struct r300_context* r300,                             struct r300_query* query); -void r300_emit_query_end(struct r300_context* r300, -                         struct r300_query* query); +void r300_emit_query_end(struct r300_context* r300);  void r300_emit_rs_state(struct r300_context* r300, struct r300_rs_state* rs); diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c index a8ab0d7212..241ea71d6b 100644 --- a/src/gallium/drivers/r300/r300_flush.c +++ b/src/gallium/drivers/r300/r300_flush.c @@ -36,6 +36,8 @@ static void r300_flush(struct pipe_context* pipe,          draw_flush(r300->draw);      } +    r300_emit_query_end(r300); +      if (r300->dirty_hw) {          FLUSH_CS;          r300_emit_invariant_state(r300); diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index fb4340ff3d..2b0fbfb7d2 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -88,14 +88,11 @@ static void r300_begin_query(struct pipe_context* pipe,  }  static void r300_end_query(struct pipe_context* pipe, -                           struct pipe_query* query) +	                   struct pipe_query* query)  {      struct r300_context* r300 = r300_context(pipe); -    struct r300_query* q = (struct r300_query*)query; - -    r300_emit_dirty_state(r300); -    r300_emit_query_end(r300, q); +    r300_emit_query_end(r300);      r300->query_current = NULL;  } | 
