[Mesa-dev] [PATCH 09/12] egl: Adding Haiku configs, not stable yet

Alexander von Gluck IV kallisti5 at unixzen.com
Mon Dec 22 06:36:08 PST 2014


From: Adrián Arroyo Calle <adrian.arroyocalle at gmail.com>

---
 src/egl/drivers/dri2/egl_dri2.c         |    7 ++
 src/egl/drivers/dri2/platform_haiku.cpp |  172 +++++++++++++++++++++++++------
 src/egl/main/SConscript                 |   14 ++-
 src/egl/main/egldisplay.c               |    4 +
 4 files changed, 160 insertions(+), 37 deletions(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 062fb54..5bda4fd 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -398,9 +398,16 @@ dri2_open_driver(_EGLDisplay *disp)
 	       "%.*s/tls/%s_dri.so", len, p, dri2_dpy->driver_name);
       dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
 #endif
+
+
       if (dri2_dpy->driver == NULL) {
+#ifndef HAVE_HAIKU_PLATFORM
 	 snprintf(path, sizeof path,
 		  "%.*s/%s_dri.so", len, p, dri2_dpy->driver_name);
+#else
+	 snprintf(path, sizeof path,
+		  "lib%s.so",len,p,dri2_dpy->driver_name);
+#endif
 	 dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
 	 if (dri2_dpy->driver == NULL)
 	    _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path, dlerror());
diff --git a/src/egl/drivers/dri2/platform_haiku.cpp b/src/egl/drivers/dri2/platform_haiku.cpp
index ef85e27..22633ff 100644
--- a/src/egl/drivers/dri2/platform_haiku.cpp
+++ b/src/egl/drivers/dri2/platform_haiku.cpp
@@ -35,19 +35,57 @@ extern "C" {
 }
 
 #include <InterfaceKit.h>
+static void
+swrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
+                     struct dri2_egl_surface * dri2_surf,
+                     int depth)
+{
+
+}
+
+static void
+swrastDestroyDrawable(struct dri2_egl_display * dri2_dpy,
+                      struct dri2_egl_surface * dri2_surf)
+{
+
+}
+
+static void
+swrastGetDrawableInfo(__DRIdrawable * draw,
+                      int *x, int *y, int *w, int *h,
+                      void *loaderPrivate)
+{
+
+}
+
+static void
+swrastPutImage(__DRIdrawable * draw, int op,
+               int x, int y, int w, int h,
+               char *data, void *loaderPrivate)
+{
+
+}
+
+static void
+swrastGetImage(__DRIdrawable * read,
+               int x, int y, int w, int h,
+               char *data, void *loaderPrivate)
+{
+
+}
 
 static void
 haiku_log(EGLint level, const char *msg)
 {
    switch (level) {
    case _EGL_DEBUG:
-      printf("%s", msg);
+      fprintf(stderr,"%s", msg);
       break;
    case _EGL_INFO:
-      printf("%s", msg);
+      fprintf(stderr,"%s", msg);
       break;
    case _EGL_WARNING:
-      printf("%s", msg);
+      fprintf(stderr,"%s", msg);
       break;
    case _EGL_FATAL:
       fprintf(stderr,"%s", msg);
@@ -57,23 +95,76 @@ haiku_log(EGLint level, const char *msg)
    }
 }
 
-BWindow*
-haiku_create_window()
+/**
+ * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
+ */
+static _EGLSurface *
+dri2_haiku_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
+                        _EGLConfig *conf, void *native_surface,
+                        const EGLint *attrib_list)
+{
+
+   return NULL;
+}
+
+/**
+ * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
+ */
+static _EGLSurface *
+dri2_haiku_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
+                               _EGLConfig *conf, void *native_window,
+                               const EGLint *attrib_list)
+{
+   return NULL;
+}
+
+static _EGLSurface *
+dri2_haiku_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp,
+                               _EGLConfig *conf, void *native_pixmap,
+                               const EGLint *attrib_list)
 {
-   BWindow* win = new BWindow(BRect(100, 100, 500, 500), "EGL Test",
-                              B_TITLED_WINDOW, 0);
-   return win;
+   return NULL;
 }
 
+static _EGLSurface *
+dri2_haiku_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
+                                _EGLConfig *conf, const EGLint *attrib_list)
+{
+   return NULL;
+}
+
+static EGLBoolean
+dri2_haiku_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
+{
+	return EGL_TRUE;
+}
 static EGLBoolean
 dri2_haiku_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy,
-                                   _EGLDisplay *disp)
+                                   _EGLDisplay *dpy)
 {
-   if (!_eglGetArraySize(disp->Configs)) {
+	/*EGLint config_attrs[] = {
+	   EGL_NATIVE_VISUAL_ID,   0,
+	   EGL_NATIVE_VISUAL_TYPE, 0,
+	   EGL_NONE
+   };
+	static const unsigned int rgb_masks[4] = { 0xff0000, 0xff00, 0xff, 0 };
+	dri2_add_config(dpy,dri2_dpy->driver_configs[0],1,
+		EGL_WINDOW_BIT | EGL_PIXMAP_BIT | EGL_PBUFFER_BIT | 
+		EGL_SWAP_BEHAVIOR_PRESERVED_BIT,config_attrs,rgb_masks);*/
+	struct dri2_egl_config *conf;
+	_EGLConfig base;
+	_eglInitConfig(&base, dpy, 1);
+	
+	if (!_eglValidateConfig(&base, EGL_FALSE)) {
+      _eglLog(_EGL_DEBUG, "DRI2: failed to validate config");
+      return NULL;
+   }
+   _eglLinkConfig(&conf->base);
+	if (!_eglGetArraySize(dpy->Configs)) {
       _eglLog(_EGL_WARNING, "DRI2: failed to create any config");
       return EGL_FALSE;
    }
-
+   
    return EGL_TRUE;
 }
 
@@ -81,14 +172,15 @@ extern "C"
 EGLBoolean
 dri2_initialize_haiku(_EGLDriver *drv, _EGLDisplay *dpy)
 {
-   struct dri2_egl_display_vtbl dri2_haiku_display_vtbl = {};
+	printf("\nINITIALIZING HAIKU\n");
+   struct dri2_egl_display_vtbl dri2_haiku_display_vtbl;
    struct dri2_egl_display *dri2_dpy;
 
    dri2_haiku_display_vtbl.authenticate = NULL;
-   dri2_haiku_display_vtbl.create_window_surface = NULL;
-   dri2_haiku_display_vtbl.create_pixmap_surface = NULL;
-   dri2_haiku_display_vtbl.create_pbuffer_surface = NULL;
-   dri2_haiku_display_vtbl.destroy_surface = NULL;
+   dri2_haiku_display_vtbl.create_window_surface = dri2_haiku_create_window_surface;
+   dri2_haiku_display_vtbl.create_pixmap_surface = dri2_haiku_create_pixmap_surface;
+   dri2_haiku_display_vtbl.create_pbuffer_surface = dri2_haiku_create_pbuffer_surface;
+   dri2_haiku_display_vtbl.destroy_surface = dri2_haiku_destroy_surface;
    dri2_haiku_display_vtbl.create_image = NULL;
    dri2_haiku_display_vtbl.swap_interval = dri2_fallback_swap_interval;
    dri2_haiku_display_vtbl.swap_buffers = NULL;
@@ -99,47 +191,61 @@ dri2_initialize_haiku(_EGLDriver *drv, _EGLDisplay *dpy)
    dri2_haiku_display_vtbl.create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image;
    dri2_haiku_display_vtbl.get_sync_values = dri2_fallback_get_sync_values;
 
-   printf("INITIALIZING HAIKU");
+   printf("INITIALIZING HAIKU\n");
    _eglSetLogProc(haiku_log);
 
    loader_set_logger(_eglLog);
 
-   dri2_dpy = (struct dri2_egl_display*) calloc(1, sizeof(*dri2_dpy));
+   dri2_dpy = (struct dri2_egl_display*) calloc(1, sizeof(struct dri2_egl_display));
    if (!dri2_dpy)
       return _eglError(EGL_BAD_ALLOC, "eglInitialize");
-
+	
    dpy->DriverData=(void*) dri2_dpy;
    if (!dpy->PlatformDisplay) {
-      /* OPEN DEVICE */
-      dri2_dpy->bwindow = (void*)haiku_create_window();
-      dri2_dpy->own_device = true;
+      // OPEN DEVICE 
+      //dri2_dpy->bwindow = (void*)haiku_create_window();
+      //dri2_dpy->own_device = true;
    } else {
-      dri2_dpy->bwindow = (BWindow*)dpy->PlatformDisplay;
+      //dri2_dpy->bwindow = (BWindow*)dpy->PlatformDisplay;
    }
-
-   dri2_dpy->driver_name = strdup("Haiku OpenGL");
-   if (!dri2_load_driver_swrast(dpy))
-      return EGL_FALSE;
+	
+   //dri2_dpy->driver_name = strdup("swrast");
+   //if (!dri2_load_driver_swrast(dpy))
+   //   goto cleanup_conn;
 
    dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER;
    dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION;
-   //dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo;
-   //dri2_dpy->swrast_loader_extension.putImage = swrastPutImage;
-   //dri2_dpy->swrast_loader_extension.getImage = swrastGetImage;
+   dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo;
+   dri2_dpy->swrast_loader_extension.putImage = swrastPutImage;
+   dri2_dpy->swrast_loader_extension.getImage = swrastGetImage;
 
    dri2_dpy->extensions[0] = &dri2_dpy->swrast_loader_extension.base;
    dri2_dpy->extensions[1] = NULL;
    dri2_dpy->extensions[2] = NULL;
 
-   if (dri2_dpy->bwindow) {
+   /*if (dri2_dpy->bwindow) {
       if (!dri2_haiku_add_configs_for_visuals(dri2_dpy, dpy))
-         return EGL_FALSE;
-    }
+         goto cleanup_configs;
+    }*/
+    dri2_haiku_add_configs_for_visuals(dri2_dpy,dpy);
 
    dpy->VersionMajor=1;
    dpy->VersionMinor=4;
 
    dri2_dpy->vtbl = &dri2_haiku_display_vtbl;
+   
 
    return EGL_TRUE;
+   
+  cleanup_configs:
+   _eglCleanupDisplay(dpy);
+   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
+ cleanup_driver:
+   dlclose(dri2_dpy->driver);
+ cleanup_conn:
+   free(dri2_dpy->driver_name);
+ cleanup_dpy:
+   free(dri2_dpy);
+   
+   return EGL_FALSE;
 }
diff --git a/src/egl/main/SConscript b/src/egl/main/SConscript
index a8725ca..9bf463b 100644
--- a/src/egl/main/SConscript
+++ b/src/egl/main/SConscript
@@ -19,10 +19,16 @@ if env['platform'] == 'windows':
         'KHRONOS_DLL_EXPORTS',
     ])
 else:
-    env.Append(CPPDEFINES = [
-        '_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_X11',
-        '_EGL_OS_UNIX',
-    ])
+    if env['platform'] == 'haiku':
+        env.Append(CPPDEFINES = [
+        	'_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_HAIKU',
+        	'_EGL_OS_UNIX',
+    	])
+    else:
+        env.Append(CPPDEFINES = [
+        	'_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_X11',
+        	'_EGL_OS_UNIX',
+    	])
 
 env.Append(CPPPATH = [
     '#/include',
diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
index 259ab6b..a167ae5 100644
--- a/src/egl/main/egldisplay.c
+++ b/src/egl/main/egldisplay.c
@@ -178,6 +178,10 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay)
       /* If not matched to any other platform, fallback to x11. */
       return _EGL_PLATFORM_X11;
 #endif
+
+#ifdef HAVE_HAIKU_PLATFORM
+	return _EGL_PLATFORM_HAIKU;
+#endif
    }
 
    return _EGL_INVALID_PLATFORM;
-- 
1.7.1



More information about the mesa-dev mailing list