[waffle] [PATCH] gbm: drop explicit linking against libgbm.so (v2)

Chad Versace chad.versace at linux.intel.com
Tue Nov 11 22:03:37 PST 2014


From: Emil Velikov <emil.l.velikov at gmail.com>

Use the function pointers stored in wgbm_platform, to communicate
with the library.

Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---

v2(chadv): Fix numerous upcast errors of form:

    src/waffle/gbm/wgbm_display.c: In function ‘wgbm_display_connect’:
    src/waffle/gbm/wgbm_display.c:121:12: warning: passing argument 1 of ‘wgbm_platform’ from incompatible pointer type [enabled by default]
        struct wgbm_platform *plat = wgbm_platform(wc_plat);
                ^
    In file included from src/waffle/core/wcore_display.h:32:0,
                    from src/waffle/egl/wegl_display.h:33,
                    from src/waffle/gbm/wgbm_display.h:33,
                    from src/waffle/gbm/wgbm_display.c:39:
    src/waffle/gbm/wgbm_platform.h:60:28: note: expected ‘struct wegl_platform *’ but argument is of type ‘struct wcore_platform *’
    DEFINE_CONTAINER_CAST_FUNC(wgbm_platform,
                                ^
    src/waffle/core/wcore_util.h:44:5: note: in definition of macro ‘DEFINE_CONTAINER_CAST_FUNC’
        func_name(member_type *member##_self)                               \
        ^

I fixed them by applying this hunk pattern to each occurrence of the warning:

    -    struct wgbm_platform *plat = wgbm_platform(wc_self->display->platform);
    +    struct wcore_platform *wc_plat = wc_self->display->platform;
    +    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));


For wgbm_window, this warning likely resulted in a real error, because the
address of wegl_window and wgbm_window differ. For reference, below is the
layout of wgbm_window:

    struct wgbm_window {
        struct gbm_surface *gbm_surface;
        struct wegl_window wegl;
    };


 .../Modules/WafflePrintConfigurationSummary.cmake  |  1 -
 src/waffle/CMakeLists.txt                          |  1 -
 src/waffle/gbm/wgbm_display.c                      | 11 ++++++-----
 src/waffle/gbm/wgbm_window.c                       | 23 +++++++++++++---------
 src/waffle/gbm/wgbm_window.h                       |  1 +
 5 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/cmake/Modules/WafflePrintConfigurationSummary.cmake b/cmake/Modules/WafflePrintConfigurationSummary.cmake
index 79f7b38..81e738d 100644
--- a/cmake/Modules/WafflePrintConfigurationSummary.cmake
+++ b/cmake/Modules/WafflePrintConfigurationSummary.cmake
@@ -65,7 +65,6 @@ if(waffle_has_x11)
 endif()
 if(waffle_has_gbm)
     message("    gbm_INCLUDE_DIRS: ${gbm_INCLUDE_DIRS}")
-    message("    gbm_LDFLAGS:      ${gbm_LDFLAGS}")
 endif()
 message("")
 message("Build type:")
diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
index bf096b0..5d703f4 100644
--- a/src/waffle/CMakeLists.txt
+++ b/src/waffle/CMakeLists.txt
@@ -55,7 +55,6 @@ if(waffle_on_linux)
     endif()
     if(waffle_has_gbm)
         list(APPEND waffle_libdeps
-            ${gbm_LDFLAGS}
             ${libudev_LDFLAGS}
             )
     endif()
diff --git a/src/waffle/gbm/wgbm_display.c b/src/waffle/gbm/wgbm_display.c
index be5e83f..ae416d4 100644
--- a/src/waffle/gbm/wgbm_display.c
+++ b/src/waffle/gbm/wgbm_display.c
@@ -23,13 +23,11 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#define __GBM__ 1
 #define _GNU_SOURCE
 
 #include <stdlib.h>
 #include <unistd.h>
 
-#include <gbm.h>
 #include <libudev.h>
 #include <fcntl.h>
 #include <sys/types.h>
@@ -45,6 +43,8 @@ bool
 wgbm_display_destroy(struct wcore_display *wc_self)
 {
     struct wgbm_display *self = wgbm_display(wc_self);
+    struct wcore_platform *wc_plat = wc_self->platform;
+    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));
     bool ok = true;
     int fd;
 
@@ -55,8 +55,8 @@ wgbm_display_destroy(struct wcore_display *wc_self)
     ok &= wegl_display_teardown(&self->wegl);
 
     if (self->gbm_device) {
-        fd = gbm_device_get_fd(self->gbm_device);
-        gbm_device_destroy(self->gbm_device);
+        fd = plat->gbm_device_get_fd(self->gbm_device);
+        plat->gbm_device_destroy(self->gbm_device);
         close(fd);
     }
 
@@ -119,6 +119,7 @@ wgbm_display_connect(struct wcore_platform *wc_plat,
                      const char *name)
 {
     struct wgbm_display *self;
+    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));
     bool ok = true;
     int fd;
 
@@ -137,7 +138,7 @@ wgbm_display_connect(struct wcore_platform *wc_plat,
         goto error;
     }
 
-    self->gbm_device = gbm_create_device(fd);
+    self->gbm_device = plat->gbm_create_device(fd);
     if (!self->gbm_device) {
         wcore_errorf(WAFFLE_ERROR_UNKNOWN, "gbm_create_device failed");
         goto error;
diff --git a/src/waffle/gbm/wgbm_window.c b/src/waffle/gbm/wgbm_window.c
index bce32a4..edac449 100644
--- a/src/waffle/gbm/wgbm_window.c
+++ b/src/waffle/gbm/wgbm_window.c
@@ -23,8 +23,6 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#define __GBM__ 1
-
 #include <stdlib.h>
 #include <string.h>
 
@@ -38,11 +36,14 @@
 
 #include "wgbm_config.h"
 #include "wgbm_display.h"
+#include "wgbm_platform.h"
 #include "wgbm_window.h"
 
 bool
 wgbm_window_destroy(struct wcore_window *wc_self)
 {
+    struct wcore_platform *wc_plat = wc_self->display->platform;
+    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));
     struct wgbm_window *self = wgbm_window(wc_self);
     bool ok = true;
 
@@ -50,7 +51,7 @@ wgbm_window_destroy(struct wcore_window *wc_self)
         return ok;
 
     ok &= wegl_window_teardown(&self->wegl);
-    gbm_surface_destroy(self->gbm_surface);
+    plat->gbm_surface_destroy(self->gbm_surface);
     free(self);
     return ok;
 }
@@ -61,8 +62,9 @@ wgbm_window_create(struct wcore_platform *wc_plat,
                    int width,
                    int height)
 {
-    struct wgbm_window *self;
     struct wgbm_display *dpy = wgbm_display(wc_config->display);
+    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));
+    struct wgbm_window *self;
     uint32_t gbm_format;
     bool ok = true;
 
@@ -72,9 +74,9 @@ wgbm_window_create(struct wcore_platform *wc_plat,
 
     gbm_format = wgbm_config_get_gbm_format(&wc_config->attrs);
     assert(gbm_format != 0);
-    self->gbm_surface = gbm_surface_create(dpy->gbm_device, width, height,
-                                           gbm_format,
-                                           GBM_BO_USE_RENDERING);
+    self->gbm_surface = plat->gbm_surface_create(dpy->gbm_device,
+                                                 width, height, gbm_format,
+                                                 GBM_BO_USE_RENDERING);
     if (!self->gbm_surface) {
         wcore_errorf(WAFFLE_ERROR_UNKNOWN,
                      "gbm_surface_create failed");
@@ -104,15 +106,18 @@ wgbm_window_show(struct wcore_window *wc_self)
 bool
 wgbm_window_swap_buffers(struct wcore_window *wc_self)
 {
+    struct wcore_platform *wc_plat = wc_self->display->platform;
+    struct wgbm_platform *plat = wgbm_platform(wegl_platform(wc_plat));
+
     if (!wegl_window_swap_buffers(wc_self))
         return false;
 
     struct wgbm_window *self = wgbm_window(wc_self);
-    struct gbm_bo *bo = gbm_surface_lock_front_buffer(self->gbm_surface);
+    struct gbm_bo *bo = plat->gbm_surface_lock_front_buffer(self->gbm_surface);
     if (!bo)
         return false;
 
-    gbm_surface_release_buffer(self->gbm_surface, bo);
+    plat->gbm_surface_release_buffer(self->gbm_surface, bo);
     return true;
 }
 
diff --git a/src/waffle/gbm/wgbm_window.h b/src/waffle/gbm/wgbm_window.h
index 0a895db..729612b 100644
--- a/src/waffle/gbm/wgbm_window.h
+++ b/src/waffle/gbm/wgbm_window.h
@@ -30,6 +30,7 @@
 #include "wegl_window.h"
 
 struct wcore_platform;
+struct gbm_surface;
 
 struct wgbm_window {
     struct gbm_surface *gbm_surface;
-- 
2.1.2.1.g5433a3e



More information about the waffle mailing list