iris: glGet timestamps, more correct timestamps

This commit is contained in:
Kenneth Graunke 2018-09-28 15:42:51 +02:00
parent 36fbcfb06c
commit 1d91eba7dc
3 changed files with 48 additions and 8 deletions

View File

@ -539,6 +539,11 @@ bool iris_blorp_upload_shader(struct blorp_batch *blorp_batch,
uint32_t *kernel_out,
void *prog_data_out);
/* iris_query.c */
uint64_t iris_timebase_scale(const struct gen_device_info *devinfo,
uint64_t gpu_timestamp);
/* iris_resolve.c */
void iris_predraw_resolve_inputs(struct iris_context *ice,

View File

@ -236,8 +236,27 @@ write_value(struct iris_context *ice, struct iris_query *q, unsigned offset)
}
}
uint64_t
iris_timebase_scale(const struct gen_device_info *devinfo,
uint64_t gpu_timestamp)
{
return (1000000000ull * gpu_timestamp) / devinfo->timestamp_frequency;
}
static uint64_t
iris_raw_timestamp_delta(uint64_t time0, uint64_t time1)
{
if (time0 > time1) {
return (1ULL << 36) + time1 - time0;
} else {
return time1 - time0;
}
}
static void
calculate_result_on_cpu(struct iris_query *q)
calculate_result_on_cpu(const struct gen_device_info *devinfo,
struct iris_query *q)
{
switch (q->type) {
case PIPE_QUERY_OCCLUSION_PREDICATE:
@ -246,12 +265,16 @@ calculate_result_on_cpu(struct iris_query *q)
break;
case PIPE_QUERY_TIMESTAMP:
case PIPE_QUERY_TIMESTAMP_DISJOINT:
/* The timestamp is the single ending snapshot. */
// XXX: timebase scale
q->result = q->map->end;
/* The timestamp is the single starting snapshot. */
q->result = iris_timebase_scale(devinfo, q->map->start);
// XXX: 36-bit overflow?
break;
case PIPE_QUERY_TIME_ELAPSED:
q->result = iris_raw_timestamp_delta(q->map->start, q->map->end);
q->result = iris_timebase_scale(devinfo, q->result);
q->result &= (1ull << 36) - 1;
break;
case PIPE_QUERY_OCCLUSION_COUNTER:
case PIPE_QUERY_TIME_ELAPSED:
case PIPE_QUERY_PRIMITIVES_GENERATED:
case PIPE_QUERY_PRIMITIVES_EMITTED:
case PIPE_QUERY_PIPELINE_STATISTICS:
@ -397,6 +420,8 @@ iris_get_query_result(struct pipe_context *ctx,
{
struct iris_context *ice = (void *) ctx;
struct iris_query *q = (void *) query;
struct iris_screen *screen = (void *) ctx->screen;
const struct gen_device_info *devinfo = &screen->devinfo;
if (!q->ready) {
if (iris_batch_references(&ice->render_batch, q->bo))
@ -410,7 +435,7 @@ iris_get_query_result(struct pipe_context *ctx,
}
assert(q->map->snapshots_landed);
calculate_result_on_cpu(q);
calculate_result_on_cpu(devinfo, q);
}
assert(q->ready);
@ -470,6 +495,7 @@ iris_get_query_result_resource(struct pipe_context *ctx,
struct iris_context *ice = (void *) ctx;
struct iris_query *q = (void *) query;
struct iris_batch *batch = &ice->render_batch;
const struct gen_device_info *devinfo = &batch->screen->devinfo;
unsigned snapshots_landed_offset =
offsetof(struct iris_query_snapshots, snapshots_landed);
@ -492,7 +518,7 @@ iris_get_query_result_resource(struct pipe_context *ctx,
/* The final snapshots happen to have landed, so let's just compute
* the result on the CPU now...
*/
calculate_result_on_cpu(q);
calculate_result_on_cpu(devinfo, q);
}
if (q->ready) {

View File

@ -374,7 +374,16 @@ iris_get_compute_param(struct pipe_screen *pscreen,
static uint64_t
iris_get_timestamp(struct pipe_screen *pscreen)
{
return 0;
struct iris_screen *screen = (struct iris_screen *) pscreen;
const unsigned TIMESTAMP = 0x2358;
uint64_t result;
iris_reg_read(screen->bufmgr, TIMESTAMP, &result);
result = iris_timebase_scale(&screen->devinfo, result);
result &= (1ull << 36) - 1;
return result;
}
static void