r600g: fix occlusion query on evergreen (avoid lockup)
authorJerome Glisse <jglisse@redhat.com>
Fri, 19 Nov 2010 16:51:37 +0000 (11:51 -0500)
committerJerome Glisse <jglisse@redhat.com>
Fri, 19 Nov 2010 16:53:01 +0000 (11:53 -0500)
Occlusion query on evergreen need the event index field to be
set otherwise we endup locking up the GPU.

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/winsys/r600/drm/r600_hw_context.c
src/gallium/winsys/r600/drm/r600d.h

index b2a11251bc61e90182323305fd2ab47b70c08473..b70dffabd7066eacbfa43c048e4b5978382150f6 100644 (file)
@@ -1279,7 +1279,11 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
 
        /* emit begin query */
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 2);
-       ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
+       if (ctx->radeon->chip_class == EVERGREEN) {
+               ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE | EG_EVENT_INDEX(1);
+       } else {
+               ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
+       }
        ctx->pm4[ctx->pm4_cdwords++] = query->num_results + r600_bo_offset(query->buffer);
        ctx->pm4[ctx->pm4_cdwords++] = 0;
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0);
@@ -1295,7 +1299,11 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query)
 {
        /* emit begin query */
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 2);
-       ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
+       if (ctx->radeon->chip_class == EVERGREEN) {
+               ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE | EG_EVENT_INDEX(1);
+       } else {
+               ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE_ZPASS_DONE;
+       }
        ctx->pm4[ctx->pm4_cdwords++] = query->num_results + 8 + r600_bo_offset(query->buffer);
        ctx->pm4[ctx->pm4_cdwords++] = 0;
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0);
index 5ca7456e906fbe281816a49a43a923010cb814a6..3c39b3fa8b3e45a118b631ba3c77a7f03e89cb26 100644 (file)
@@ -94,6 +94,7 @@
 #define EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT 0x14
 #define EVENT_TYPE_ZPASS_DONE                  0x15
 #define EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT   0x16
+#define EG_EVENT_INDEX(x)               ((x) << 8)
 
 #define PKT_TYPE_S(x)                   (((x) & 0x3) << 30)
 #define PKT_TYPE_G(x)                   (((x) >> 30) & 0x3)