diff options
author | Emil Velikov <emil.l.velikov@gmail.com> | 2014-11-10 14:56:02 +0000 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2014-11-13 00:02:36 +0000 |
commit | 00ae309574a53799ddd9adbfefd3b23c83e174b4 (patch) | |
tree | 7c39345dda9307835334006528cb0eb82c8b8b0e /src | |
parent | 474d2464d19983be8aa6038f6506f77272b00dd8 (diff) |
gbm: fetch the libgbm function pointers at wgbm_platform_init
Thus way with a follow up commit we can use them and eliminate the
link dependency from waffle.
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/waffle/gbm/wgbm_platform.c | 43 | ||||
-rw-r--r-- | src/waffle/gbm/wgbm_platform.h | 17 |
2 files changed, 59 insertions, 1 deletions
diff --git a/src/waffle/gbm/wgbm_platform.c b/src/waffle/gbm/wgbm_platform.c index 4c224ac..981c366 100644 --- a/src/waffle/gbm/wgbm_platform.c +++ b/src/waffle/gbm/wgbm_platform.c @@ -23,10 +23,10 @@ // 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 _POSIX_C_SOURCE 200112 // glib feature macro for unsetenv() #include <stdlib.h> +#include <dlfcn.h> #include "wcore_error.h" @@ -42,6 +42,8 @@ #include "wgbm_platform.h" #include "wgbm_window.h" +static const char *libgbm_filename = "libgbm.so.1"; + static const struct wcore_platform_vtbl wgbm_platform_vtbl; static bool @@ -49,6 +51,7 @@ wgbm_platform_destroy(struct wcore_platform *wc_self) { struct wgbm_platform *self = wgbm_platform(wegl_platform(wc_self)); bool ok = true; + int error = 0; if (!self) return true; @@ -58,6 +61,16 @@ wgbm_platform_destroy(struct wcore_platform *wc_self) if (self->linux) ok &= linux_platform_destroy(self->linux); + if (self->gbmHandle) { + error = dlclose(self->gbmHandle); + if (error) { + ok &= false; + wcore_errorf(WAFFLE_ERROR_UNKNOWN, + "dlclose(\"%s\") failed: %s", + libgbm_filename, dlerror()); + } + } + ok &= wegl_platform_teardown(&self->wegl); free(self); return ok; @@ -77,6 +90,34 @@ wgbm_platform_create(void) if (!ok) goto error; + self->gbmHandle = dlopen(libgbm_filename, RTLD_LAZY | RTLD_LOCAL); + if (!self->gbmHandle) { + wcore_errorf(WAFFLE_ERROR_FATAL, + "dlopen(\"%s\") failed: %s", + libgbm_filename, dlerror()); + goto error; + } + +#define RETRIEVE_GBM_SYMBOL(function) \ + self->function = dlsym(self->gbmHandle, #function); \ + if (!self->function) { \ + wcore_errorf(WAFFLE_ERROR_FATAL, \ + "dlsym(\"%s\", \"" #function "\") failed: %s", \ + libgbm_filename, dlerror()); \ + 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); +#undef RETRIEVE_GBM_SYMBOL + self->linux = linux_platform_create(); if (!self->linux) goto error; diff --git a/src/waffle/gbm/wgbm_platform.h b/src/waffle/gbm/wgbm_platform.h index 11a5867..259eb19 100644 --- a/src/waffle/gbm/wgbm_platform.h +++ b/src/waffle/gbm/wgbm_platform.h @@ -27,6 +27,7 @@ #include <stdbool.h> #include <stdlib.h> +#include <gbm.h> #undef linux @@ -38,6 +39,22 @@ struct linux_platform; struct wgbm_platform { struct wegl_platform wegl; struct linux_platform *linux; + + // 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_CONTAINER_CAST_FUNC(wgbm_platform, |