[Mesa-dev] [PATCH 3/3] i965: Make shader_time store names/ids instead of referencing shaders.
Jason Ekstrand
jason at jlekstrand.net
Wed Apr 15 12:50:46 PDT 2015
On Wed, Apr 15, 2015 at 2:24 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Jason noticed that shader_time was bumping the reference count on the
> gl_shader_program and gl_program structures, in code called during
> compilation.
>
> Not only were these never unreferenced, but it meant fragment shaders
> might be referenced twice (SIMD8 and SIMD16)...or only once.
>
> We don't actually need the programs. We just need their numeric ID and
> their language (GLSL/ARB/FF) or KHR_debug label. If there's a label, we
> have to strdup it since the underlying program could be deleted.
>
> To be fair, we're not exactly cleaning that up either, but we at least
> ralloc it out of the shader_time arrays, so if we ever bother cleaning
> those up, they'll go away properly.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_context.h | 4 +--
> src/mesa/drivers/dri/i965/brw_program.c | 52 +++++++++++----------------------
> 2 files changed, 19 insertions(+), 37 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 0bd0ed1..a6d6787 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1454,8 +1454,8 @@ struct brw_context
>
> struct {
> drm_intel_bo *bo;
> - struct gl_shader_program **shader_programs;
> - struct gl_program **programs;
> + const char **names;
> + int *ids;
> enum shader_time_shader_type *types;
> uint64_t *cumulative;
> int num_entries;
> diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
> index 7ea08e6..81a0c19 100644
> --- a/src/mesa/drivers/dri/i965/brw_program.c
> +++ b/src/mesa/drivers/dri/i965/brw_program.c
> @@ -294,10 +294,8 @@ brw_init_shader_time(struct brw_context *brw)
> brw->shader_time.bo = drm_intel_bo_alloc(brw->bufmgr, "shader time",
> max_entries * SHADER_TIME_STRIDE,
> 4096);
> - brw->shader_time.shader_programs = rzalloc_array(brw, struct gl_shader_program *,
> - max_entries);
> - brw->shader_time.programs = rzalloc_array(brw, struct gl_program *,
> - max_entries);
> + brw->shader_time.names = rzalloc_array(brw, const char *, max_entries);
> + brw->shader_time.ids = rzalloc_array(brw, int, max_entries);
> brw->shader_time.types = rzalloc_array(brw, enum shader_time_shader_type,
> max_entries);
> brw->shader_time.cumulative = rzalloc_array(brw, uint64_t,
> @@ -434,36 +432,15 @@ brw_report_shader_time(struct brw_context *brw)
> fprintf(stderr, "\n");
> fprintf(stderr, "type ID cycles spent %% of total\n");
> for (int s = 0; s < brw->shader_time.num_entries; s++) {
> - const char *shader_name;
> const char *stage;
> /* Work back from the sorted pointers times to a time to print. */
> int i = sorted[s] - scaled;
> - struct gl_shader_program *prog = brw->shader_time.shader_programs[i];
>
> if (scaled[i] == 0)
> continue;
>
> - int shader_num = 0;
> - if (prog) {
> - shader_num = prog->Name;
> -
> - if (prog->Label) {
> - shader_name = prog->Label;
> - } else if (shader_num == 0) {
> - shader_name = "ff";
> - } else {
> - shader_name = "glsl";
> - }
> - } else if (brw->shader_time.programs[i]) {
> - shader_num = brw->shader_time.programs[i]->Id;
> - if (shader_num == 0) {
> - shader_name = "ff";
> - } else {
> - shader_name = "prog";
> - }
> - } else {
> - shader_name = "other";
> - }
> + int shader_num = brw->shader_time.ids[i];
> + const char *shader_name = brw->shader_time.names[i];
>
> switch (brw->shader_time.types[i]) {
> case ST_VS:
> @@ -543,19 +520,24 @@ brw_get_shader_time_index(struct brw_context *brw,
> struct gl_program *prog,
> enum shader_time_shader_type type)
> {
I'm still not happy that this is still in get_shader_time_index but at
least it doesn't use the GL context anymore.
Series is Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
> - struct gl_context *ctx = &brw->ctx;
> -
> int shader_time_index = brw->shader_time.num_entries++;
> assert(shader_time_index < brw->shader_time.max_entries);
> brw->shader_time.types[shader_time_index] = type;
>
> - _mesa_reference_shader_program(ctx,
> - &brw->shader_time.shader_programs[shader_time_index],
> - shader_prog);
> + int id = shader_prog ? shader_prog->Name : prog->Id;
> + const char *name;
> + if (id == 0) {
> + name = "ff";
> + } else if (!shader_prog) {
> + name = "prog";
> + } else if (shader_prog->Label) {
> + name = ralloc_strdup(brw->shader_time.names, shader_prog->Label);
> + } else {
> + name = "glsl";
> + }
>
> - _mesa_reference_program(ctx,
> - &brw->shader_time.programs[shader_time_index],
> - prog);
> + brw->shader_time.names[shader_time_index] = name;
> + brw->shader_time.ids[shader_time_index] = id;
>
> return shader_time_index;
> }
> --
> 2.3.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list