nvc0: fix retrieving query results into buffer for timestamps
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 22 Apr 2016 04:01:56 +0000 (00:01 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Fri, 22 Apr 2016 04:06:49 +0000 (00:06 -0400)
The timestamps are stored in a funny place, and even though they are a
64-bit result, are not stored with is64bit. Account for that when
retrieving the query result into a resource.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "11.2" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c

index 623858841373eab5e4039f3b5866254d29d6fe3b..4c34593ef9ca81d92a4e72ccedd4f1b2c917136b 100644 (file)
@@ -370,7 +370,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
    struct nvc0_hw_query *hq = nvc0_hw_query(q);
    struct nv04_resource *buf = nv04_resource(resource);
-   unsigned stride;
+   unsigned qoffset = 0, stride;
 
    assert(!hq->funcs || !hq->funcs->get_query_result);
 
@@ -426,17 +426,27 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
    case PIPE_QUERY_PIPELINE_STATISTICS:
       stride = 12;
       break;
+   case PIPE_QUERY_TIME_ELAPSED:
+   case PIPE_QUERY_TIMESTAMP:
+      qoffset = 8;
+      /* fallthrough */
    default:
       assert(index == 0);
       stride = 1;
       break;
    }
 
-   if (hq->is64bit) {
-      nouveau_pushbuf_data(push, hq->bo, hq->offset + 16 * index,
-                           8 | NVC0_IB_ENTRY_1_NO_PREFETCH);
-      nouveau_pushbuf_data(push, hq->bo, hq->offset + 16 * (index + stride),
+   if (hq->is64bit || qoffset) {
+      nouveau_pushbuf_data(push, hq->bo, hq->offset + qoffset + 16 * index,
                            8 | NVC0_IB_ENTRY_1_NO_PREFETCH);
+      if (q->type == PIPE_QUERY_TIMESTAMP) {
+         PUSH_DATA(push, 0);
+         PUSH_DATA(push, 0);
+      } else {
+         nouveau_pushbuf_data(push, hq->bo, hq->offset + qoffset +
+                              16 * (index + stride),
+                              8 | NVC0_IB_ENTRY_1_NO_PREFETCH);
+      }
    } else {
       nouveau_pushbuf_data(push, hq->bo, hq->offset + 4,
                            4 | NVC0_IB_ENTRY_1_NO_PREFETCH);