renderer-native: Turn dumb buffer into a simple type

Make dumb buffer creation/destruction reusable by introducing a
MetaDumbBuffer type (private to meta-renderer-native.c). This will
later be used for software based fallback paths for copying render GPU
buffers onto secondary GPUs.

https://bugzilla.gnome.org/show_bug.cgi?id=785381
This commit is contained in:
Jonas Ådahl 2017-07-24 15:38:46 +08:00
parent e45d7f70e8
commit 5c53284bde

View File

@ -96,6 +96,14 @@ typedef struct _MetaRendererNativeGpuData
gboolean no_add_fb2; gboolean no_add_fb2;
} MetaRendererNativeGpuData; } MetaRendererNativeGpuData;
typedef struct _MetaDumbBuffer
{
uint32_t fb_id;
uint32_t handle;
void *map;
uint64_t map_size;
} MetaDumbBuffer;
typedef struct _MetaOnscreenNative typedef struct _MetaOnscreenNative
{ {
MetaGpuKms *gpu_kms; MetaGpuKms *gpu_kms;
@ -112,12 +120,7 @@ typedef struct _MetaOnscreenNative
struct { struct {
EGLStreamKHR stream; EGLStreamKHR stream;
struct { MetaDumbBuffer dumb_fb;
uint32_t fb_id;
uint32_t handle;
void *map;
uint64_t map_size;
} dumb_fb;
} egl; } egl;
#endif #endif
@ -161,6 +164,18 @@ G_DEFINE_TYPE_WITH_CODE (MetaRendererNative,
static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable; static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable;
static const CoglWinsysVtable *parent_vtable; static const CoglWinsysVtable *parent_vtable;
static void
release_dumb_fb (MetaDumbBuffer *dumb_fb,
MetaGpuKms *gpu_kms);
static gboolean
init_dumb_fb (MetaDumbBuffer *dumb_fb,
MetaGpuKms *gpu_kms,
int width,
int height,
uint32_t format,
GError **error);
static void static void
meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data) meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data)
{ {
@ -1179,14 +1194,15 @@ meta_renderer_native_create_surface_egl_device (MetaRendererNative *renderer_nat
} }
static gboolean static gboolean
init_dumb_fb (MetaOnscreenNative *onscreen_native, init_dumb_fb (MetaDumbBuffer *dumb_fb,
int width, MetaGpuKms *gpu_kms,
int height, int width,
GError **error) int height,
uint32_t format,
GError **error)
{ {
MetaRendererNativeGpuData *renderer_gpu_data;
MetaGpuKms *gpu_kms = onscreen_native->gpu_kms;
MetaRendererNative *renderer_native = meta_renderer_native_from_gpu (gpu_kms); MetaRendererNative *renderer_native = meta_renderer_native_from_gpu (gpu_kms);
MetaRendererNativeGpuData *renderer_gpu_data;
struct drm_mode_create_dumb create_arg; struct drm_mode_create_dumb create_arg;
struct drm_mode_destroy_dumb destroy_arg; struct drm_mode_destroy_dumb destroy_arg;
struct drm_mode_map_dumb map_arg; struct drm_mode_map_dumb map_arg;
@ -1210,17 +1226,15 @@ init_dumb_fb (MetaOnscreenNative *onscreen_native,
goto err_ioctl; goto err_ioctl;
} }
renderer_gpu_data = renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
meta_renderer_native_get_gpu_data (renderer_native, gpu_kms);
onscreen_native->gpu_kms);
if (!renderer_gpu_data->no_add_fb2) if (!renderer_gpu_data->no_add_fb2)
{ {
uint32_t handles[4] = { create_arg.handle, }; uint32_t handles[4] = { create_arg.handle, };
uint32_t pitches[4] = { create_arg.pitch, }; uint32_t pitches[4] = { create_arg.pitch, };
uint32_t offsets[4] = { 0 }; uint32_t offsets[4] = { 0 };
if (drmModeAddFB2 (kms_fd, width, height, if (drmModeAddFB2 (kms_fd, width, height, format,
GBM_FORMAT_XRGB8888,
handles, pitches, offsets, handles, pitches, offsets,
&fb_id, 0) != 0) &fb_id, 0) != 0)
{ {
@ -1271,10 +1285,10 @@ init_dumb_fb (MetaOnscreenNative *onscreen_native,
goto err_mmap; goto err_mmap;
} }
onscreen_native->egl.dumb_fb.fb_id = fb_id; dumb_fb->fb_id = fb_id;
onscreen_native->egl.dumb_fb.handle = create_arg.handle; dumb_fb->handle = create_arg.handle;
onscreen_native->egl.dumb_fb.map = map; dumb_fb->map = map;
onscreen_native->egl.dumb_fb.map_size = create_arg.size; dumb_fb->map_size = create_arg.size;
return TRUE; return TRUE;
@ -1293,25 +1307,24 @@ err_ioctl:
} }
static void static void
release_dumb_fb (MetaOnscreenNative *onscreen_native) release_dumb_fb (MetaDumbBuffer *dumb_fb,
MetaGpuKms *gpu_kms)
{ {
MetaGpuKms *gpu_kms = onscreen_native->gpu_kms;
struct drm_mode_destroy_dumb destroy_arg; struct drm_mode_destroy_dumb destroy_arg;
int kms_fd; int kms_fd;
if (!onscreen_native->egl.dumb_fb.map) if (!dumb_fb->map)
return; return;
munmap (onscreen_native->egl.dumb_fb.map, munmap (dumb_fb->map, dumb_fb->map_size);
onscreen_native->egl.dumb_fb.map_size); dumb_fb->map = NULL;
onscreen_native->egl.dumb_fb.map = NULL;
kms_fd = meta_gpu_kms_get_fd (gpu_kms); kms_fd = meta_gpu_kms_get_fd (gpu_kms);
drmModeRmFB (kms_fd, onscreen_native->egl.dumb_fb.fb_id); drmModeRmFB (kms_fd, dumb_fb->fb_id);
destroy_arg = (struct drm_mode_destroy_dumb) { destroy_arg = (struct drm_mode_destroy_dumb) {
.handle = onscreen_native->egl.dumb_fb.handle .handle = dumb_fb->handle
}; };
drmIoctl (kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg); drmIoctl (kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_arg);
} }
@ -1402,7 +1415,11 @@ meta_onscreen_native_allocate (CoglOnscreen *onscreen,
break; break;
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
case META_RENDERER_NATIVE_MODE_EGL_DEVICE: case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
if (!init_dumb_fb (onscreen_native, width, height, error)) if (!init_dumb_fb (&onscreen_native->egl.dumb_fb,
onscreen_native->gpu_kms,
width, height,
GBM_FORMAT_XRGB8888,
error))
return FALSE; return FALSE;
view = onscreen_native->view; view = onscreen_native->view;
@ -1468,7 +1485,8 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
break; break;
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
case META_RENDERER_NATIVE_MODE_EGL_DEVICE: case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
release_dumb_fb (onscreen_native); release_dumb_fb (&onscreen_native->egl.dumb_fb,
onscreen_native->gpu_kms);
if (onscreen_native->egl.stream != EGL_NO_STREAM_KHR) if (onscreen_native->egl.stream != EGL_NO_STREAM_KHR)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();