egl/wayland: move loader_dri_create_image() calls to separate functions

In get_back_bo() we have two calls to loader_dri_create_image() and some
overhead. As in the next commit we add another call to this same
function and more overhead to get_back_bo(), it starts to lose
legibility.

So move loader_dri_create_image() calls to separate functions, allowing
us to have an easier to read get_back_bo(). It also adds some minor
style changes.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11248>
This commit is contained in:
Leandro Ribeiro 2021-06-08 15:13:40 -03:00 committed by Marge Bot
parent 83916ae0b9
commit 5b56fc748a
1 changed files with 58 additions and 37 deletions

View File

@ -858,6 +858,60 @@ dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
dri2_egl_surface_free_local_buffers(dri2_surf);
}
static void
create_dri_image_diff_gpu(struct dri2_egl_surface *dri2_surf,
unsigned int linear_dri_image_format, uint32_t use_flags)
{
struct dri2_egl_display *dri2_dpy =
dri2_egl_display(dri2_surf->base.Resource.Display);
uint64_t linear_mod;
/* The LINEAR modifier should be a perfect alias of the LINEAR use flag */
linear_mod = DRM_FORMAT_MOD_LINEAR;
dri2_surf->back->linear_copy =
loader_dri_create_image(dri2_dpy->dri_screen, dri2_dpy->image,
dri2_surf->base.Width,
dri2_surf->base.Height,
linear_dri_image_format,
use_flags | __DRI_IMAGE_USE_LINEAR,
&linear_mod, 1, NULL);
}
static void
create_dri_image(struct dri2_egl_surface *dri2_surf,
unsigned int dri_image_format, uint32_t use_flags)
{
struct dri2_egl_display *dri2_dpy =
dri2_egl_display(dri2_surf->base.Resource.Display);
int visual_idx;
uint64_t *modifiers;
unsigned int num_modifiers;
visual_idx = dri2_wl_visual_idx_from_fourcc(dri2_surf->format);
modifiers = u_vector_tail(&dri2_dpy->formats.modifiers[visual_idx]);
num_modifiers = u_vector_length(&dri2_dpy->formats.modifiers[visual_idx]);
/* For the purposes of this function, an INVALID modifier on
* its own means the modifiers aren't supported. */
if (num_modifiers == 0 ||
(num_modifiers == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID)) {
num_modifiers = 0;
modifiers = NULL;
}
/* If our DRIImage implementation does not support createImageWithModifiers,
* then fall back to the old createImage, and hope it allocates an image
* which is acceptable to the winsys. */
dri2_surf->back->dri_image =
loader_dri_create_image(dri2_dpy->dri_screen, dri2_dpy->image,
dri2_surf->base.Width,
dri2_surf->base.Height,
dri_image_format,
dri2_dpy->is_different_gpu ? 0 : use_flags,
modifiers, num_modifiers, NULL);
}
static int
get_back_bo(struct dri2_egl_surface *dri2_surf)
{
@ -867,22 +921,11 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
int visual_idx;
unsigned int dri_image_format;
unsigned int linear_dri_image_format;
uint64_t *modifiers;
int num_modifiers;
visual_idx = dri2_wl_visual_idx_from_fourcc(dri2_surf->format);
assert(visual_idx != -1);
dri_image_format = dri2_wl_visuals[visual_idx].dri_image_format;
linear_dri_image_format = dri_image_format;
modifiers = u_vector_tail(&dri2_dpy->formats.modifiers[visual_idx]);
num_modifiers = u_vector_length(&dri2_dpy->formats.modifiers[visual_idx]);
if (num_modifiers == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) {
/* For the purposes of this function, an INVALID modifier on its own
* means the modifiers aren't supported.
*/
num_modifiers = 0;
}
/* Substitute dri image format if server does not support original format */
if (!BITSET_TEST(dri2_dpy->formats.formats_bitmap, visual_idx))
@ -937,39 +980,17 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
use_flags |= __DRI_IMAGE_USE_PROTECTED;
}
if (dri2_dpy->is_different_gpu &&
dri2_surf->back->linear_copy == NULL) {
/* The LINEAR modifier should be a perfect alias of the LINEAR use
* flag; try the new interface first before the old, then fall back. */
uint64_t linear_mod = DRM_FORMAT_MOD_LINEAR;
dri2_surf->back->linear_copy =
loader_dri_create_image(dri2_dpy->dri_screen, dri2_dpy->image,
dri2_surf->base.Width,
dri2_surf->base.Height,
linear_dri_image_format,
use_flags | __DRI_IMAGE_USE_LINEAR,
&linear_mod, 1, NULL);
if (dri2_dpy->is_different_gpu && dri2_surf->back->linear_copy == NULL) {
create_dri_image_diff_gpu(dri2_surf, linear_dri_image_format, use_flags);
if (dri2_surf->back->linear_copy == NULL)
return -1;
}
if (dri2_surf->back->dri_image == NULL) {
/* If our DRIImage implementation does not support
* createImageWithModifiers, then fall back to the old createImage,
* and hope it allocates an image which is acceptable to the winsys.
*/
dri2_surf->back->dri_image =
loader_dri_create_image(dri2_dpy->dri_screen, dri2_dpy->image,
dri2_surf->base.Width,
dri2_surf->base.Height,
dri_image_format,
dri2_dpy->is_different_gpu ? 0 : use_flags,
modifiers, num_modifiers, NULL);
create_dri_image(dri2_surf, dri_image_format, use_flags);
dri2_surf->back->age = 0;
}
if (dri2_surf->back->dri_image == NULL)
return -1;