r300g: fix BO space accounting for occlusion queries
authorMarek Olšák <maraeo@gmail.com>
Sat, 15 May 2010 17:31:35 +0000 (19:31 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 15 May 2010 17:39:57 +0000 (19:39 +0200)
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_flush.c
src/gallium/drivers/r300/r300_query.c

index 74a56cc5780e934c4fc11aaede341f5992a700a3..49a51fb9360540949335361276af9d36fc4e0494 100644 (file)
@@ -651,6 +651,8 @@ void r300_emit_query_end(struct r300_context* r300)
             rv530_emit_query_end_single_z(r300, query);
     } else 
         r300_emit_query_end_frag_pipes(r300, query);
+
+    query->begin_emitted = FALSE;
 }
 
 void r300_emit_rs_state(struct r300_context* r300, unsigned size, void* state)
@@ -1094,7 +1096,8 @@ validate:
         }
     }
     /* ...occlusion query buffer... */
-    if (r300->query_start.dirty) {
+    if (r300->query_start.dirty ||
+        (r300->query_current && r300->query_current->begin_emitted)) {
         if (!r300_add_buffer(r300->rws, r300->oqbo,
                             0, RADEON_GEM_DOMAIN_GTT)) {
             r300->context.flush(&r300->context, 0, NULL);
index e78c6a3624f5c2a08f112445ab7a5352a770182c..ad7cae7bf53c4c95048dfb77fbd94c7f3590b0e8 100644 (file)
@@ -48,9 +48,9 @@ static void r300_flush(struct pipe_context* pipe,
         draw_flush(r300->draw);
     }
 
-    r300_emit_query_end(r300);
-
     if (r300->dirty_hw) {
+        r300_emit_query_end(r300);
+
         FLUSH_CS;
         r300->dirty_hw = 0;
 
index 9bd28537e00a8dc2fbac7882218df3804dedbdd0..0067b0345dcab8384b003cdb6f833dad05a64490 100644 (file)
@@ -103,7 +103,6 @@ static void r300_end_query(struct pipe_context* pipe,
                           struct pipe_query* query)
 {
     struct r300_context* r300 = r300_context(pipe);
-    struct r300_query* q = (struct r300_query*)query;
 
     if ((struct r300_query*)query != r300->query_current) {
         fprintf(stderr, "r300: end_query: Got invalid query.\n");
@@ -112,7 +111,6 @@ static void r300_end_query(struct pipe_context* pipe,
     }
 
     r300_emit_query_end(r300);
-    q->begin_emitted = false;
     r300->query_current = NULL;
 }