summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-09-22 14:59:09 -0400
committerJerome Glisse <jglisse@redhat.com>2010-09-22 14:59:09 -0400
commitf060ae9ab6492446dbaf4d55665822c11a72d509 (patch)
tree8b80623575286caae22b24945223eb18fd7b91b4
parentb8835a3992edb7b01712ea83b5729ef0f6f94e4f (diff)
r600g: fix multiple occlusion query on same id
When calling query begin using same query id we need to discard previous query results. Signed-off-by: Jerome Glisse <jglisse@redhat.com>
-rw-r--r--src/gallium/drivers/r600/r600_context.c4
-rw-r--r--src/gallium/drivers/r600/r600_state2.c10
2 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/drivers/r600/r600_context.c b/src/gallium/drivers/r600/r600_context.c
index 7a63d966eb..18ff793689 100644
--- a/src/gallium/drivers/r600/r600_context.c
+++ b/src/gallium/drivers/r600/r600_context.c
@@ -69,7 +69,7 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
{
struct r600_context *rctx = r600_context(ctx);
struct r600_query *rquery = NULL;
-#if 0
+#if 1
static int dc = 0;
char dname[256];
#endif
@@ -84,7 +84,7 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
#if 0
sprintf(dname, "gallium-%08d.bof", dc);
- if (dc < 2) {
+ if (dc < 20) {
radeon_ctx_dump_bof(rctx->ctx, dname);
R600_ERR("dumped %s\n", dname);
}
diff --git a/src/gallium/drivers/r600/r600_state2.c b/src/gallium/drivers/r600/r600_state2.c
index 4ad9e4c6eb..5182b26fcf 100644
--- a/src/gallium/drivers/r600/r600_state2.c
+++ b/src/gallium/drivers/r600/r600_state2.c
@@ -556,6 +556,7 @@ static void r600_draw_common(struct r600_drawl *draw)
struct r600_draw rdraw;
struct r600_pipe_state vgt;
+
switch (draw->index_size) {
case 2:
vgt_draw_initiator = 0;
@@ -660,7 +661,7 @@ static void r600_flush2(struct pipe_context *ctx, unsigned flags,
struct pipe_fence_handle **fence)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
-#if 1
+#if 0
static int dc = 0;
char dname[256];
#endif
@@ -2089,7 +2090,10 @@ static void r600_destroy_query(struct pipe_context *ctx, struct pipe_query *quer
static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+ struct r600_query *rquery = (struct r600_query *)query;
+ rquery->result = 0;
+ rquery->num_results = 0;
r600_query_begin(&rctx->ctx, (struct r600_query *)query);
}
@@ -2105,7 +2109,11 @@ static boolean r600_get_query_result(struct pipe_context *ctx,
boolean wait, void *vresult)
{
struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+ struct r600_query *rquery = (struct r600_query *)query;
+ if (rquery->num_results) {
+ ctx->flush(ctx, 0, NULL);
+ }
return r600_context_query_result(&rctx->ctx, (struct r600_query *)query, wait, vresult);
}