freedreno: Rework supported-modifiers handling

We should be taking into account the format while deciding if we support
a given modifier or not.  So a simple array of supported modifiers does
not do the trick.

While we are at it, also handle QCOM_TILED3.  (We really only use
QCOM_TILED2 in GMEM so it isn't user visible.)

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9938
Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25575>
This commit is contained in:
Rob Clark 2023-10-05 15:26:12 -07:00 committed by Marge Bot
parent e6f7fa0211
commit 1e820ac128
6 changed files with 60 additions and 47 deletions

View file

@ -1411,6 +1411,17 @@ fd6_blitter_init(struct pipe_context *pctx)
template void fd6_blitter_init<A6XX>(struct pipe_context *pctx); template void fd6_blitter_init<A6XX>(struct pipe_context *pctx);
template void fd6_blitter_init<A7XX>(struct pipe_context *pctx); template void fd6_blitter_init<A7XX>(struct pipe_context *pctx);
unsigned
fd6_tile_mode_for_format(enum pipe_format pfmt)
{
/* basically just has to be a format we can blit, so uploads/downloads
* via linear staging buffer works:
*/
if (ok_format(pfmt))
return TILE6_3;
return TILE6_LINEAR;
}
unsigned unsigned
fd6_tile_mode(const struct pipe_resource *tmpl) fd6_tile_mode(const struct pipe_resource *tmpl)
{ {
@ -1421,11 +1432,5 @@ fd6_tile_mode(const struct pipe_resource *tmpl)
!util_format_is_depth_or_stencil(tmpl->format)) !util_format_is_depth_or_stencil(tmpl->format))
return TILE6_LINEAR; return TILE6_LINEAR;
/* basically just has to be a format we can blit, so uploads/downloads return fd6_tile_mode_for_format(tmpl->format);
* via linear staging buffer works:
*/
if (ok_format(tmpl->format))
return TILE6_3;
return TILE6_LINEAR;
} }

View file

@ -35,6 +35,7 @@
template <chip CHIP> template <chip CHIP>
void fd6_blitter_init(struct pipe_context *pctx); void fd6_blitter_init(struct pipe_context *pctx);
unsigned fd6_tile_mode_for_format(enum pipe_format pfmt);
unsigned fd6_tile_mode(const struct pipe_resource *tmpl); unsigned fd6_tile_mode(const struct pipe_resource *tmpl);
/* /*

View file

@ -29,6 +29,7 @@
#include "drm-uapi/drm_fourcc.h" #include "drm-uapi/drm_fourcc.h"
#include "a6xx/fd6_blitter.h"
#include "fd6_resource.h" #include "fd6_resource.h"
#include "fdl/fd6_format_table.h" #include "fdl/fd6_format_table.h"
@ -333,10 +334,22 @@ fd6_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
} }
} }
static const uint64_t supported_modifiers[] = { static bool
DRM_FORMAT_MOD_LINEAR, fd6_is_format_supported(struct pipe_screen *pscreen,
DRM_FORMAT_MOD_QCOM_COMPRESSED, enum pipe_format fmt,
}; uint64_t modifier)
{
switch (modifier) {
case DRM_FORMAT_MOD_LINEAR:
return true;
case DRM_FORMAT_MOD_QCOM_COMPRESSED:
return ok_ubwc_format(pscreen, fmt);
case DRM_FORMAT_MOD_QCOM_TILED3:
return fd6_tile_mode_for_format(fmt) == TILE6_3;
default:
return false;
}
}
void void
fd6_resource_screen_init(struct pipe_screen *pscreen) fd6_resource_screen_init(struct pipe_screen *pscreen)
@ -345,6 +358,5 @@ fd6_resource_screen_init(struct pipe_screen *pscreen)
screen->setup_slices = fd6_setup_slices; screen->setup_slices = fd6_setup_slices;
screen->layout_resource_for_modifier = fd6_layout_resource_for_modifier; screen->layout_resource_for_modifier = fd6_layout_resource_for_modifier;
screen->supported_modifiers = supported_modifiers; screen->is_format_supported = fd6_is_format_supported;
screen->num_supported_modifiers = ARRAY_SIZE(supported_modifiers);
} }

View file

@ -1629,10 +1629,6 @@ static const struct u_transfer_vtbl transfer_vtbl = {
.get_stencil = fd_resource_get_stencil, .get_stencil = fd_resource_get_stencil,
}; };
static const uint64_t supported_modifiers[] = {
DRM_FORMAT_MOD_LINEAR,
};
static int static int
fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier) fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
{ {
@ -1746,10 +1742,6 @@ fd_resource_screen_init(struct pipe_screen *pscreen)
if (!screen->layout_resource_for_modifier) if (!screen->layout_resource_for_modifier)
screen->layout_resource_for_modifier = fd_layout_resource_for_modifier; screen->layout_resource_for_modifier = fd_layout_resource_for_modifier;
if (!screen->supported_modifiers) {
screen->supported_modifiers = supported_modifiers;
screen->num_supported_modifiers = ARRAY_SIZE(supported_modifiers);
}
/* GL_EXT_memory_object */ /* GL_EXT_memory_object */
pscreen->memobj_create_from_handle = fd_memobj_create_from_handle; pscreen->memobj_create_from_handle = fd_memobj_create_from_handle;

View file

@ -951,29 +951,42 @@ fd_screen_bo_get_handle(struct pipe_screen *pscreen, struct fd_bo *bo,
} }
} }
static bool
is_format_supported(struct pipe_screen *pscreen,
enum pipe_format format,
uint64_t modifier)
{
struct fd_screen *screen = fd_screen(pscreen);
if (screen->is_format_supported)
return screen->is_format_supported(pscreen, format, modifier);
return modifier == DRM_FORMAT_MOD_LINEAR;
}
static void static void
fd_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen, fd_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
enum pipe_format format, int max, enum pipe_format format, int max,
uint64_t *modifiers, uint64_t *modifiers,
unsigned int *external_only, int *count) unsigned int *external_only, int *count)
{ {
struct fd_screen *screen = fd_screen(pscreen); const uint64_t all_modifiers[] = {
int i, num = 0; DRM_FORMAT_MOD_LINEAR,
DRM_FORMAT_MOD_QCOM_COMPRESSED,
DRM_FORMAT_MOD_QCOM_TILED3,
};
max = MIN2(max, screen->num_supported_modifiers); int num = 0;
if (!max) { for (int i = 0; i < ARRAY_SIZE(all_modifiers); i++) {
max = screen->num_supported_modifiers; if (!is_format_supported(pscreen, format, all_modifiers[i]))
external_only = NULL; continue;
modifiers = NULL;
}
for (i = 0; i < max; i++) { if (num < max) {
if (modifiers) if (modifiers)
modifiers[num] = screen->supported_modifiers[i]; modifiers[num] = all_modifiers[i];
if (external_only) if (external_only)
external_only[num] = 0; external_only[num] = false;
}
num++; num++;
} }
@ -987,19 +1000,7 @@ fd_screen_is_dmabuf_modifier_supported(struct pipe_screen *pscreen,
enum pipe_format format, enum pipe_format format,
bool *external_only) bool *external_only)
{ {
struct fd_screen *screen = fd_screen(pscreen); return is_format_supported(pscreen, format, modifier);
int i;
for (i = 0; i < screen->num_supported_modifiers; i++) {
if (modifier == screen->supported_modifiers[i]) {
if (external_only)
*external_only = false;
return true;
}
}
return false;
} }
struct fd_bo * struct fd_bo *

View file

@ -129,6 +129,8 @@ struct fd_screen {
unsigned (*tile_mode)(const struct pipe_resource *prsc); unsigned (*tile_mode)(const struct pipe_resource *prsc);
int (*layout_resource_for_modifier)(struct fd_resource *rsc, int (*layout_resource_for_modifier)(struct fd_resource *rsc,
uint64_t modifier); uint64_t modifier);
bool (*is_format_supported)(struct pipe_screen *pscreen,
enum pipe_format fmt, uint64_t modifier);
/* indirect-branch emit: */ /* indirect-branch emit: */
void (*emit_ib)(struct fd_ringbuffer *ring, struct fd_ringbuffer *target); void (*emit_ib)(struct fd_ringbuffer *ring, struct fd_ringbuffer *target);