nv50,nvc0: Mark PIPE_QUERY_TIMESTAMP_DISJOINT as ready immediately
[mesa.git] / src / gallium / drivers / nouveau / nvc0 / nvc0_query.c
index 007f8c47914523307b6efb0b893f267717c99983..ec464b51a710a68ddf818577bbce974d47ae6051 100644 (file)
@@ -397,6 +397,10 @@ nvc0_query_end(struct pipe_context *pipe, struct pipe_query *pq)
       /* indexed by TFB buffer instead of by vertex stream */
       nvc0_query_get(push, q, 0x00, 0x0d005002 | (q->index << 5));
       break;
+   case PIPE_QUERY_TIMESTAMP_DISJOINT:
+      /* This query is not issued on GPU because disjoint is forced to FALSE */
+      q->state = NVC0_QUERY_STATE_READY;
+      break;
    default:
 #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
       if (q->type >= NVC0_QUERY_DRV_STAT(0) &&
@@ -1338,14 +1342,14 @@ nvc0_mp_pm_query_result(struct nvc0_context *nvc0, struct nvc0_query *q,
       for (c = 0; c < cfg->num_counters; ++c)
          for (p = 0; p < mp_count; ++p)
             v |= count[p][c];
-      value = (v * cfg->norm[0]) / cfg->norm[1];
+      value = ((uint64_t)v * cfg->norm[0]) / cfg->norm[1];
    } else
    if (cfg->op == NVC0_COUNTER_OPn_AND) {
       uint32_t v = ~0;
       for (c = 0; c < cfg->num_counters; ++c)
          for (p = 0; p < mp_count; ++p)
             v &= count[p][c];
-      value = (v * cfg->norm[0]) / cfg->norm[1];
+      value = ((uint64_t)v * cfg->norm[0]) / cfg->norm[1];
    } else
    if (cfg->op == NVC0_COUNTER_OP2_REL_SUM_MM) {
       uint64_t v[2] = { 0, 0 };
@@ -1370,7 +1374,7 @@ nvc0_mp_pm_query_result(struct nvc0_context *nvc0, struct nvc0_query *q,
          if (count[p][1])
             value += (count[p][0] * cfg->norm[0]) / count[p][1];
       if (mp_used)
-         value /= mp_used * cfg->norm[1];
+         value /= (uint64_t)mp_used * cfg->norm[1];
    } else
    if (cfg->op == NVC0_COUNTER_OP2_AVG_DIV_M0) {
       unsigned mp_used = 0;
@@ -1378,7 +1382,7 @@ nvc0_mp_pm_query_result(struct nvc0_context *nvc0, struct nvc0_query *q,
          value += count[p][0];
       if (count[0][1] && mp_used) {
          value *= cfg->norm[0];
-         value /= count[0][1] * mp_used * cfg->norm[1];
+         value /= (uint64_t)count[0][1] * mp_used * cfg->norm[1];
       } else {
          value = 0;
       }