cursor-renderer/native: Move buffer creation to helper

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2275>
This commit is contained in:
Jonas Ådahl 2022-02-08 15:05:32 +01:00 committed by Marge Bot
parent ea39142da2
commit 42ed40ac52

View File

@ -1217,6 +1217,85 @@ ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
return cursor_priv; return cursor_priv;
} }
static MetaDrmBuffer *
create_cursor_drm_buffer_gbm (MetaGpuKms *gpu_kms,
MetaDeviceFile *device_file,
uint8_t *pixels,
int width,
int height,
int stride,
int cursor_width,
int cursor_height,
uint32_t format,
GError **error)
{
struct gbm_device *gbm_device;
struct gbm_bo *bo;
uint8_t buf[4 * cursor_width * cursor_height];
int i;
MetaDrmBufferFlags flags;
MetaDrmBufferGbm *buffer_gbm;
gbm_device = meta_gbm_device_from_gpu (gpu_kms);
if (!gbm_device_is_format_supported (gbm_device, format,
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Buffer format not supported");
return NULL;
}
bo = gbm_bo_create (gbm_device, cursor_width, cursor_height,
format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
if (!bo)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Failed to allocate gbm_bo: %s", g_strerror (errno));
return NULL;
}
memset (buf, 0, sizeof (buf));
for (i = 0; i < height; i++)
memcpy (buf + i * 4 * cursor_width, pixels + i * stride, width * 4);
if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Failed write to gbm_bo: %s", g_strerror (errno));
gbm_bo_destroy (bo);
return NULL;
}
flags = META_DRM_BUFFER_FLAG_DISABLE_MODIFIERS;
buffer_gbm = meta_drm_buffer_gbm_new_take (device_file, bo, flags, error);
if (!buffer_gbm)
{
gbm_bo_destroy (bo);
return NULL;
}
return META_DRM_BUFFER (buffer_gbm);
}
static MetaDrmBuffer *
create_cursor_drm_buffer (MetaGpuKms *gpu_kms,
MetaDeviceFile *device_file,
uint8_t *pixels,
int width,
int height,
int stride,
int cursor_width,
int cursor_height,
uint32_t format,
GError **error)
{
return create_cursor_drm_buffer_gbm (gpu_kms, device_file,
pixels,
width, height, stride,
cursor_width, cursor_height,
format,
error);
}
static void static void
load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native, load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
MetaGpuKms *gpu_kms, MetaGpuKms *gpu_kms,
@ -1229,9 +1308,14 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
{ {
MetaCursorRendererNativePrivate *priv = MetaCursorRendererNativePrivate *priv =
meta_cursor_renderer_native_get_instance_private (native); meta_cursor_renderer_native_get_instance_private (native);
MetaBackendNative *backend_native = META_BACKEND_NATIVE (priv->backend);
MetaDevicePool *device_pool =
meta_backend_native_get_device_pool (backend_native);
uint64_t cursor_width, cursor_height; uint64_t cursor_width, cursor_height;
MetaDrmBuffer *buffer;
MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data; MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
struct gbm_device *gbm_device; g_autoptr (MetaDeviceFile) device_file = NULL;
g_autoptr (GError) error = NULL;
cursor_renderer_gpu_data = cursor_renderer_gpu_data =
meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms); meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
@ -1248,21 +1332,6 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
return; return;
} }
gbm_device = meta_gbm_device_from_gpu (gpu_kms);
if (gbm_device_is_format_supported (gbm_device, gbm_format,
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
{
MetaBackendNative *backend_native = META_BACKEND_NATIVE (priv->backend);
MetaDevicePool *device_pool =
meta_backend_native_get_device_pool (backend_native);
g_autoptr (MetaDeviceFile) device_file = NULL;
struct gbm_bo *bo;
uint8_t buf[4 * cursor_width * cursor_height];
uint i;
g_autoptr (GError) error = NULL;
MetaDrmBufferFlags flags;
MetaDrmBufferGbm *buffer_gbm;
device_file = meta_device_pool_open (device_pool, device_file = meta_device_pool_open (device_pool,
meta_gpu_kms_get_file_path (gpu_kms), meta_gpu_kms_get_file_path (gpu_kms),
META_DEVICE_FILE_FLAG_TAKE_CONTROL, META_DEVICE_FILE_FLAG_TAKE_CONTROL,
@ -1275,43 +1344,20 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
return; return;
} }
bo = gbm_bo_create (gbm_device, cursor_width, cursor_height, buffer = create_cursor_drm_buffer (gpu_kms, device_file,
gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE); pixels,
if (!bo) width, height, rowstride,
{ cursor_width,
meta_warning ("Failed to allocate HW cursor buffer"); cursor_height,
return; gbm_format,
}
memset (buf, 0, sizeof(buf));
for (i = 0; i < height; i++)
memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
{
meta_warning ("Failed to write cursors buffer data: %s",
g_strerror (errno));
gbm_bo_destroy (bo);
return;
}
flags = META_DRM_BUFFER_FLAG_DISABLE_MODIFIERS;
buffer_gbm = meta_drm_buffer_gbm_new_take (device_file, bo, flags,
&error); &error);
if (!buffer_gbm) if (!buffer)
{ {
meta_warning ("Failed to create DRM buffer wrapper: %s", g_warning ("Realizing HW cursor failed: %s", error->message);
error->message);
gbm_bo_destroy (bo);
return; return;
} }
set_pending_cursor_sprite_buffer (cursor_sprite, gpu_kms, set_pending_cursor_sprite_buffer (cursor_sprite, gpu_kms, buffer);
META_DRM_BUFFER (buffer_gbm));
}
else
{
meta_warning ("HW cursor for format %d not supported", gbm_format);
}
} }
static gboolean static gboolean