nv50: do not create an invalid HW query type
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 17 Oct 2015 09:24:50 +0000 (11:24 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 30 Oct 2015 16:57:15 +0000 (17:57 +0100)
While we are at it, store the rotate offset for occlusion queries to
nv50_hw_query like on nvc0.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Pierre Moreau <pierre.morrow@free.fr>
src/gallium/drivers/nouveau/nv50/nv50_query_hw.c
src/gallium/drivers/nouveau/nv50/nv50_query_hw.h

index fcdd183e88add803c0fbd16c097f7e661c2ae990..945ce7abe50c103b7921c87ffc73ceafcdb51865 100644 (file)
@@ -126,9 +126,9 @@ nv50_hw_begin_query(struct nv50_context *nv50, struct nv50_query *q)
     * query might set the initial render condition to false even *after* we re-
     * initialized it to true.
     */
-   if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) {
-      hq->offset += 32;
-      hq->data += 32 / sizeof(*hq->data);
+   if (hq->rotate) {
+      hq->offset += hq->rotate;
+      hq->data += hq->rotate / sizeof(*hq->data);
       if (hq->offset - hq->base_offset == NV50_HW_QUERY_ALLOC_SPACE)
          nv50_hw_query_allocate(nv50, q, NV50_HW_QUERY_ALLOC_SPACE);
 
@@ -339,22 +339,39 @@ nv50_hw_create_query(struct nv50_context *nv50, unsigned type, unsigned index)
    q->funcs = &hw_query_funcs;
    q->type = type;
 
+   switch (q->type) {
+   case PIPE_QUERY_OCCLUSION_COUNTER:
+      hq->rotate = 32;
+      break;
+   case PIPE_QUERY_PRIMITIVES_GENERATED:
+   case PIPE_QUERY_PRIMITIVES_EMITTED:
+   case PIPE_QUERY_SO_STATISTICS:
+   case PIPE_QUERY_PIPELINE_STATISTICS:
+      hq->is64bit = true;
+      break;
+   case PIPE_QUERY_TIME_ELAPSED:
+   case PIPE_QUERY_TIMESTAMP:
+   case PIPE_QUERY_TIMESTAMP_DISJOINT:
+   case PIPE_QUERY_GPU_FINISHED:
+   case NVA0_HW_QUERY_STREAM_OUTPUT_BUFFER_OFFSET:
+      break;
+   default:
+      debug_printf("invalid query type: %u\n", type);
+      FREE(q);
+      return NULL;
+   }
+
    if (!nv50_hw_query_allocate(nv50, q, NV50_HW_QUERY_ALLOC_SPACE)) {
       FREE(hq);
       return NULL;
    }
 
-   if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) {
+   if (hq->rotate) {
       /* we advance before query_begin ! */
-      hq->offset -= 32;
-      hq->data -= 32 / sizeof(*hq->data);
+      hq->offset -= hq->rotate;
+      hq->data -= hq->rotate / sizeof(*hq->data);
    }
 
-   hq->is64bit = (type == PIPE_QUERY_PRIMITIVES_GENERATED ||
-                 type == PIPE_QUERY_PRIMITIVES_EMITTED ||
-                 type == PIPE_QUERY_SO_STATISTICS ||
-                 type == PIPE_QUERY_PIPELINE_STATISTICS);
-
    return q;
 }
 
index fe518a558958f3f5f28ff1416966fdf660aa3b61..294c67de9a4084cca0b6fe323c7447b6043f1b9d 100644 (file)
@@ -14,9 +14,10 @@ struct nv50_hw_query {
    uint32_t sequence;
    struct nouveau_bo *bo;
    uint32_t base_offset;
-   uint32_t offset; /* base + i * 32 */
+   uint32_t offset; /* base + i * rotate */
    uint8_t state;
    bool is64bit;
+   uint8_t rotate;
    int nesting; /* only used for occlusion queries */
    struct nouveau_mm_allocation *mm;
    struct nouveau_fence *fence;