asahi: Implement dmabuf modifier queries
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19606>
This commit is contained in:
@@ -75,6 +75,11 @@ static const struct debug_named_value agx_debug_options[] = {
|
|||||||
DEBUG_NAMED_VALUE_END
|
DEBUG_NAMED_VALUE_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint64_t agx_best_modifiers[] = {
|
||||||
|
DRM_FORMAT_MOD_APPLE_TWIDDLED,
|
||||||
|
DRM_FORMAT_MOD_LINEAR,
|
||||||
|
};
|
||||||
|
|
||||||
void agx_init_state_functions(struct pipe_context *ctx);
|
void agx_init_state_functions(struct pipe_context *ctx);
|
||||||
|
|
||||||
static struct pipe_query *
|
static struct pipe_query *
|
||||||
@@ -1112,6 +1117,47 @@ agx_is_format_supported(struct pipe_screen* pscreen,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
agx_query_dmabuf_modifiers(struct pipe_screen *screen,
|
||||||
|
enum pipe_format format, int max,
|
||||||
|
uint64_t *modifiers,
|
||||||
|
unsigned int *external_only, int *out_count)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (max == 0) {
|
||||||
|
*out_count = ARRAY_SIZE(agx_best_modifiers);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(agx_best_modifiers) && i < max; i++) {
|
||||||
|
if (external_only)
|
||||||
|
external_only[i] = 0;
|
||||||
|
|
||||||
|
modifiers[i] = agx_best_modifiers[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the number of modifiers copied */
|
||||||
|
*out_count = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
agx_is_dmabuf_modifier_supported(struct pipe_screen *screen,
|
||||||
|
uint64_t modifier, enum pipe_format format,
|
||||||
|
bool *external_only)
|
||||||
|
{
|
||||||
|
if (external_only)
|
||||||
|
*external_only = false;
|
||||||
|
|
||||||
|
switch (modifier) {
|
||||||
|
case DRM_FORMAT_MOD_APPLE_TWIDDLED:
|
||||||
|
case DRM_FORMAT_MOD_LINEAR:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
agx_destroy_screen(struct pipe_screen *screen)
|
agx_destroy_screen(struct pipe_screen *screen)
|
||||||
{
|
{
|
||||||
@@ -1219,6 +1265,8 @@ agx_screen_create(int fd, struct renderonly *ro, struct sw_winsys *winsys)
|
|||||||
screen->get_compute_param = agx_get_compute_param;
|
screen->get_compute_param = agx_get_compute_param;
|
||||||
screen->get_paramf = agx_get_paramf;
|
screen->get_paramf = agx_get_paramf;
|
||||||
screen->is_format_supported = agx_is_format_supported;
|
screen->is_format_supported = agx_is_format_supported;
|
||||||
|
screen->query_dmabuf_modifiers = agx_query_dmabuf_modifiers;
|
||||||
|
screen->is_dmabuf_modifier_supported = agx_is_dmabuf_modifier_supported;
|
||||||
screen->context_create = agx_create_context;
|
screen->context_create = agx_create_context;
|
||||||
screen->resource_from_handle = agx_resource_from_handle;
|
screen->resource_from_handle = agx_resource_from_handle;
|
||||||
screen->resource_get_handle = agx_resource_get_handle;
|
screen->resource_get_handle = agx_resource_get_handle;
|
||||||
|
Reference in New Issue
Block a user