Module: Mesa Branch: main Commit: 8192772c0aca8e5134415f7c304daeb6a855d631 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8192772c0aca8e5134415f7c304daeb6a855d631
Author: Rob Clark <[email protected]> Date: Tue Sep 13 11:14:46 2022 -0700 freedreno: Remap high/norm/low priorities At the gallium level, we only have three priorities. But if kernel supports preemption we'll have 3*nr_rings priority levels. We'd prefer to have the priorities that userspace picks be distributed over the entire range of priorities so that preemption can work. Signed-off-by: Rob Clark <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18584> --- src/gallium/drivers/freedreno/freedreno_context.c | 8 ++++---- src/gallium/drivers/freedreno/freedreno_screen.c | 15 +++++++++++++++ src/gallium/drivers/freedreno/freedreno_screen.h | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 15e0934f1a2..1330b09490e 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -591,15 +591,15 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, { struct fd_screen *screen = fd_screen(pscreen); struct pipe_context *pctx; - unsigned prio = 1; + unsigned prio = screen->prio_norm; /* lower numerical value == higher priority: */ if (FD_DBG(HIPRIO)) - prio = 0; + prio = screen->prio_high; else if (flags & PIPE_CONTEXT_HIGH_PRIORITY) - prio = 0; + prio = screen->prio_high; else if (flags & PIPE_CONTEXT_LOW_PRIORITY) - prio = 2; + prio = screen->prio_low; /* Some of the stats will get printed out at context destroy, so * make sure they are collected: diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 0893ca9c91b..602a018b3d7 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -1037,6 +1037,21 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro, } else { /* # of rings equates to number of unique priority values: */ screen->priority_mask = (1 << val) - 1; + + /* Lowest numerical value (ie. zero) is highest priority: */ + screen->prio_high = 0; + + /* Highest numerical value is lowest priority: */ + screen->prio_low = val - 1; + + /* Pick midpoint for normal priority.. note that whatever the + * range of possible priorities, since we divide by 2 the + * result will either be an integer or an integer plus 0.5, + * in which case it will round down to an integer, so int + * division will give us an appropriate result in either + * case: + */ + screen->prio_norm = val / 2; } if (fd_device_version(dev) >= FD_VERSION_ROBUSTNESS) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index a97f256b0f1..b3891128aec 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -89,6 +89,7 @@ struct fd_screen { uint32_t ram_size; uint32_t max_rts; /* max # of render targets */ uint32_t priority_mask; + unsigned prio_low, prio_norm, prio_high; /* remap low/norm/high priority to kernel priority */ bool has_timestamp; bool has_robustness; bool has_syncobj;
