From: Kenneth Graunke Date: Thu, 31 Oct 2013 22:42:09 +0000 (-0700) Subject: i965: Add basic driver hooks and plumbing for AMD_performance_monitor. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=379a246fc190c1bc1664a4ecf24aabca13314c7f;p=mesa.git i965: Add basic driver hooks and plumbing for AMD_performance_monitor. These stub functions will be filled out in later patches. Signed-off-by: Kenneth Graunke Reviewed-by: Eric Anholt --- diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources index ac1363c776b..193f2db3bc7 100644 --- a/src/mesa/drivers/dri/i965/Makefile.sources +++ b/src/mesa/drivers/dri/i965/Makefile.sources @@ -73,6 +73,7 @@ i965_FILES = \ brw_lower_unnormalized_offset.cpp \ brw_misc_state.c \ brw_object_purgeable.c \ + brw_performance_monitor.c \ brw_program.c \ brw_primitive_restart.c \ brw_queryobj.c \ diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index d1f3ce12c3c..4e09038477c 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -801,6 +801,10 @@ brwCreateContext(gl_api api, _mesa_initialize_dispatch_tables(ctx); _mesa_initialize_vbo_vtxfmt(ctx); + if (ctx->Extensions.AMD_performance_monitor) { + brw_init_performance_monitors(brw); + } + return true; } diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index fe9e3a8fa08..8d373ff780b 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1613,6 +1613,10 @@ bool brw_is_hiz_depth_format(struct brw_context *ctx, gl_format format); bool brw_render_target_supported(struct brw_context *brw, struct gl_renderbuffer *rb); +/* brw_performance_monitor.c */ +void brw_init_performance_monitors(struct brw_context *brw); +void brw_dump_perf_monitors(struct brw_context *brw); + /* intel_extensions.c */ extern void intelInitExtensions(struct gl_context *ctx); diff --git a/src/mesa/drivers/dri/i965/brw_performance_monitor.c b/src/mesa/drivers/dri/i965/brw_performance_monitor.c new file mode 100644 index 00000000000..c9673c55565 --- /dev/null +++ b/src/mesa/drivers/dri/i965/brw_performance_monitor.c @@ -0,0 +1,219 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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. + */ + +/** + * \file brw_performance_monitor.c + * + * Implementation of the GL_AMD_performance_monitor extension. + */ + +#include + +#include "main/bitset.h" +#include "main/hash.h" +#include "main/macros.h" +#include "main/mtypes.h" +#include "main/performance_monitor.h" + +#include "glsl/ralloc.h" + +#include "brw_context.h" +#include "brw_defines.h" +#include "intel_batchbuffer.h" + +#define FILE_DEBUG_FLAG DEBUG_PERFMON + +/** + * i965 representation of a performance monitor object. + */ +struct brw_perf_monitor_object +{ + /** The base class. */ + struct gl_perf_monitor_object base; +}; + +/** Downcasting convenience macro. */ +static inline struct brw_perf_monitor_object * +brw_perf_monitor(struct gl_perf_monitor_object *m) +{ + return (struct brw_perf_monitor_object *) m; +} + +/******************************************************************************/ + +static GLboolean brw_is_perf_monitor_result_available(struct gl_context *, struct gl_perf_monitor_object *); + +static void +dump_perf_monitor_callback(GLuint name, void *monitor_void, void *brw_void) +{ + struct gl_context *ctx = brw_void; + struct gl_perf_monitor_object *m = monitor_void; + + DBG("%4d %-7s %-6s %-11s\n", + name, + m->Active ? "Active" : "", + m->Ended ? "Ended" : "", + brw_is_perf_monitor_result_available(ctx, m) ? "Available" : ""); +} + +void +brw_dump_perf_monitors(struct brw_context *brw) +{ + struct gl_context *ctx = &brw->ctx; + DBG("Monitors:\n"); + _mesa_HashWalk(ctx->PerfMonitor.Monitors, dump_perf_monitor_callback, brw); +} + +/******************************************************************************/ + +/** + * Initialize a monitor to sane starting state; throw away old buffers. + */ +static void +reinitialize_perf_monitor(struct brw_context *brw, + struct brw_perf_monitor_object *monitor) +{ +} + +/** + * Driver hook for glBeginPerformanceMonitorAMD(). + */ +static GLboolean +brw_begin_perf_monitor(struct gl_context *ctx, + struct gl_perf_monitor_object *m) +{ + struct brw_context *brw = brw_context(ctx); + struct brw_perf_monitor_object *monitor = brw_perf_monitor(m); + + DBG("Begin(%d)\n", m->Name); + + reinitialize_perf_monitor(brw, monitor); + + return true; +} + +/** + * Driver hook for glEndPerformanceMonitorAMD(). + */ +static void +brw_end_perf_monitor(struct gl_context *ctx, + struct gl_perf_monitor_object *m) +{ + DBG("End(%d)\n", m->Name); +} + +/** + * Reset a performance monitor, throwing away any results. + */ +static void +brw_reset_perf_monitor(struct gl_context *ctx, + struct gl_perf_monitor_object *m) +{ + struct brw_context *brw = brw_context(ctx); + struct brw_perf_monitor_object *monitor = brw_perf_monitor(m); + + reinitialize_perf_monitor(brw, monitor); + + if (m->Active) { + brw_begin_perf_monitor(ctx, m); + } +} + +/** + * Is a performance monitor result available? + */ +static GLboolean +brw_is_perf_monitor_result_available(struct gl_context *ctx, + struct gl_perf_monitor_object *m) +{ + /* ...need to actually check if counters are available, once we have some. */ + + return true; +} + +/** + * Get the performance monitor result. + */ +static void +brw_get_perf_monitor_result(struct gl_context *ctx, + struct gl_perf_monitor_object *m, + GLsizei data_size, + GLuint *data, + GLint *bytes_written) +{ + DBG("GetResult(%d)\n", m->Name); + + /* This hook should only be called when results are available. */ + assert(m->Ended); + + /* Copy data to the supplied array (data). + * + * The output data format is: for each + * active counter. The API allows counters to appear in any order. + */ + GLsizei offset = 0; + + /* ...but, we don't actually expose anything yet, so nothing to do here */ + + if (bytes_written) + *bytes_written = offset * sizeof(uint32_t); +} + +/** + * Create a new performance monitor object. + */ +static struct gl_perf_monitor_object * +brw_new_perf_monitor(struct gl_context *ctx) +{ + return calloc(1, sizeof(struct brw_perf_monitor_object)); +} + +/** + * Delete a performance monitor object. + */ +static void +brw_delete_perf_monitor(struct gl_context *ctx, struct gl_perf_monitor_object *m) +{ + struct brw_perf_monitor_object *monitor = brw_perf_monitor(m); + DBG("Delete(%d)\n", m->Name); + reinitialize_perf_monitor(brw_context(ctx), monitor); + free(monitor); +} + +/******************************************************************************/ + +void +brw_init_performance_monitors(struct brw_context *brw) +{ + struct gl_context *ctx = &brw->ctx; + + ctx->Driver.NewPerfMonitor = brw_new_perf_monitor; + ctx->Driver.DeletePerfMonitor = brw_delete_perf_monitor; + ctx->Driver.BeginPerfMonitor = brw_begin_perf_monitor; + ctx->Driver.EndPerfMonitor = brw_end_perf_monitor; + ctx->Driver.ResetPerfMonitor = brw_reset_perf_monitor; + ctx->Driver.IsPerfMonitorResultAvailable = brw_is_perf_monitor_result_available; + ctx->Driver.GetPerfMonitorResult = brw_get_perf_monitor_result; + + /* ...need to set ctx->PerfMonitor.Groups and ctx->PerfMonitor.NumGroups */ +}