diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_resource.c b/src/gallium/drivers/freedreno/a2xx/fd2_resource.c index ebee3babf48..7074a44c7d2 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_resource.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_resource.c @@ -7,9 +7,10 @@ */ #include "fd2_resource.h" +#include "freedreno_screen.h" uint32_t -fd2_setup_slices(struct fd_resource *rsc) +fd2_layout_resource(struct fd_resource *rsc, enum fd_layout_type type) { struct pipe_resource *prsc = &rsc->b.b; enum pipe_format format = prsc->format; diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_resource.h b/src/gallium/drivers/freedreno/a2xx/fd2_resource.h index 0ddf3b874bc..8033cc39f09 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_resource.h +++ b/src/gallium/drivers/freedreno/a2xx/fd2_resource.h @@ -11,7 +11,7 @@ #include "freedreno_resource.h" -uint32_t fd2_setup_slices(struct fd_resource *rsc); +uint32_t fd2_layout_resource(struct fd_resource *rsc, enum fd_layout_type type); unsigned fd2_tile_mode(const struct pipe_resource *tmpl); #endif /* FD2_RESOURCE_H_ */ diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_screen.c b/src/gallium/drivers/freedreno/a2xx/fd2_screen.c index d72c87b1f6d..f29b7b109e4 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_screen.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_screen.c @@ -105,7 +105,7 @@ fd2_screen_init(struct pipe_screen *pscreen) pscreen->context_create = fd2_context_create; pscreen->is_format_supported = fd2_screen_is_format_supported; - screen->setup_slices = fd2_setup_slices; + screen->layout_resource = fd2_layout_resource; if (FD_DBG(TTILE)) screen->tile_mode = fd2_tile_mode; diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_resource.c b/src/gallium/drivers/freedreno/a3xx/fd3_resource.c index bc2ab77d284..00f91967492 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_resource.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_resource.c @@ -52,10 +52,15 @@ setup_slices(struct fd_resource *rsc, uint32_t alignment, } uint32_t -fd3_setup_slices(struct fd_resource *rsc) +fd3_layout_resource(struct fd_resource *rsc, enum fd_layout_type type) { uint32_t alignment; + if (type >= FD_LAYOUT_TILED) + rsc->layout.tile_mode = fd3_tile_mode(&rsc->b.b); + if (type == FD_LAYOUT_UBWC) + rsc->layout.ubwc = true; + switch (rsc->b.b.target) { case PIPE_TEXTURE_3D: case PIPE_TEXTURE_1D_ARRAY: diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_resource.h b/src/gallium/drivers/freedreno/a3xx/fd3_resource.h index bef900c6020..59ecdfd7ae9 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_resource.h +++ b/src/gallium/drivers/freedreno/a3xx/fd3_resource.h @@ -11,7 +11,7 @@ #include "freedreno_resource.h" -uint32_t fd3_setup_slices(struct fd_resource *rsc); +uint32_t fd3_layout_resource(struct fd_resource *rsc, enum fd_layout_type type); unsigned fd3_tile_mode(const struct pipe_resource *tmpl); #endif /* FD3_RESOURCE_H_ */ diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c index 9f77c1981e1..15d60b9f956 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c @@ -99,7 +99,7 @@ fd3_screen_init(struct pipe_screen *pscreen) fd3_emit_init_screen(pscreen); ir3_screen_init(pscreen); - screen->setup_slices = fd3_setup_slices; + screen->layout_resource = fd3_layout_resource; if (FD_DBG(TTILE)) screen->tile_mode = fd3_tile_mode; diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_resource.c b/src/gallium/drivers/freedreno/a4xx/fd4_resource.c index 9f2102ae607..90efd8f089e 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_resource.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_resource.c @@ -8,9 +8,10 @@ */ #include "fd4_resource.h" +#include "freedreno_screen.h" uint32_t -fd4_setup_slices(struct fd_resource *rsc) +fd4_layout_resource(struct fd_resource *rsc, enum fd_layout_type type) { struct pipe_resource *prsc = &rsc->b.b; enum pipe_format format = prsc->format; @@ -23,6 +24,8 @@ fd4_setup_slices(struct fd_resource *rsc) */ uint32_t layers_in_level, alignment; + assert(type == FD_LAYOUT_LINEAR); + if (prsc->target == PIPE_TEXTURE_3D) { rsc->layout.layer_first = false; layers_in_level = prsc->array_size; diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_resource.h b/src/gallium/drivers/freedreno/a4xx/fd4_resource.h index 2fd81f5ff50..4a0d6a911f3 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_resource.h +++ b/src/gallium/drivers/freedreno/a4xx/fd4_resource.h @@ -11,7 +11,6 @@ #include "freedreno_resource.h" -uint32_t fd4_setup_slices(struct fd_resource *rsc); -unsigned fd4_tile_mode(const struct pipe_resource *tmpl); +uint32_t fd4_layout_resource(struct fd_resource *rsc, enum fd_layout_type type); #endif /* FD4_RESOURCE_H_ */ diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_screen.c b/src/gallium/drivers/freedreno/a4xx/fd4_screen.c index bdf079ddbdb..2316d045563 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_screen.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_screen.c @@ -98,7 +98,7 @@ fd4_screen_init(struct pipe_screen *pscreen) { struct fd_screen *screen = fd_screen(pscreen); screen->max_rts = A4XX_MAX_RENDER_TARGETS; - screen->setup_slices = fd4_setup_slices; + screen->layout_resource = fd4_layout_resource; pscreen->context_create = fd4_context_create; pscreen->is_format_supported = fd4_screen_is_format_supported; fd4_emit_init_screen(pscreen); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c index 02ebf9f09f0..2be8387e116 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c @@ -7,6 +7,7 @@ */ #include "fd5_resource.h" +#include "fd5_blitter.h" static void setup_lrz(struct fd_resource *rsc) @@ -19,13 +20,18 @@ setup_lrz(struct fd_resource *rsc) } uint32_t -fd5_setup_slices(struct fd_resource *rsc) +fd5_layout_resource(struct fd_resource *rsc, enum fd_layout_type type) { struct pipe_resource *prsc = &rsc->b.b; if (FD_DBG(LRZ) && has_depth(prsc->format) && !is_z32(prsc->format)) setup_lrz(rsc); + if (type >= FD_LAYOUT_TILED) + rsc->layout.tile_mode = fd5_tile_mode(prsc); + if (type == FD_LAYOUT_UBWC) + rsc->layout.ubwc = true; + fdl5_layout(&rsc->layout, prsc->format, fd_resource_nr_samples(prsc), prsc->width0, prsc->height0, prsc->depth0, prsc->last_level + 1, prsc->array_size, prsc->target == PIPE_TEXTURE_3D); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_resource.h b/src/gallium/drivers/freedreno/a5xx/fd5_resource.h index ec7cd2a0c03..0cfb5fae82f 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_resource.h +++ b/src/gallium/drivers/freedreno/a5xx/fd5_resource.h @@ -11,6 +11,6 @@ #include "freedreno_resource.h" -uint32_t fd5_setup_slices(struct fd_resource *rsc); +uint32_t fd5_layout_resource(struct fd_resource *rsc, enum fd_layout_type type); #endif /* FD5_RESOURCE_H_ */ diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c index a2371347662..cb542a44637 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_screen.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_screen.c @@ -122,7 +122,7 @@ fd5_screen_init(struct pipe_screen *pscreen) pscreen->context_create = fd5_context_create; pscreen->is_format_supported = fd5_screen_is_format_supported; - screen->setup_slices = fd5_setup_slices; + screen->layout_resource = fd5_layout_resource; if (FD_DBG(TTILE)) screen->tile_mode = fd5_tile_mode; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc index e0e94b8ecf8..47271f11737 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc @@ -252,11 +252,16 @@ setup_lrz(struct fd_resource *rsc) template static uint32_t -fd6_setup_slices(struct fd_resource *rsc) +fd6_layout_resource(struct fd_resource *rsc, enum fd_layout_type type) { struct pipe_resource *prsc = &rsc->b.b; struct fd_screen *screen = fd_screen(prsc->screen); + if (type >= FD_LAYOUT_TILED) + rsc->layout.tile_mode = fd6_tile_mode(prsc); + if (type == FD_LAYOUT_UBWC) + rsc->layout.ubwc = true; + if (rsc->layout.ubwc && !ok_ubwc_format(prsc->screen, prsc->format, prsc->nr_samples)) rsc->layout.ubwc = false; @@ -354,7 +359,7 @@ fd6_resource_screen_init(struct pipe_screen *pscreen) { struct fd_screen *screen = fd_screen(pscreen); - screen->setup_slices = fd6_setup_slices; + screen->layout_resource = fd6_layout_resource; screen->layout_resource_for_modifier = fd6_layout_resource_for_modifier; screen->is_format_supported = fd6_is_format_supported; } diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 46498bdba24..946cccf4f18 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -1235,13 +1235,6 @@ alloc_resource_struct(struct pipe_screen *pscreen, return rsc; } -enum fd_layout_type { - ERROR, - LINEAR, - TILED, - UBWC, -}; - static bool has_implicit_modifier(const uint64_t *modifiers, int count) { @@ -1269,34 +1262,34 @@ get_best_layout(struct fd_screen *screen, /* First, find all the conditions which would force us to linear */ if (!screen->tile_mode) - return LINEAR; + return FD_LAYOUT_LINEAR; if (!screen->tile_mode(tmpl)) - return LINEAR; + return FD_LAYOUT_LINEAR; if (tmpl->target == PIPE_BUFFER) - return LINEAR; + return FD_LAYOUT_LINEAR; if ((tmpl->usage == PIPE_USAGE_STAGING) && !util_format_is_depth_or_stencil(tmpl->format)) - return LINEAR; + return FD_LAYOUT_LINEAR; if (tmpl->bind & PIPE_BIND_LINEAR) { if (tmpl->usage != PIPE_USAGE_STAGING) perf_debug("%" PRSC_FMT ": forcing linear: bind flags", PRSC_ARGS(tmpl)); - return LINEAR; + return FD_LAYOUT_LINEAR; } if (FD_DBG(NOTILE)) - return LINEAR; + return FD_LAYOUT_LINEAR; /* Shared resources without explicit modifiers must always be linear */ if (!can_explicit && (tmpl->bind & PIPE_BIND_SHARED)) { perf_debug("%" PRSC_FMT ": forcing linear: shared resource + implicit modifiers", PRSC_ARGS(tmpl)); - return LINEAR; + return FD_LAYOUT_LINEAR; } bool ubwc_ok = is_a6xx(screen) && !screen->info->a6xx.is_a702; @@ -1324,21 +1317,21 @@ get_best_layout(struct fd_screen *screen, } if (ubwc_ok) - return UBWC; + return FD_LAYOUT_UBWC; if (can_implicit || drm_find_modifier(DRM_FORMAT_MOD_QCOM_TILED3, modifiers, count)) - return TILED; + return FD_LAYOUT_TILED; if (!drm_find_modifier(DRM_FORMAT_MOD_LINEAR, modifiers, count)) { perf_debug("%" PRSC_FMT ": need linear but not in modifier set", PRSC_ARGS(tmpl)); - return ERROR; + return FD_LAYOUT_ERROR; } perf_debug("%" PRSC_FMT ": not using tiling: explicit modifiers and no UBWC", PRSC_ARGS(tmpl)); - return LINEAR; + return FD_LAYOUT_LINEAR; } /** @@ -1379,16 +1372,11 @@ fd_resource_allocate_and_resolve(struct pipe_screen *pscreen, enum fd_layout_type layout = get_best_layout(screen, tmpl, modifiers, count); - if (layout == ERROR) { + if (layout == FD_LAYOUT_ERROR) { free(prsc); return NULL; } - if (layout >= TILED) - rsc->layout.tile_mode = screen->tile_mode(prsc); - if (layout == UBWC) - rsc->layout.ubwc = true; - rsc->internal_format = format; if (prsc->target == PIPE_BUFFER) { @@ -1396,7 +1384,7 @@ fd_resource_allocate_and_resolve(struct pipe_screen *pscreen, size = prsc->width0; fdl_layout_buffer(&rsc->layout, size); } else { - size = screen->setup_slices(rsc); + size = screen->layout_resource(rsc, layout); } /* special case for hw-query buffer, which we need to allocate before we diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index a1ec670df2b..c34fae7d6aa 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -29,6 +29,13 @@ struct fd_bo; +enum fd_layout_type { + FD_LAYOUT_ERROR, + FD_LAYOUT_LINEAR, + FD_LAYOUT_TILED, + FD_LAYOUT_UBWC, +}; + /* Potential reasons for needing to skip bypass path and use GMEM, the * generation backend can override this with screen->gmem_reason_mask */ @@ -127,7 +134,7 @@ struct fd_screen { */ struct fd_pipe *pipe; - uint32_t (*setup_slices)(struct fd_resource *rsc); + uint32_t (*layout_resource)(struct fd_resource *rsc, enum fd_layout_type type); unsigned (*tile_mode)(const struct pipe_resource *prsc); int (*layout_resource_for_modifier)(struct fd_resource *rsc, uint64_t modifier);