From 2e529ed7ef8a052e8fa01a6ccfa1c95570dea570 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 15 Mar 2021 12:27:33 -0700 Subject: [PATCH] freedreno: Add gmem_reason_mask Older gens had more restrictions about GMEM bypass which do not apply to newer generations. Add a bitmask so we know which bits are not a hard requirement for using GMEM. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a6xx/fd6_screen.c | 9 +++++++++ src/gallium/drivers/freedreno/freedreno_batch.h | 10 +--------- .../drivers/freedreno/freedreno_screen.h | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_screen.c b/src/gallium/drivers/freedreno/a6xx/fd6_screen.c index d267c1f9844..511f5e6a779 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_screen.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_screen.c @@ -131,7 +131,16 @@ void fd6_screen_init(struct pipe_screen *pscreen) { struct fd_screen *screen = fd_screen(pscreen); + screen->max_rts = A6XX_MAX_RENDER_TARGETS; + + /* Currently only FB_READ forces GMEM path, mostly because we'd have to + * deal with cmdstream patching otherwise.. + */ + screen->gmem_reason_mask = FD_GMEM_CLEARS_DEPTH_STENCIL | + FD_GMEM_DEPTH_ENABLED | FD_GMEM_STENCIL_ENABLED | + FD_GMEM_BLEND_ENABLED | FD_GMEM_LOGICOP_ENABLED; + pscreen->context_create = fd6_context_create; pscreen->is_format_supported = fd6_screen_is_format_supported; diff --git a/src/gallium/drivers/freedreno/freedreno_batch.h b/src/gallium/drivers/freedreno/freedreno_batch.h index 0665872cf16..af4bc91af7f 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.h +++ b/src/gallium/drivers/freedreno/freedreno_batch.h @@ -110,15 +110,7 @@ struct fd_batch { * color_logic_Op (since those functions are disabled when by- * passing GMEM. */ - enum { - FD_GMEM_CLEARS_DEPTH_STENCIL = 0x01, - FD_GMEM_DEPTH_ENABLED = 0x02, - FD_GMEM_STENCIL_ENABLED = 0x04, - - FD_GMEM_BLEND_ENABLED = 0x10, - FD_GMEM_LOGICOP_ENABLED = 0x20, - FD_GMEM_FB_READ = 0x40, - } gmem_reason; + enum fd_gmem_reason gmem_reason; /* At submit time, once we've decided that this batch will use GMEM * rendering, the appropriate gmem state is looked up: diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index e49336f8d10..1aa9db59b78 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -46,6 +46,18 @@ struct fd_bo; +/* Potential reasons for needing to skip bypass path and use GMEM, the + * generation backend can override this with screen->gmem_reason_mask + */ +enum fd_gmem_reason { + FD_GMEM_CLEARS_DEPTH_STENCIL = BIT(0), + FD_GMEM_DEPTH_ENABLED = BIT(1), + FD_GMEM_STENCIL_ENABLED = BIT(2), + FD_GMEM_BLEND_ENABLED = BIT(3), + FD_GMEM_LOGICOP_ENABLED = BIT(4), + FD_GMEM_FB_READ = BIT(5), +}; + struct fd_screen { struct pipe_screen base; @@ -80,6 +92,11 @@ struct fd_screen { struct freedreno_dev_info info; + /* Bitmask of gmem_reasons that do not force GMEM path over bypass + * for current generation. + */ + enum fd_gmem_reason gmem_reason_mask; + unsigned num_perfcntr_groups; const struct fd_perfcntr_group *perfcntr_groups;