[Mesa-dev] [PATCH 1/5] gallium/util: add debugging helpers printing pipeline statistics
Marek Olšák
maraeo at gmail.com
Sat Apr 22 23:10:41 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
typically useful for hw bring-up
---
src/gallium/auxiliary/util/u_helpers.c | 51 ++++++++++++++++++++++++++++++++++
src/gallium/auxiliary/util/u_helpers.h | 8 ++++++
2 files changed, 59 insertions(+)
diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c
index 35cca82..5b46fa1 100644
--- a/src/gallium/auxiliary/util/u_helpers.c
+++ b/src/gallium/auxiliary/util/u_helpers.c
@@ -21,20 +21,21 @@
* IN NO EVENT SHALL THE AUTHORS AND/OR THEIR SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#include "util/u_helpers.h"
#include "util/u_inlines.h"
#include "util/u_upload_mgr.h"
+#include <inttypes.h>
/**
* This function is used to copy an array of pipe_vertex_buffer structures,
* while properly referencing the pipe_vertex_buffer::buffer member.
*
* enabled_buffers is updated such that the bits corresponding to the indices
* of disabled buffers are set to 0 and the enabled ones are set to 1.
*
* \sa util_copy_framebuffer_state
*/
@@ -132,10 +133,60 @@ util_save_and_upload_index_buffer(struct pipe_context *pipe,
u_upload_unmap(pipe->stream_uploader);
new_ib.offset -= start_offset;
new_ib.index_size = ib->index_size;
util_set_index_buffer(out_saved, ib);
pipe->set_index_buffer(pipe, &new_ib);
pipe_resource_reference(&new_ib.buffer, NULL);
return true;
}
+
+struct pipe_query *
+util_begin_pipestat_query(struct pipe_context *ctx)
+{
+ struct pipe_query *q =
+ ctx->create_query(ctx, PIPE_QUERY_PIPELINE_STATISTICS, 0);
+ if (!q)
+ return NULL;
+
+ ctx->begin_query(ctx, q);
+ return q;
+}
+
+void
+util_end_pipestat_query(struct pipe_context *ctx, struct pipe_query *q,
+ FILE *f)
+{
+ static unsigned counter;
+ struct pipe_query_data_pipeline_statistics stats;
+
+ ctx->end_query(ctx, q);
+ ctx->get_query_result(ctx, q, true, (void*)&stats);
+ ctx->destroy_query(ctx, q);
+
+ fprintf(f,
+ "Draw call %u:\n"
+ " ia_vertices = %"PRIu64"\n"
+ " ia_primitives = %"PRIu64"\n"
+ " vs_invocations = %"PRIu64"\n"
+ " gs_invocations = %"PRIu64"\n"
+ " gs_primitives = %"PRIu64"\n"
+ " c_invocations = %"PRIu64"\n"
+ " c_primitives = %"PRIu64"\n"
+ " ps_invocations = %"PRIu64"\n"
+ " hs_invocations = %"PRIu64"\n"
+ " ds_invocations = %"PRIu64"\n"
+ " cs_invocations = %"PRIu64"\n",
+ p_atomic_inc_return(&counter),
+ stats.ia_vertices,
+ stats.ia_primitives,
+ stats.vs_invocations,
+ stats.gs_invocations,
+ stats.gs_primitives,
+ stats.c_invocations,
+ stats.c_primitives,
+ stats.ps_invocations,
+ stats.hs_invocations,
+ stats.ds_invocations,
+ stats.cs_invocations);
+}
diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h
index 7de960b..2b382a1 100644
--- a/src/gallium/auxiliary/util/u_helpers.h
+++ b/src/gallium/auxiliary/util/u_helpers.h
@@ -22,20 +22,21 @@
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef U_HELPERS_H
#define U_HELPERS_H
#include "pipe/p_state.h"
+#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
uint32_t *enabled_buffers,
const struct pipe_vertex_buffer *src,
unsigned start_slot, unsigned count);
@@ -45,15 +46,22 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
unsigned start_slot, unsigned count);
void util_set_index_buffer(struct pipe_index_buffer *dst,
const struct pipe_index_buffer *src);
bool util_save_and_upload_index_buffer(struct pipe_context *pipe,
const struct pipe_draw_info *info,
const struct pipe_index_buffer *ib,
struct pipe_index_buffer *out_saved);
+struct pipe_query *
+util_begin_pipestat_query(struct pipe_context *ctx);
+
+void
+util_end_pipestat_query(struct pipe_context *ctx, struct pipe_query *q,
+ FILE *f);
+
#ifdef __cplusplus
}
#endif
#endif
--
2.7.4
More information about the mesa-dev
mailing list