From 14e12ae4fd9320eeb970ff8aa7dfcd43dcfd5975 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 5 Oct 2009 14:58:08 +0100 Subject: [PATCH] [eglx] Update the EGLX Stage to the new StageWindow API Move the ::realize and ::unrealize implementations over to the StageWindow instead of using Actor. --- clutter/eglx/clutter-stage-egl.c | 120 +++++++++++++++---------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/clutter/eglx/clutter-stage-egl.c b/clutter/eglx/clutter-stage-egl.c index a7507ccdc..c7282f720 100644 --- a/clutter/eglx/clutter-stage-egl.c +++ b/clutter/eglx/clutter-stage-egl.c @@ -19,6 +19,8 @@ #include "../clutter-stage.h" #include "../clutter-stage-window.h" +static ClutterStageWindowIface *clutter_stage_egl_parent_iface = NULL; + static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface); G_DEFINE_TYPE_WITH_CODE (ClutterStageEGL, @@ -28,19 +30,16 @@ G_DEFINE_TYPE_WITH_CODE (ClutterStageEGL, clutter_stage_window_iface_init)); static void -clutter_stage_egl_unrealize (ClutterActor *actor) +clutter_stage_egl_unrealize (ClutterStageWindow *stage_window) { - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (actor); - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (actor); + ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); + ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window); gboolean was_offscreen; - CLUTTER_MARK(); + CLUTTER_NOTE (BACKEND, "Unrealizing stage"); g_object_get (stage_x11->wrapper, "offscreen", &was_offscreen, NULL); - if (CLUTTER_ACTOR_CLASS (clutter_stage_egl_parent_class)->unrealize != NULL) - CLUTTER_ACTOR_CLASS (clutter_stage_egl_parent_class)->unrealize (actor); - clutter_x11_trap_x_errors (); if (G_UNLIKELY (was_offscreen)) @@ -67,15 +66,14 @@ clutter_stage_egl_unrealize (ClutterActor *actor) XSync (stage_x11->xdpy, False); clutter_x11_untrap_x_errors (); - - CLUTTER_MARK (); } -static void -clutter_stage_egl_realize (ClutterActor *actor) +static gboolean +clutter_stage_egl_realize (ClutterStageWindow *stage_window) { - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (actor); - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (actor); + ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (stage_window); + ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window); + ClutterBackend *backend; ClutterBackendEGL *backend_egl; ClutterBackendX11 *backend_x11; EGLConfig configs[2]; @@ -87,21 +85,23 @@ clutter_stage_egl_realize (ClutterActor *actor) g_object_get (stage_x11->wrapper, "offscreen", &is_offscreen, NULL); - backend_egl = CLUTTER_BACKEND_EGL (clutter_get_default_backend ()); - backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ()); + backend = clutter_get_default_backend (); + backend_egl = CLUTTER_BACKEND_EGL (backend); + backend_x11 = CLUTTER_BACKEND_X11 (backend); if (G_LIKELY (!is_offscreen)) { + Display *xdpy = clutter_eglx_display (); int c; int num_configs; EGLConfig *all_configs; EGLint cfg_attribs[] = { EGL_BUFFER_SIZE, EGL_DONT_CARE, - EGL_RED_SIZE, 5, - EGL_GREEN_SIZE, 6, - EGL_BLUE_SIZE, 5, - EGL_STENCIL_SIZE, 8, + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 6, + EGL_BLUE_SIZE, 5, + EGL_STENCIL_SIZE, 8, #ifdef HAVE_COGL_GLES2 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #else /* HAVE_COGL_GLES2 */ @@ -111,15 +111,15 @@ clutter_stage_egl_realize (ClutterActor *actor) EGL_NONE }; - status = eglGetConfigs (backend_egl->edpy, + status = eglGetConfigs (xdpy, configs, 2, &config_count); - eglGetConfigs (clutter_eglx_display (), NULL, 0, &num_configs); + eglGetConfigs (xdpy, NULL, 0, &num_configs); all_configs = g_malloc (num_configs * sizeof (EGLConfig)); - eglGetConfigs (clutter_eglx_display (), + eglGetConfigs (xdpy, all_configs, num_configs, &num_configs); @@ -128,22 +128,24 @@ clutter_stage_egl_realize (ClutterActor *actor) { EGLint red = -1, green = -1, blue = -1, alpha = -1, stencil = -1; - eglGetConfigAttrib (clutter_eglx_display (), + eglGetConfigAttrib (xdpy, all_configs[c], EGL_RED_SIZE, &red); - eglGetConfigAttrib (clutter_eglx_display (), + eglGetConfigAttrib (xdpy, all_configs[c], EGL_GREEN_SIZE, &green); - eglGetConfigAttrib (clutter_eglx_display (), + eglGetConfigAttrib (xdpy, all_configs[c], EGL_BLUE_SIZE, &blue); - eglGetConfigAttrib (clutter_eglx_display (), + eglGetConfigAttrib (xdpy, all_configs[c], EGL_ALPHA_SIZE, &alpha); - eglGetConfigAttrib (clutter_eglx_display (), + eglGetConfigAttrib (xdpy, all_configs[c], EGL_STENCIL_SIZE, &stencil); - CLUTTER_NOTE (BACKEND, "EGLConfig == R:%d G:%d B:%d A:%d S:%d \n", + + CLUTTER_NOTE (BACKEND, + "EGLConfig == R:%d G:%d B:%d A:%d S:%d", red, green, blue, alpha, stencil); } @@ -155,10 +157,9 @@ clutter_stage_egl_realize (ClutterActor *actor) goto fail; } - status = eglChooseConfig (backend_egl->edpy, + status = eglChooseConfig (xdpy, cfg_attribs, - configs, - G_N_ELEMENTS (configs), + configs, G_N_ELEMENTS (configs), &config_count); if (status != EGL_TRUE) @@ -168,21 +169,23 @@ clutter_stage_egl_realize (ClutterActor *actor) } if (stage_x11->xwin == None) - stage_x11->xwin = - XCreateSimpleWindow (stage_x11->xdpy, - stage_x11->xwin_root, - 0, 0, - stage_x11->xwin_width, - stage_x11->xwin_height, - 0, 0, - WhitePixel (stage_x11->xdpy, - stage_x11->xscreen)); + { + stage_x11->xwin = + XCreateSimpleWindow (xdpy, + stage_x11->xwin_root, + 0, 0, + stage_x11->xwin_width, + stage_x11->xwin_height, + 0, 0, + WhitePixel (stage_x11->xdpy, + stage_x11->xscreen)); + } if (clutter_x11_has_event_retrieval ()) { if (clutter_x11_has_xinput ()) { - XSelectInput (stage_x11->xdpy, stage_x11->xwin, + XSelectInput (xdpy, stage_x11->xwin, StructureNotifyMask | FocusChangeMask | ExposureMask | @@ -193,7 +196,7 @@ clutter_stage_egl_realize (ClutterActor *actor) #endif } else - XSelectInput (stage_x11->xdpy, stage_x11->xwin, + XSelectInput (xdpy, stage_x11->xwin, StructureNotifyMask | FocusChangeMask | ExposureMask | @@ -204,18 +207,17 @@ clutter_stage_egl_realize (ClutterActor *actor) PropertyChangeMask); } - /* FIXME, do these in a clutterstage_x11_realise? */ clutter_stage_x11_fix_window_size (stage_x11, -1, -1); clutter_stage_x11_set_wm_protocols (stage_x11); if (stage_egl->egl_surface != EGL_NO_SURFACE) { - eglDestroySurface (backend_egl->edpy, stage_egl->egl_surface); + eglDestroySurface (xdpy, stage_egl->egl_surface); stage_egl->egl_surface = EGL_NO_SURFACE; } stage_egl->egl_surface = - eglCreateWindowSurface (backend_egl->edpy, + eglCreateWindowSurface (xdpy, configs[0], (NativeWindowType) stage_x11->xwin, NULL); @@ -232,13 +234,13 @@ clutter_stage_egl_realize (ClutterActor *actor) static const EGLint attribs[3] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; - backend_egl->egl_context = eglCreateContext (backend_egl->edpy, + backend_egl->egl_context = eglCreateContext (xdpy, configs[0], EGL_NO_CONTEXT, attribs); #else /* Seems some GLES implementations 1.x do not like attribs... */ - backend_egl->egl_context = eglCreateContext (backend_egl->edpy, + backend_egl->egl_context = eglCreateContext (xdpy, configs[0], EGL_NO_CONTEXT, NULL); @@ -248,6 +250,7 @@ clutter_stage_egl_realize (ClutterActor *actor) g_critical ("Unable to create a suitable EGL context"); goto fail; } + backend_egl->egl_config = configs[0]; CLUTTER_NOTE (GL, "Created EGL Context"); } @@ -258,28 +261,29 @@ clutter_stage_egl_realize (ClutterActor *actor) goto fail; } - /* we need to chain up to the X11 stage implementation in order to - * set the window state in case we set it before realizing the stage - */ - CLUTTER_ACTOR_CLASS (clutter_stage_egl_parent_class)->realize (actor); - return; + CLUTTER_NOTE (BACKEND, "Successfully realized stage"); + + return clutter_stage_egl_parent_iface->realize (stage_window); fail: - CLUTTER_ACTOR_UNSET_FLAGS (actor, CLUTTER_ACTOR_REALIZED); + + return FALSE; } static void clutter_stage_egl_dispose (GObject *gobject) { - ClutterStageEGL *stage_egl = CLUTTER_STAGE_EGL (gobject); - ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (gobject); - G_OBJECT_CLASS (clutter_stage_egl_parent_class)->dispose (gobject); } static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface) { + clutter_stage_egl_parent_iface = g_type_interface_peek_parent (iface); + + iface->realize = clutter_stage_egl_realize; + iface->unrealize = clutter_stage_egl_unrealize; + /* the rest is inherited from ClutterStageX11 */ } @@ -287,12 +291,8 @@ static void clutter_stage_egl_class_init (ClutterStageEGLClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); gobject_class->dispose = clutter_stage_egl_dispose; - - actor_class->realize = clutter_stage_egl_realize; - actor_class->unrealize = clutter_stage_egl_unrealize; } static void