r600g: make F2U trans-only on r600-r700
[mesa.git] / src / gallium / drivers / r600 / r600_query.c
index 9632d18e391924a44a1a04bb009768ce51d6f602..440b8c9d186b837b81eebca2f5f4517efe0e0274 100644 (file)
@@ -52,7 +52,7 @@ static struct r600_resource *r600_new_query_buffer(struct r600_context *ctx, uns
        switch (type) {
        case PIPE_QUERY_OCCLUSION_COUNTER:
        case PIPE_QUERY_OCCLUSION_PREDICATE:
-               results = ctx->ws->buffer_map(buf->buf, ctx->cs, PIPE_TRANSFER_WRITE);
+               results = ctx->ws->buffer_map(buf->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
                memset(results, 0, buf_size);
 
                /* Set top bits for unused backends. */
@@ -66,17 +66,18 @@ static struct r600_resource *r600_new_query_buffer(struct r600_context *ctx, uns
                        }
                        results += 4 * ctx->max_db;
                }
-               ctx->ws->buffer_unmap(buf->buf);
+               ctx->ws->buffer_unmap(buf->cs_buf);
                break;
        case PIPE_QUERY_TIME_ELAPSED:
+       case PIPE_QUERY_TIMESTAMP:
                break;
        case PIPE_QUERY_PRIMITIVES_EMITTED:
        case PIPE_QUERY_PRIMITIVES_GENERATED:
        case PIPE_QUERY_SO_STATISTICS:
        case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
-               results = ctx->ws->buffer_map(buf->buf, ctx->cs, PIPE_TRANSFER_WRITE);
+               results = ctx->ws->buffer_map(buf->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
                memset(results, 0, buf_size);
-               ctx->ws->buffer_unmap(buf->buf);
+               ctx->ws->buffer_unmap(buf->cs_buf);
                break;
        default:
                assert(0);
@@ -174,6 +175,8 @@ static void r600_emit_query_end(struct r600_context *ctx, struct r600_query *que
                break;
        case PIPE_QUERY_TIME_ELAPSED:
                va += query->buffer.results_end + query->result_size/2;
+               /* fall through */
+       case PIPE_QUERY_TIMESTAMP:
                cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE_EOP, 4, 0);
                cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5);
                cs->buf[cs->cdw++] = va;
@@ -267,6 +270,10 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned q
                query->result_size = 16;
                query->num_cs_dw = 8;
                break;
+       case PIPE_QUERY_TIMESTAMP:
+               query->result_size = 8;
+               query->num_cs_dw = 8;
+               break;
        case PIPE_QUERY_PRIMITIVES_EMITTED:
        case PIPE_QUERY_PRIMITIVES_GENERATED:
        case PIPE_QUERY_SO_STATISTICS:
@@ -406,7 +413,7 @@ static boolean r600_get_query_buffer_result(struct r600_context *ctx,
        unsigned results_base = 0;
        char *map;
 
-       map = ctx->ws->buffer_map(qbuf->buf->buf, ctx->cs,
+       map = ctx->ws->buffer_map(qbuf->buf->cs_buf, ctx->cs,
                                  PIPE_TRANSFER_READ |
                                  (wait ? 0 : PIPE_TRANSFER_DONTBLOCK));
        if (!map)
@@ -435,6 +442,13 @@ static boolean r600_get_query_buffer_result(struct r600_context *ctx,
                        results_base += query->result_size;
                }
                break;
+       case PIPE_QUERY_TIMESTAMP:
+       {
+               uint32_t *current_result = (uint32_t*)map;
+               result->u64 = (uint64_t)current_result[0] |
+                             (uint64_t)current_result[1] << 32;
+               break;
+       }
        case PIPE_QUERY_PRIMITIVES_EMITTED:
                /* SAMPLE_STREAMOUTSTATS stores this structure:
                 * {
@@ -477,7 +491,7 @@ static boolean r600_get_query_buffer_result(struct r600_context *ctx,
                assert(0);
        }
 
-       ctx->ws->buffer_unmap(qbuf->buf->buf);
+       ctx->ws->buffer_unmap(qbuf->buf->cs_buf);
        return TRUE;
 }
 
@@ -498,7 +512,8 @@ static boolean r600_get_query_result(struct pipe_context *ctx,
        }
 
        /* Convert the time to expected units. */
-       if (rquery->type == PIPE_QUERY_TIME_ELAPSED) {
+       if (rquery->type == PIPE_QUERY_TIME_ELAPSED ||
+           rquery->type == PIPE_QUERY_TIMESTAMP) {
                result->u64 = (1000000 * result->u64) / rctx->screen->info.r600_clock_crystal_freq;
        }
        return TRUE;