MetaRendererNative: Put gbm related things in an anonymous struct

In order to separate gbm related fields from generic ones, put them in
anonymous structs.

https://bugzilla.gnome.org/show_bug.cgi?id=773629
This commit is contained in:
Jonas Ådahl 2016-08-18 11:11:30 +08:00
parent 87d6e45da5
commit 678ebbb7f6

View File

@ -64,11 +64,14 @@ enum
typedef struct _MetaOnscreenNative typedef struct _MetaOnscreenNative
{ {
struct {
struct gbm_surface *surface; struct gbm_surface *surface;
uint32_t current_fb_id; uint32_t current_fb_id;
uint32_t next_fb_id; uint32_t next_fb_id;
struct gbm_bo *current_bo; struct gbm_bo *current_bo;
struct gbm_bo *next_bo; struct gbm_bo *next_bo;
} gbm;
gboolean pending_swap_notify; gboolean pending_swap_notify;
gboolean pending_set_crtc; gboolean pending_set_crtc;
@ -85,7 +88,10 @@ struct _MetaRendererNative
EGLDisplay egl_display; EGLDisplay egl_display;
struct gbm_device *gbm; struct {
struct gbm_device *device;
} gbm;
CoglClosure *swap_notify_idle; CoglClosure *swap_notify_idle;
int64_t frame_counter; int64_t frame_counter;
@ -176,17 +182,17 @@ free_current_bo (CoglOnscreen *onscreen)
CoglRendererEGL *egl_renderer = cogl_renderer->winsys; CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
MetaRendererNative *renderer_native = egl_renderer->platform; MetaRendererNative *renderer_native = egl_renderer->platform;
if (onscreen_native->current_fb_id) if (onscreen_native->gbm.current_fb_id)
{ {
drmModeRmFB (renderer_native->kms_fd, drmModeRmFB (renderer_native->kms_fd,
onscreen_native->current_fb_id); onscreen_native->gbm.current_fb_id);
onscreen_native->current_fb_id = 0; onscreen_native->gbm.current_fb_id = 0;
} }
if (onscreen_native->current_bo) if (onscreen_native->gbm.current_bo)
{ {
gbm_surface_release_buffer (onscreen_native->surface, gbm_surface_release_buffer (onscreen_native->gbm.surface,
onscreen_native->current_bo); onscreen_native->gbm.current_bo);
onscreen_native->current_bo = NULL; onscreen_native->gbm.current_bo = NULL;
} }
} }
@ -288,7 +294,7 @@ meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0) COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0)
{ {
renderer_native->dummy_gbm_surface = renderer_native->dummy_gbm_surface =
gbm_surface_create (renderer_native->gbm, gbm_surface_create (renderer_native->gbm.device,
16, 16, 16, 16,
GBM_FORMAT_XRGB8888, GBM_FORMAT_XRGB8888,
GBM_BO_USE_RENDERING); GBM_BO_USE_RENDERING);
@ -351,11 +357,11 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
free_current_bo (onscreen); free_current_bo (onscreen);
onscreen_native->current_fb_id = onscreen_native->next_fb_id; onscreen_native->gbm.current_fb_id = onscreen_native->gbm.next_fb_id;
onscreen_native->next_fb_id = 0; onscreen_native->gbm.next_fb_id = 0;
onscreen_native->current_bo = onscreen_native->next_bo; onscreen_native->gbm.current_bo = onscreen_native->gbm.next_bo;
onscreen_native->next_bo = NULL; onscreen_native->gbm.next_bo = NULL;
} }
static void static void
@ -387,17 +393,17 @@ flip_closure_destroyed (MetaRendererView *view)
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
MetaOnscreenNative *onscreen_native = egl_onscreen->platform; MetaOnscreenNative *onscreen_native = egl_onscreen->platform;
if (onscreen_native->next_fb_id) if (onscreen_native->gbm.next_fb_id)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaRenderer *renderer = meta_backend_get_renderer (backend); MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer); MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
drmModeRmFB (renderer_native->kms_fd, onscreen_native->next_fb_id); drmModeRmFB (renderer_native->kms_fd, onscreen_native->gbm.next_fb_id);
gbm_surface_release_buffer (onscreen_native->surface, gbm_surface_release_buffer (onscreen_native->gbm.surface,
onscreen_native->next_bo); onscreen_native->gbm.next_bo);
onscreen_native->next_bo = NULL; onscreen_native->gbm.next_bo = NULL;
onscreen_native->next_fb_id = 0; onscreen_native->gbm.next_fb_id = 0;
meta_onscreen_native_queue_swap_notify (onscreen); meta_onscreen_native_queue_swap_notify (onscreen);
} }
@ -429,7 +435,7 @@ meta_onscreen_native_flip_crtc (MetaOnscreenNative *onscreen_native,
if (meta_monitor_manager_kms_flip_crtc (monitor_manager_kms, if (meta_monitor_manager_kms_flip_crtc (monitor_manager_kms,
crtc, crtc,
x, y, x, y,
onscreen_native->next_fb_id, onscreen_native->gbm.next_fb_id,
flip_closure)) flip_closure))
onscreen_native->pending_flips++; onscreen_native->pending_flips++;
@ -445,7 +451,7 @@ meta_onscreen_native_set_crtc_modes (MetaOnscreenNative *onscreen_native)
MetaMonitorManagerKms *monitor_manager_kms = MetaMonitorManagerKms *monitor_manager_kms =
META_MONITOR_MANAGER_KMS (monitor_manager); META_MONITOR_MANAGER_KMS (monitor_manager);
MetaRendererView *view = onscreen_native->view; MetaRendererView *view = onscreen_native->view;
uint32_t next_fb_id = onscreen_native->next_fb_id; uint32_t next_fb_id = onscreen_native->gbm.next_fb_id;
MetaMonitorInfo *monitor_info; MetaMonitorInfo *monitor_info;
monitor_info = meta_renderer_view_get_monitor_info (view); monitor_info = meta_renderer_view_get_monitor_info (view);
@ -586,7 +592,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
frame_info->global_frame_counter = renderer_native->frame_counter; frame_info->global_frame_counter = renderer_native->frame_counter;
/* If we already have a pending swap then block until it completes */ /* If we already have a pending swap then block until it completes */
while (onscreen_native->next_fb_id != 0) while (onscreen_native->gbm.next_fb_id != 0)
meta_monitor_manager_kms_wait_for_flip (monitor_manager_kms); meta_monitor_manager_kms_wait_for_flip (monitor_manager_kms);
parent_vtable->onscreen_swap_buffers_with_damage (onscreen, parent_vtable->onscreen_swap_buffers_with_damage (onscreen,
@ -594,11 +600,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
n_rectangles); n_rectangles);
/* Now we need to set the CRTC to whatever is the front buffer */ /* Now we need to set the CRTC to whatever is the front buffer */
onscreen_native->next_bo = onscreen_native->gbm.next_bo =
gbm_surface_lock_front_buffer (onscreen_native->surface); gbm_surface_lock_front_buffer (onscreen_native->gbm.surface);
stride = gbm_bo_get_stride (onscreen_native->next_bo); stride = gbm_bo_get_stride (onscreen_native->gbm.next_bo);
handle = gbm_bo_get_handle (onscreen_native->next_bo).u32; handle = gbm_bo_get_handle (onscreen_native->gbm.next_bo).u32;
if (drmModeAddFB (renderer_native->kms_fd, if (drmModeAddFB (renderer_native->kms_fd,
cogl_framebuffer_get_width (COGL_FRAMEBUFFER (onscreen)), cogl_framebuffer_get_width (COGL_FRAMEBUFFER (onscreen)),
@ -607,13 +613,13 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
32, /* bpp */ 32, /* bpp */
stride, stride,
handle, handle,
&onscreen_native->next_fb_id)) &onscreen_native->gbm.next_fb_id))
{ {
g_warning ("Failed to create new back buffer handle: %m"); g_warning ("Failed to create new back buffer handle: %m");
gbm_surface_release_buffer (onscreen_native->surface, gbm_surface_release_buffer (onscreen_native->gbm.surface,
onscreen_native->next_bo); onscreen_native->gbm.next_bo);
onscreen_native->next_bo = NULL; onscreen_native->gbm.next_bo = NULL;
onscreen_native->next_fb_id = 0; onscreen_native->gbm.next_fb_id = 0;
return; return;
} }
@ -649,7 +655,7 @@ meta_renderer_native_init_egl_context (CoglContext *cogl_context,
} }
static gboolean static gboolean
meta_renderer_native_create_surface (MetaRendererNative *renderer_native, meta_renderer_native_create_surface_gbm (MetaRendererNative *renderer_native,
int width, int width,
int height, int height,
struct gbm_surface **gbm_surface, struct gbm_surface **gbm_surface,
@ -667,7 +673,7 @@ meta_renderer_native_create_surface (MetaRendererNative *renderer_native,
EGLNativeWindowType egl_native_window; EGLNativeWindowType egl_native_window;
EGLSurface new_egl_surface; EGLSurface new_egl_surface;
new_gbm_surface = gbm_surface_create (renderer_native->gbm, new_gbm_surface = gbm_surface_create (renderer_native->gbm.device,
width, height, width, height,
GBM_FORMAT_XRGB8888, GBM_FORMAT_XRGB8888,
GBM_BO_USE_SCANOUT | GBM_BO_USE_SCANOUT |
@ -714,6 +720,8 @@ meta_renderer_native_init_onscreen (CoglOnscreen *onscreen,
MetaRendererNative *renderer_native = egl_renderer->platform; MetaRendererNative *renderer_native = egl_renderer->platform;
CoglOnscreenEGL *egl_onscreen; CoglOnscreenEGL *egl_onscreen;
MetaOnscreenNative *onscreen_native; MetaOnscreenNative *onscreen_native;
struct gbm_surface *gbm_surface;
EGLSurface egl_surface;
int width; int width;
int height; int height;
@ -737,11 +745,17 @@ meta_renderer_native_init_onscreen (CoglOnscreen *onscreen,
if (width == 0 || height == 0) if (width == 0 || height == 0)
return TRUE; return TRUE;
return meta_renderer_native_create_surface (renderer_native, if (!meta_renderer_native_create_surface_gbm (renderer_native,
width, height, width, height,
&onscreen_native->surface, &gbm_surface,
&egl_onscreen->egl_surface, &egl_surface,
error); error))
return FALSE;
onscreen_native->gbm.surface = gbm_surface;
egl_onscreen->egl_surface = egl_surface;
return TRUE;
} }
static void static void
@ -762,7 +776,7 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
/* flip state takes a reference on the onscreen so there should /* flip state takes a reference on the onscreen so there should
* never be outstanding flips when we reach here. */ * never be outstanding flips when we reach here. */
g_return_if_fail (onscreen_native->next_fb_id == 0); g_return_if_fail (onscreen_native->gbm.next_fb_id == 0);
free_current_bo (onscreen); free_current_bo (onscreen);
@ -772,10 +786,10 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
egl_onscreen->egl_surface = EGL_NO_SURFACE; egl_onscreen->egl_surface = EGL_NO_SURFACE;
} }
if (onscreen_native->surface) if (onscreen_native->gbm.surface)
{ {
gbm_surface_destroy (onscreen_native->surface); gbm_surface_destroy (onscreen_native->gbm.surface);
onscreen_native->surface = NULL; onscreen_native->gbm.surface = NULL;
} }
g_slice_free (MetaOnscreenNative, onscreen_native); g_slice_free (MetaOnscreenNative, onscreen_native);
@ -795,7 +809,7 @@ _cogl_winsys_egl_vtable = {
struct gbm_device * struct gbm_device *
meta_renderer_native_get_gbm (MetaRendererNative *renderer_native) meta_renderer_native_get_gbm (MetaRendererNative *renderer_native)
{ {
return renderer_native->gbm; return renderer_native->gbm.device;
} }
int int
@ -946,12 +960,12 @@ meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
* Ensure we don't have any pending flips that will want * Ensure we don't have any pending flips that will want
* to swap the current buffer. * to swap the current buffer.
*/ */
while (onscreen_native->next_fb_id != 0) while (onscreen_native->gbm.next_fb_id != 0)
meta_monitor_manager_kms_wait_for_flip (monitor_manager_kms); meta_monitor_manager_kms_wait_for_flip (monitor_manager_kms);
/* Need to drop the GBM surface and create a new one */ /* Need to drop the GBM surface and create a new one */
if (!meta_renderer_native_create_surface (renderer_native, if (!meta_renderer_native_create_surface_gbm (renderer_native,
width, height, width, height,
&new_surface, &new_surface,
&new_egl_surface, &new_egl_surface,
@ -974,13 +988,13 @@ meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
* longer used. * longer used.
*/ */
free_current_bo (onscreen); free_current_bo (onscreen);
g_clear_pointer (&onscreen_native->surface, gbm_surface_destroy); g_clear_pointer (&onscreen_native->gbm.surface, gbm_surface_destroy);
/* /*
* Update the active gbm and egl surfaces and make sure they they are * Update the active gbm and egl surfaces and make sure they they are
* used for drawing the coming frame. * used for drawing the coming frame.
*/ */
onscreen_native->surface = new_surface; onscreen_native->gbm.surface = new_surface;
egl_onscreen->egl_surface = new_egl_surface; egl_onscreen->egl_surface = new_egl_surface;
_cogl_winsys_egl_make_current (cogl_display, _cogl_winsys_egl_make_current (cogl_display,
egl_onscreen->egl_surface, egl_onscreen->egl_surface,
@ -1215,7 +1229,7 @@ meta_renderer_native_finalize (GObject *object)
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object); MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
g_clear_pointer (&renderer_native->dummy_gbm_surface, gbm_surface_destroy); g_clear_pointer (&renderer_native->dummy_gbm_surface, gbm_surface_destroy);
g_clear_pointer (&renderer_native->gbm, gbm_device_destroy); g_clear_pointer (&renderer_native->gbm.device, gbm_device_destroy);
G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object); G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object);
} }
@ -1249,7 +1263,7 @@ meta_renderer_native_initable_init (GInitable *initable,
} }
renderer_native->egl_display = egl_display; renderer_native->egl_display = egl_display;
renderer_native->gbm = gbm_device; renderer_native->gbm.device = gbm_device;
return TRUE; return TRUE;
} }