mirror of
https://github.com/brl/mutter.git
synced 2025-04-16 15:19:39 +00:00
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:
parent
e45d7f70e8
commit
5c53284bde
@ -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 ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user