Retrieve additional gbm functions.
Change some functions from private to public.
Factor init and teardown out of create and destroy respectively,
so a derived class can used them on its embedded platform object.

Signed-off-by: Frank Henigman <fjhenig...@google.com>
---
 src/waffle/gbm/wgbm_platform.c | 58 +++++++++++++++++++++++++-----------------
 src/waffle/gbm/wgbm_platform.h | 51 ++++++++++++++++++++++++++++---------
 2 files changed, 74 insertions(+), 35 deletions(-)

diff --git a/src/waffle/gbm/wgbm_platform.c b/src/waffle/gbm/wgbm_platform.c
index 981c366..0fc0352 100644
--- a/src/waffle/gbm/wgbm_platform.c
+++ b/src/waffle/gbm/wgbm_platform.c
@@ -46,10 +46,9 @@ static const char *libgbm_filename = "libgbm.so.1";
 
 static const struct wcore_platform_vtbl wgbm_platform_vtbl;
 
-static bool
-wgbm_platform_destroy(struct wcore_platform *wc_self)
+bool
+wgbm_platform_teardown(struct wgbm_platform *self)
 {
-    struct wgbm_platform *self = wgbm_platform(wegl_platform(wc_self));
     bool ok = true;
     int error = 0;
 
@@ -72,20 +71,27 @@ wgbm_platform_destroy(struct wcore_platform *wc_self)
     }
 
     ok &= wegl_platform_teardown(&self->wegl);
+    return ok;
+}
+
+bool
+wgbm_platform_destroy(struct wcore_platform *wc_self)
+{
+    struct wgbm_platform *self = wgbm_platform(wegl_platform(wc_self));
+
+    if (!self)
+        return true;
+
+    bool ok = wgbm_platform_teardown(self);
     free(self);
     return ok;
 }
 
-struct wcore_platform*
-wgbm_platform_create(void)
+bool
+wgbm_platform_init(struct wgbm_platform *self)
 {
-    struct wgbm_platform *self;
     bool ok = true;
 
-    self = wcore_calloc(sizeof(*self));
-    if (self == NULL)
-        return NULL;
-
     ok = wegl_platform_init(&self->wegl);
     if (!ok)
         goto error;
@@ -98,7 +104,7 @@ wgbm_platform_create(void)
         goto error;
     }
 
-#define RETRIEVE_GBM_SYMBOL(function)                                  \
+#define RETRIEVE_GBM_SYMBOL(type, function, args)                              
    \
     self->function = dlsym(self->gbmHandle, #function);                \
     if (!self->function) {                                             \
         wcore_errorf(WAFFLE_ERROR_FATAL,                             \
@@ -107,15 +113,7 @@ wgbm_platform_create(void)
         goto error;                                                    \
     }
 
-    RETRIEVE_GBM_SYMBOL(gbm_create_device);
-    RETRIEVE_GBM_SYMBOL(gbm_device_get_fd);
-    RETRIEVE_GBM_SYMBOL(gbm_device_destroy);
-
-    RETRIEVE_GBM_SYMBOL(gbm_surface_create);
-    RETRIEVE_GBM_SYMBOL(gbm_surface_destroy);
-
-    RETRIEVE_GBM_SYMBOL(gbm_surface_lock_front_buffer);
-    RETRIEVE_GBM_SYMBOL(gbm_surface_release_buffer);
+    GBM_FUNCTIONS(RETRIEVE_GBM_SYMBOL);
 #undef RETRIEVE_GBM_SYMBOL
 
     self->linux = linux_platform_create();
@@ -125,14 +123,28 @@ wgbm_platform_create(void)
     setenv("EGL_PLATFORM", "drm", true);
 
     self->wegl.wcore.vtbl = &wgbm_platform_vtbl;
-    return &self->wegl.wcore;
+    return true;
 
 error:
+    wgbm_platform_teardown(self);
+    return false;
+}
+
+struct wcore_platform*
+wgbm_platform_create(void)
+{
+    struct wgbm_platform *self = wcore_calloc(sizeof(*self));
+    if (self == NULL)
+        return NULL;
+
+    if (wgbm_platform_init(self))
+        return &self->wegl.wcore;
+
     wgbm_platform_destroy(&self->wegl.wcore);
     return NULL;
 }
 
-static bool
+bool
 wgbm_dl_can_open(struct wcore_platform *wc_self,
                  int32_t waffle_dl)
 {
@@ -140,7 +152,7 @@ wgbm_dl_can_open(struct wcore_platform *wc_self,
     return linux_platform_dl_can_open(self->linux, waffle_dl);
 }
 
-static void*
+void*
 wgbm_dl_sym(struct wcore_platform *wc_self,
             int32_t waffle_dl,
             const char *name)
diff --git a/src/waffle/gbm/wgbm_platform.h b/src/waffle/gbm/wgbm_platform.h
index 259eb19..1a08183 100644
--- a/src/waffle/gbm/wgbm_platform.h
+++ b/src/waffle/gbm/wgbm_platform.h
@@ -34,6 +34,24 @@
 #include "wegl_platform.h"
 #include "wcore_util.h"
 
+#define GBM_FUNCTIONS(f) \
+    f(struct gbm_device * , gbm_create_device            , (int fd)) \
+    f(int                 , gbm_device_get_fd            , (struct gbm_device 
*dev)) \
+    f(void                , gbm_device_destroy           , (struct gbm_device 
*gbm)) \
+    f(struct gbm_surface *, gbm_surface_create           , (struct gbm_device 
*gbm, uint32_t width, uint32_t height, uint32_t format, uint32_t flags)) \
+    f(void                , gbm_surface_destroy          , (struct gbm_surface 
*surface)) \
+    f(struct gbm_bo *     , gbm_surface_lock_front_buffer, (struct gbm_surface 
*surface)) \
+    f(void                , gbm_surface_release_buffer   , (struct gbm_surface 
*surface, struct gbm_bo *bo)) \
+    f(struct gbm_bo *     , gbm_bo_create                , (struct gbm_device 
*gbm, uint32_t width, uint32_t height, uint32_t format, uint32_t flags)) \
+    f(void                , gbm_bo_destroy               , (struct gbm_bo 
*bo)) \
+    f(int                 , gbm_bo_get_fd                , (struct gbm_bo 
*bo)) \
+    f(uint32_t            , gbm_bo_get_width             , (struct gbm_bo 
*bo)) \
+    f(uint32_t            , gbm_bo_get_height            , (struct gbm_bo 
*bo)) \
+    f(uint32_t            , gbm_bo_get_stride            , (struct gbm_bo 
*bo)) \
+    f(uint32_t            , gbm_bo_get_format            , (struct gbm_bo 
*bo)) \
+    f(union gbm_bo_handle , gbm_bo_get_handle            , (struct gbm_bo 
*bo)) \
+    f(struct gbm_device * , gbm_bo_get_device            , (struct gbm_bo *bo))
+
 struct linux_platform;
 
 struct wgbm_platform {
@@ -43,18 +61,9 @@ struct wgbm_platform {
     // GBM function pointers
     void *gbmHandle;
 
-    struct gbm_device *(*gbm_create_device)(int fd);
-    int (*gbm_device_get_fd)(struct gbm_device *gbm);
-    void (*gbm_device_destroy)(struct gbm_device *gbm);
-
-    struct gbm_surface *(*gbm_surface_create)(struct gbm_device *gbm,
-                                              uint32_t width, uint32_t height,
-                                              uint32_t format, uint32_t flags);
-    void (*gbm_surface_destroy)(struct gbm_surface *surface);
-
-    struct gbm_bo *(*gbm_surface_lock_front_buffer)(struct gbm_surface 
*surface);
-    void (*gbm_surface_release_buffer)(struct gbm_surface *surface,
-                                       struct gbm_bo *bo);
+#define DECLARE(type, function, args) type (*function) args;
+    GBM_FUNCTIONS(DECLARE)
+#undef DECLARE
 };
 
 DEFINE_CONTAINER_CAST_FUNC(wgbm_platform,
@@ -62,5 +71,23 @@ DEFINE_CONTAINER_CAST_FUNC(wgbm_platform,
                            struct wegl_platform,
                            wegl)
 
+bool
+wgbm_platform_init(struct wgbm_platform *self);
+
+bool
+wgbm_platform_teardown(struct wgbm_platform *self);
+
 struct wcore_platform*
 wgbm_platform_create(void);
+
+bool
+wgbm_platform_destroy(struct wcore_platform *wc_self);
+
+bool
+wgbm_dl_can_open(struct wcore_platform *wc_self,
+                 int32_t waffle_dl);
+
+void*
+wgbm_dl_sym(struct wcore_platform *wc_self,
+            int32_t waffle_dl,
+            const char *name);
-- 
2.2.0.rc0.207.ga3a616c

_______________________________________________
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle

Reply via email to