From 2b042cb9c2b2206c22107806f38f199d00f45a93 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 25 Jul 2024 13:57:44 -0400 Subject: [PATCH] gallium: move loader_dri_create_image to dri frontend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is another case of bad dependencies leaving dri the only place to move something, which then exposes some other snags to be resolved later Reviewed-by: Marek Olšák Reviewed-by: Adam Jackson Part-of: --- src/egl/drivers/dri2/platform_wayland.c | 7 ++--- src/gallium/frontends/dri/dri_helpers.c | 34 +++++++++++++++++++++++++ src/gallium/frontends/dri/dri_util.h | 8 ++++++ src/gallium/targets/dri/dri.sym.in | 3 ++- src/gbm/backends/dri/gbm_dri.c | 3 ++- src/gbm/meson.build | 5 +++- src/loader/loader_dri_helper.c | 32 ----------------------- src/loader/loader_dri_helper.h | 8 ------ src/loader_dri3/loader_dri3_helper.c | 2 +- 9 files changed, 55 insertions(+), 47 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 1c642516b37..5e8ad0cdbff 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -50,6 +50,7 @@ #include "kopper_interface.h" #include "loader.h" #include "loader_dri_helper.h" +#include "dri_util.h" #include #include "linux-dmabuf-unstable-v1-client-protocol.h" @@ -1068,7 +1069,7 @@ create_dri_image(struct dri2_egl_surface *dri2_surf, modifiers = NULL; } - dri2_surf->back->dri_image = loader_dri_create_image( + dri2_surf->back->dri_image = dri_create_image_with_modifiers( dri2_dpy->dri_screen_render_gpu, dri2_dpy->image, dri2_surf->base.Width, dri2_surf->base.Height, pipe_format, (dri2_dpy->fd_render_gpu != dri2_dpy->fd_display_gpu) ? 0 : use_flags, @@ -1209,7 +1210,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) __DRIimage *linear_copy_display_gpu_image = NULL; if (dri2_dpy->dri_screen_display_gpu) { - linear_copy_display_gpu_image = loader_dri_create_image( + linear_copy_display_gpu_image = dri_create_image_with_modifiers( dri2_dpy->dri_screen_display_gpu, dri2_dpy->image, dri2_surf->base.Width, dri2_surf->base.Height, linear_pipe_format, use_flags | __DRI_IMAGE_USE_LINEAR, @@ -1294,7 +1295,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) } if (!dri2_surf->back->linear_copy) { - dri2_surf->back->linear_copy = loader_dri_create_image( + dri2_surf->back->linear_copy = dri_create_image_with_modifiers( dri2_dpy->dri_screen_render_gpu, dri2_dpy->image, dri2_surf->base.Width, dri2_surf->base.Height, linear_pipe_format, use_flags | __DRI_IMAGE_USE_LINEAR, diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c index 3d13b58051a..e352e647ccd 100644 --- a/src/gallium/frontends/dri/dri_helpers.c +++ b/src/gallium/frontends/dri/dri_helpers.c @@ -732,4 +732,38 @@ dri_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats, return true; } + +__DRIimage * +dri_create_image_with_modifiers(__DRIscreen *screen, + const __DRIimageExtension *image, + uint32_t width, uint32_t height, + uint32_t dri_format, uint32_t dri_usage, + const uint64_t *modifiers, + unsigned int modifiers_count, + void *loaderPrivate) +{ + if (modifiers && modifiers_count > 0) { + bool has_valid_modifier = false; + int i; + + /* It's acceptable to create an image with INVALID modifier in the list, + * but it cannot be on the only modifier (since it will certainly fail + * later). While we could easily catch this after modifier creation, doing + * the check here is a convenient debug check likely pointing at whatever + * interface the client is using to build its modifier list. + */ + for (i = 0; i < modifiers_count; i++) { + if (modifiers[i] != DRM_FORMAT_MOD_INVALID) { + has_valid_modifier = true; + break; + } + } + if (!has_valid_modifier) + return NULL; + } + + return image->createImage(screen, width, height, dri_format, + modifiers, modifiers_count, dri_usage, + loaderPrivate); +} /* vim: set sw=3 ts=8 sts=3 expandtab: */ diff --git a/src/gallium/frontends/dri/dri_util.h b/src/gallium/frontends/dri/dri_util.h index 78efae6aa71..f83c600b9d6 100644 --- a/src/gallium/frontends/dri/dri_util.h +++ b/src/gallium/frontends/dri/dri_util.h @@ -282,4 +282,12 @@ PUBLIC bool dri2_query_dma_buf_format_modifier_attribs(__DRIscreen *_screen, uint32_t fourcc, uint64_t modifier, int attrib, uint64_t *value); +PUBLIC __DRIimage * +dri_create_image_with_modifiers(__DRIscreen *screen, + const __DRIimageExtension *image, + uint32_t width, uint32_t height, + uint32_t dri_format, uint32_t dri_usage, + const uint64_t *modifiers, + unsigned int modifiers_count, + void *loaderPrivate); #endif /* _DRI_UTIL_H_ */ diff --git a/src/gallium/targets/dri/dri.sym.in b/src/gallium/targets/dri/dri.sym.in index 0cee8992d1b..c388eaf5459 100644 --- a/src/gallium/targets/dri/dri.sym.in +++ b/src/gallium/targets/dri/dri.sym.in @@ -24,10 +24,11 @@ dri_interop_export_object; dri_interop_flush_objects; dri_loader_get_extensions; + dri_create_image_with_modifiers; dri_create_image_from_renderbuffer; dri2_destroy_image; dri2_create_from_texture; - dri2_create_image; + dri_create_image; dri2_query_image; dri2_dup_image; dri2_validate_usage; diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 9ab5e452872..5e1903d22f8 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -49,6 +49,7 @@ #include "loader.h" #include "util/u_debug.h" #include "util/macros.h" +#include "dri_util.h" /* For importing wl_buffer */ #if HAVE_WAYLAND_PLATFORM @@ -1044,7 +1045,7 @@ gbm_dri_bo_create(struct gbm_device *gbm, mods_comp = NULL; } - bo->image = loader_dri_create_image(dri->screen, dri->image, width, height, + bo->image = dri_create_image_with_modifiers(dri->screen, dri->image, width, height, dri_format, dri_use, mods_filtered ? mods_filtered : modifiers, mods_filtered ? count_filtered : count, diff --git a/src/gbm/meson.build b/src/gbm/meson.build index 582f18385f0..22508f6f225 100644 --- a/src/gbm/meson.build +++ b/src/gbm/meson.build @@ -16,9 +16,12 @@ args_gbm = [ ] deps_gbm = [] incs_gbm = [ - include_directories('main'), inc_include, inc_src, inc_loader, inc_gallium + include_directories('main'), inc_include, inc_src, inc_loader, inc_gallium, inc_st_dri ] +# TODO: fix includes to delete this +incs_gbm += inc_mesa + if with_dri2 files_gbm += files('backends/dri/gbm_dri.c', 'backends/dri/gbm_driint.h') deps_gbm += dep_libdrm # TODO: pthread-stubs diff --git a/src/loader/loader_dri_helper.c b/src/loader/loader_dri_helper.c index 89ca23ec298..e6f0e2d51d0 100644 --- a/src/loader/loader_dri_helper.c +++ b/src/loader/loader_dri_helper.c @@ -30,38 +30,6 @@ #include "loader_dri_helper.h" #include "util/driconf.h" -__DRIimage *loader_dri_create_image(__DRIscreen *screen, - const __DRIimageExtension *image, - uint32_t width, uint32_t height, - uint32_t dri_format, uint32_t dri_usage, - const uint64_t *modifiers, - unsigned int modifiers_count, - void *loaderPrivate) -{ - if (modifiers && modifiers_count > 0) { - bool has_valid_modifier = false; - int i; - - /* It's acceptable to create an image with INVALID modifier in the list, - * but it cannot be on the only modifier (since it will certainly fail - * later). While we could easily catch this after modifier creation, doing - * the check here is a convenient debug check likely pointing at whatever - * interface the client is using to build its modifier list. - */ - for (i = 0; i < modifiers_count; i++) { - if (modifiers[i] != DRM_FORMAT_MOD_INVALID) { - has_valid_modifier = true; - break; - } - } - if (!has_valid_modifier) - return NULL; - } - - return image->createImage(screen, width, height, dri_format, - modifiers, modifiers_count, dri_usage, - loaderPrivate); -} /* the DRIimage createImage function takes __DRI_IMAGE_FORMAT codes, while * the createImageFromDmaBufs call takes DRM_FORMAT codes. To avoid diff --git a/src/loader/loader_dri_helper.h b/src/loader/loader_dri_helper.h index 794049eea1a..3adb8730f5a 100644 --- a/src/loader/loader_dri_helper.h +++ b/src/loader/loader_dri_helper.h @@ -104,14 +104,6 @@ struct loader_screen_resources { #define __DRI_IMAGE_FORMAT_ABGR1555 PIPE_FORMAT_R5G5B5A1_UNORM #define __DRI_IMAGE_FORMAT_XBGR1555 PIPE_FORMAT_R5G5B5X1_UNORM -__DRIimage *loader_dri_create_image(__DRIscreen *screen, - const __DRIimageExtension *image, - uint32_t width, uint32_t height, - uint32_t dri_format, uint32_t dri_usage, - const uint64_t *modifiers, - unsigned int modifiers_count, - void *loaderPrivate); - int loader_image_format_to_fourcc(int format); diff --git a/src/loader_dri3/loader_dri3_helper.c b/src/loader_dri3/loader_dri3_helper.c index 41cfae2304e..74e6cedc6fb 100644 --- a/src/loader_dri3/loader_dri3_helper.c +++ b/src/loader_dri3/loader_dri3_helper.c @@ -1467,7 +1467,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int fourcc, free(mod_reply); } #endif - buffer->image = loader_dri_create_image(draw->dri_screen_render_gpu, draw->ext->image, + buffer->image = dri_create_image_with_modifiers(draw->dri_screen_render_gpu, draw->ext->image, width, height, format, __DRI_IMAGE_USE_SHARE | __DRI_IMAGE_USE_SCANOUT |