• Home
  • Raw
  • Download

Lines Matching refs:q

99 query_mem64(struct iris_query *q, uint32_t offset)  in query_mem64()  argument
102 .bo = iris_resource_bo(q->query_state_ref.res), in query_mem64()
103 .offset = q->query_state_ref.offset + offset, in query_mem64()
113 iris_is_query_pipelined(struct iris_query *q) in iris_is_query_pipelined() argument
115 switch (q->type) { in iris_is_query_pipelined()
130 mark_available(struct iris_context *ice, struct iris_query *q) in mark_available() argument
132 struct iris_batch *batch = &ice->batches[q->batch_idx]; in mark_available()
135 struct iris_bo *bo = iris_resource_bo(q->query_state_ref.res); in mark_available()
136 offset += q->query_state_ref.offset; in mark_available()
138 if (!iris_is_query_pipelined(q)) { in mark_available()
153 struct iris_query *q, in iris_pipelined_write() argument
160 struct iris_bo *bo = iris_resource_bo(q->query_state_ref.res); in iris_pipelined_write()
168 write_value(struct iris_context *ice, struct iris_query *q, unsigned offset) in write_value() argument
170 struct iris_batch *batch = &ice->batches[q->batch_idx]; in write_value()
171 struct iris_bo *bo = iris_resource_bo(q->query_state_ref.res); in write_value()
173 if (!iris_is_query_pipelined(q)) { in write_value()
178 q->stalled = true; in write_value()
181 switch (q->type) { in write_value()
195 iris_pipelined_write(&ice->batches[IRIS_BATCH_RENDER], q, in write_value()
203 iris_pipelined_write(&ice->batches[IRIS_BATCH_RENDER], q, in write_value()
209 q->index == 0 ? in write_value()
211 SO_PRIM_STORAGE_NEEDED(q->index), in write_value()
216 SO_NUM_PRIMS_WRITTEN(q->index), in write_value()
233 const uint32_t reg = index_to_reg[q->index]; in write_value()
244 write_overflow_values(struct iris_context *ice, struct iris_query *q, bool end) in write_overflow_values() argument
247 uint32_t count = q->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ? 1 : 4; in write_overflow_values()
248 struct iris_bo *bo = iris_resource_bo(q->query_state_ref.res); in write_overflow_values()
249 uint32_t offset = q->query_state_ref.offset; in write_overflow_values()
256 int s = q->index + i; in write_overflow_values()
288 struct iris_query *q) in calculate_result_on_cpu() argument
290 switch (q->type) { in calculate_result_on_cpu()
293 q->result = q->map->end != q->map->start; in calculate_result_on_cpu()
298 q->result = gen_device_info_timebase_scale(devinfo, q->map->start); in calculate_result_on_cpu()
299 q->result &= (1ull << TIMESTAMP_BITS) - 1; in calculate_result_on_cpu()
302 q->result = iris_raw_timestamp_delta(q->map->start, q->map->end); in calculate_result_on_cpu()
303 q->result = gen_device_info_timebase_scale(devinfo, q->result); in calculate_result_on_cpu()
304 q->result &= (1ull << TIMESTAMP_BITS) - 1; in calculate_result_on_cpu()
307 q->result = stream_overflowed((void *) q->map, q->index); in calculate_result_on_cpu()
310 q->result = false; in calculate_result_on_cpu()
312 q->result |= stream_overflowed((void *) q->map, i); in calculate_result_on_cpu()
315 q->result = q->map->end - q->map->start; in calculate_result_on_cpu()
318 if (GEN_GEN == 8 && q->index == PIPE_STAT_QUERY_PS_INVOCATIONS) in calculate_result_on_cpu()
319 q->result /= 4; in calculate_result_on_cpu()
325 q->result = q->map->end - q->map->start; in calculate_result_on_cpu()
329 q->ready = true; in calculate_result_on_cpu()
339 struct iris_query *q, in calc_overflow_for_stream() argument
342 #define C(counter, i) query_mem64(q, \ in calc_overflow_for_stream()
355 calc_overflow_any_stream(struct gen_mi_builder *b, struct iris_query *q) in calc_overflow_any_stream() argument
359 stream_result[i] = calc_overflow_for_stream(b, q, i); in calc_overflow_any_stream()
388 struct iris_query *q) in calculate_result_on_gpu() argument
392 query_mem64(q, offsetof(struct iris_query_snapshots, start)); in calculate_result_on_gpu()
394 query_mem64(q, offsetof(struct iris_query_snapshots, end)); in calculate_result_on_gpu()
396 switch (q->type) { in calculate_result_on_gpu()
398 result = calc_overflow_for_stream(b, q, q->index); in calculate_result_on_gpu()
401 result = calc_overflow_any_stream(b, q); in calculate_result_on_gpu()
426 q->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && in calculate_result_on_gpu()
427 q->index == PIPE_STAT_QUERY_PS_INVOCATIONS) in calculate_result_on_gpu()
430 if (query_is_boolean(q->type)) in calculate_result_on_gpu()
441 struct iris_query *q = calloc(1, sizeof(struct iris_query)); in iris_create_query() local
443 q->type = query_type; in iris_create_query()
444 q->index = index; in iris_create_query()
445 q->monitor = NULL; in iris_create_query()
447 if (q->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && in iris_create_query()
448 q->index == PIPE_STAT_QUERY_CS_INVOCATIONS) in iris_create_query()
449 q->batch_idx = IRIS_BATCH_COMPUTE; in iris_create_query()
451 q->batch_idx = IRIS_BATCH_RENDER; in iris_create_query()
452 return (struct pipe_query *) q; in iris_create_query()
461 struct iris_query *q = calloc(1, sizeof(struct iris_query)); in iris_create_batch_query() local
462 if (unlikely(!q)) in iris_create_batch_query()
464 q->type = PIPE_QUERY_DRIVER_SPECIFIC; in iris_create_batch_query()
465 q->index = -1; in iris_create_batch_query()
466 q->monitor = iris_create_monitor_object(ice, num_queries, query_types); in iris_create_batch_query()
467 if (unlikely(!q->monitor)) { in iris_create_batch_query()
468 free(q); in iris_create_batch_query()
472 return (struct pipe_query *) q; in iris_create_batch_query()
496 struct iris_query *q = (void *) query; in iris_begin_query() local
498 if (q->monitor) in iris_begin_query()
499 return iris_begin_monitor(ctx, q->monitor); in iris_begin_query()
504 if (q->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE || in iris_begin_query()
505 q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) in iris_begin_query()
511 size, size, &q->query_state_ref.offset, in iris_begin_query()
512 &q->query_state_ref.res, &ptr); in iris_begin_query()
514 if (!iris_resource_bo(q->query_state_ref.res)) in iris_begin_query()
517 q->map = ptr; in iris_begin_query()
518 if (!q->map) in iris_begin_query()
521 q->result = 0ull; in iris_begin_query()
522 q->ready = false; in iris_begin_query()
523 WRITE_ONCE(q->map->snapshots_landed, false); in iris_begin_query()
525 if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED && q->index == 0) { in iris_begin_query()
530 if (q->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE || in iris_begin_query()
531 q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) in iris_begin_query()
532 write_overflow_values(ice, q, false); in iris_begin_query()
534 write_value(ice, q, in iris_begin_query()
535 q->query_state_ref.offset + in iris_begin_query()
545 struct iris_query *q = (void *) query; in iris_end_query() local
547 if (q->monitor) in iris_end_query()
548 return iris_end_monitor(ctx, q->monitor); in iris_end_query()
550 if (q->type == PIPE_QUERY_GPU_FINISHED) { in iris_end_query()
551 ctx->flush(ctx, &q->fence, PIPE_FLUSH_DEFERRED); in iris_end_query()
555 struct iris_batch *batch = &ice->batches[q->batch_idx]; in iris_end_query()
557 if (q->type == PIPE_QUERY_TIMESTAMP) { in iris_end_query()
559 iris_batch_reference_signal_syncobj(batch, &q->syncobj); in iris_end_query()
560 mark_available(ice, q); in iris_end_query()
564 if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED && q->index == 0) { in iris_end_query()
569 if (q->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE || in iris_end_query()
570 q->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) in iris_end_query()
571 write_overflow_values(ice, q, true); in iris_end_query()
573 write_value(ice, q, in iris_end_query()
574 q->query_state_ref.offset + in iris_end_query()
577 iris_batch_reference_signal_syncobj(batch, &q->syncobj); in iris_end_query()
578 mark_available(ice, q); in iris_end_query()
588 iris_check_query_no_flush(struct iris_context *ice, struct iris_query *q) in iris_check_query_no_flush() argument
593 if (!q->ready && READ_ONCE(q->map->snapshots_landed)) { in iris_check_query_no_flush()
594 calculate_result_on_cpu(devinfo, q); in iris_check_query_no_flush()
605 struct iris_query *q = (void *) query; in iris_get_query_result() local
607 if (q->monitor) in iris_get_query_result()
608 return iris_get_monitor_result(ctx, q->monitor, wait, result->batch); in iris_get_query_result()
618 if (q->type == PIPE_QUERY_GPU_FINISHED) { in iris_get_query_result()
621 result->b = screen->fence_finish(screen, ctx, q->fence, in iris_get_query_result()
626 if (!q->ready) { in iris_get_query_result()
627 struct iris_batch *batch = &ice->batches[q->batch_idx]; in iris_get_query_result()
628 if (q->syncobj == iris_batch_get_signal_syncobj(batch)) in iris_get_query_result()
631 while (!READ_ONCE(q->map->snapshots_landed)) { in iris_get_query_result()
633 iris_wait_syncobj(ctx->screen, q->syncobj, INT64_MAX); in iris_get_query_result()
638 assert(READ_ONCE(q->map->snapshots_landed)); in iris_get_query_result()
639 calculate_result_on_cpu(devinfo, q); in iris_get_query_result()
642 assert(q->ready); in iris_get_query_result()
644 result->u64 = q->result; in iris_get_query_result()
659 struct iris_query *q = (void *) query; in iris_get_query_result_resource() local
660 struct iris_batch *batch = &ice->batches[q->batch_idx]; in iris_get_query_result_resource()
663 struct iris_bo *query_bo = iris_resource_bo(q->query_state_ref.res); in iris_get_query_result_resource()
676 if (q->syncobj == iris_batch_get_signal_syncobj(batch)) in iris_get_query_result_resource()
685 if (!q->ready && READ_ONCE(q->map->snapshots_landed)) { in iris_get_query_result_resource()
689 calculate_result_on_cpu(devinfo, q); in iris_get_query_result_resource()
692 if (q->ready) { in iris_get_query_result_resource()
695 batch->screen->vtbl.store_data_imm32(batch, dst_bo, offset, q->result); in iris_get_query_result_resource()
697 batch->screen->vtbl.store_data_imm64(batch, dst_bo, offset, q->result); in iris_get_query_result_resource()
710 bool predicated = !wait && !q->stalled; in iris_get_query_result_resource()
717 struct gen_mi_value result = calculate_result_on_gpu(devinfo, &b, q); in iris_get_query_result_resource()
766 struct iris_query *q, in set_predicate_for_result() argument
770 struct iris_bo *bo = iris_resource_bo(q->query_state_ref.res); in set_predicate_for_result()
781 q->stalled = true; in set_predicate_for_result()
788 switch (q->type) { in set_predicate_for_result()
790 result = calc_overflow_for_stream(&b, q, q->index); in set_predicate_for_result()
793 result = calc_overflow_any_stream(&b, q); in set_predicate_for_result()
798 query_mem64(q, offsetof(struct iris_query_snapshots, start)); in set_predicate_for_result()
800 query_mem64(q, offsetof(struct iris_query_snapshots, end)); in set_predicate_for_result()
817 gen_mi_store(&b, query_mem64(q, offsetof(struct iris_query_snapshots, in set_predicate_for_result()
831 struct iris_query *q = (void *) query; in iris_render_condition() local
835 ice->condition.query = q; in iris_render_condition()
838 if (!q) { in iris_render_condition()
843 iris_check_query_no_flush(ice, q); in iris_render_condition()
845 if (q->result || q->ready) { in iris_render_condition()
846 set_predicate_enable(ice, (q->result != 0) ^ condition); in iris_render_condition()
853 set_predicate_for_result(ice, q, condition); in iris_render_condition()
861 struct iris_query *q = ice->condition.query; in iris_resolve_conditional_render() local
862 struct pipe_query *query = (void *) q; in iris_resolve_conditional_render()
868 assert(q); in iris_resolve_conditional_render()
871 set_predicate_enable(ice, (q->result != 0) ^ ice->condition.condition); in iris_resolve_conditional_render()