Module: Mesa Branch: main Commit: b18a4bb8c66aba9fa1d9af21f5ae240152de7413 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b18a4bb8c66aba9fa1d9af21f5ae240152de7413
Author: Antonio Caggiano <[email protected]> Date: Mon May 3 17:38:41 2021 +0200 intel/perf: Extern C Allow libintel_perf to be included as a dependency from a C++ project by wrapping some declaration within an extern "C" block, and then add a function to allow direct reading of the OA stream. v2: Don't expose internal helpers (Lionel) Signed-off-by: Antonio Caggiano <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10216> --- src/intel/perf/intel_perf.h | 8 +++++++ src/intel/perf/intel_perf_query.c | 44 +++++++++++++++++++++++++++++++++------ src/intel/perf/intel_perf_query.h | 28 +++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/intel/perf/intel_perf.h b/src/intel/perf/intel_perf.h index 4a493683c5c..74aa3620b48 100644 --- a/src/intel/perf/intel_perf.h +++ b/src/intel/perf/intel_perf.h @@ -41,6 +41,10 @@ #include "drm-uapi/i915_drm.h" +#ifdef __cplusplus +extern "C" { +#endif + struct intel_device_info; struct intel_perf_config; @@ -510,4 +514,8 @@ void intel_perf_get_counters_passes(struct intel_perf_config *perf, uint32_t counter_indices_count, struct intel_perf_counter_pass *counter_pass); +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* INTEL_PERF_H */ diff --git a/src/intel/perf/intel_perf_query.c b/src/intel/perf/intel_perf_query.c index ca43ba508a4..cc1981a1f8d 100644 --- a/src/intel/perf/intel_perf_query.c +++ b/src/intel/perf/intel_perf_query.c @@ -22,6 +22,7 @@ */ #include <unistd.h> +#include <poll.h> #include "common/intel_gem.h" @@ -347,7 +348,7 @@ dec_n_users(struct intel_perf_context *perf_ctx) } } -static void +void intel_perf_close(struct intel_perf_context *perfquery, const struct intel_perf_query_info *query) { @@ -355,20 +356,21 @@ intel_perf_close(struct intel_perf_context *perfquery, close(perfquery->oa_stream_fd); perfquery->oa_stream_fd = -1; } - if (query->kind == INTEL_PERF_QUERY_TYPE_RAW) { + if (query && query->kind == INTEL_PERF_QUERY_TYPE_RAW) { struct intel_perf_query_info *raw_query = (struct intel_perf_query_info *) query; raw_query->oa_metrics_set_id = 0; } } -static bool +bool intel_perf_open(struct intel_perf_context *perf_ctx, int metrics_set_id, int report_format, int period_exponent, int drm_fd, - uint32_t ctx_id) + uint32_t ctx_id, + bool enable) { uint64_t properties[DRM_I915_PERF_PROP_MAX * 2]; uint32_t p = 0; @@ -402,7 +404,7 @@ intel_perf_open(struct intel_perf_context *perf_ctx, struct drm_i915_perf_open_param param = { .flags = I915_PERF_FLAG_FD_CLOEXEC | I915_PERF_FLAG_FD_NONBLOCK | - I915_PERF_FLAG_DISABLED, + (enable ? 0 : I915_PERF_FLAG_DISABLED), .num_properties = p / 2, .properties_ptr = (uintptr_t) properties, }; @@ -417,6 +419,9 @@ intel_perf_open(struct intel_perf_context *perf_ctx, perf_ctx->current_oa_metrics_set_id = metrics_set_id; perf_ctx->current_oa_format = report_format; + if (enable) + ++perf_ctx->n_oa_users; + return true; } @@ -829,7 +834,7 @@ intel_perf_begin_query(struct intel_perf_context *perf_ctx, if (!intel_perf_open(perf_ctx, metric_id, queryinfo->oa_format, perf_ctx->period_exponent, perf_ctx->drm_fd, - perf_ctx->hw_ctx)) + perf_ctx->hw_ctx, false)) return false; } else { assert(perf_ctx->current_oa_metrics_set_id == metric_id && @@ -958,6 +963,33 @@ intel_perf_end_query(struct intel_perf_context *perf_ctx, } } +bool intel_perf_oa_stream_ready(struct intel_perf_context *perf_ctx) +{ + struct pollfd pfd; + + pfd.fd = perf_ctx->oa_stream_fd; + pfd.events = POLLIN; + pfd.revents = 0; + + if (poll(&pfd, 1, 0) < 0) { + DBG("Error polling OA stream\n"); + return false; + } + + if (!(pfd.revents & POLLIN)) + return false; + + return true; +} + +ssize_t +intel_perf_read_oa_stream(struct intel_perf_context *perf_ctx, + void* buf, + size_t nbytes) +{ + return read(perf_ctx->oa_stream_fd, buf, nbytes); +} + enum OaReadStatus { OA_READ_STATUS_ERROR, OA_READ_STATUS_UNFINISHED, diff --git a/src/intel/perf/intel_perf_query.h b/src/intel/perf/intel_perf_query.h index 58919701490..5b7f2fc8645 100644 --- a/src/intel/perf/intel_perf_query.h +++ b/src/intel/perf/intel_perf_query.h @@ -26,12 +26,36 @@ #include <stdint.h> +#ifdef __cplusplus +extern "C" { +#endif + struct intel_device_info; struct intel_perf_config; struct intel_perf_context; struct intel_perf_query_object; +bool +intel_perf_open(struct intel_perf_context *perf_ctx, + int metrics_set_id, + int report_format, + int period_exponent, + int drm_fd, + uint32_t ctx_id, + bool enable); + +void +intel_perf_close(struct intel_perf_context *perfquery, + const struct intel_perf_query_info *query); + +bool intel_perf_oa_stream_ready(struct intel_perf_context *perf_ctx); + +ssize_t +intel_perf_read_oa_stream(struct intel_perf_context *perf_ctx, + void* buf, + size_t nbytes); + struct intel_perf_context *intel_perf_new_context(void *parent); void intel_perf_init_context(struct intel_perf_context *perf_ctx, @@ -78,4 +102,8 @@ void intel_perf_dump_query(struct intel_perf_context *perf_ctx, struct intel_perf_query_object *obj, void *current_batch); +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* INTEL_PERF_QUERY_H */ _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
