From: Adrián Arroyo Calle <adrian.arroyoca...@gmail.com>

---
 src/egl/drivers/dri2/egl_dri2.h         |   13 ++++
 src/egl/drivers/dri2/platform_haiku.cpp |  117 +++++++++++++++++++++++++++++--
 2 files changed, 123 insertions(+), 7 deletions(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 52f05fb..6f5fd17 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -197,6 +197,11 @@ struct dri2_egl_display
    int                      formats;
    uint32_t                  capabilities;
 #endif
+
+#ifdef HAVE_EGL_PLATFORM_HAIKU
+       void                                    *bwindow;
+       void                                    *glview;
+#endif
 };
 
 struct dri2_egl_context
@@ -332,4 +337,12 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay 
*disp);
 EGLBoolean
 dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp);
 
+#ifdef __cplusplus
+
+extern "C"
+EGLBoolean
+dri2_initialize_haiku(_EGLDriver *drv, _EGLDisplay *disp);
+#endif
+
+
 #endif /* EGL_DRI2_INCLUDED */
diff --git a/src/egl/drivers/dri2/platform_haiku.cpp 
b/src/egl/drivers/dri2/platform_haiku.cpp
index d182663..f31e458 100644
--- a/src/egl/drivers/dri2/platform_haiku.cpp
+++ b/src/egl/drivers/dri2/platform_haiku.cpp
@@ -24,19 +24,122 @@
  
 #include <errno.h>
 #include <dlfcn.h>
+#include <stdio.h>
 
-/*#include "loader.h"
 #include "egl_dri2.h"
 #include "egl_dri2_fallbacks.h"
-#include "gralloc_drm.h"
+#include "../../../loader/loader.h"
+//#include "gralloc_drm.h"
+
+#include <InterfaceKit.h>
+
+static void
+haiku_log(EGLint level, const char *msg)
+{
+   switch (level) {
+   case _EGL_DEBUG:
+      printf("%s", msg);
+      break;
+   case _EGL_INFO:
+      printf("%s", msg);
+      break;
+   case _EGL_WARNING:
+      printf("%s", msg);
+      break;
+   case _EGL_FATAL:
+      fprintf(stderr,"%s", msg);
+      break;
+   default:
+      break;
+   }
+}
+
+BWindow* 
+haiku_create_window()
+{
+       BWindow* win=new BWindow(BRect(100,100,500,500),"EGL 
Test",B_TITLED_WINDOW,0);
+       return win;
+}
 
 static EGLBoolean
-haiku_window_dequeue_buffer(struct dri2_egl_surface* dri2_surf)
+dri2_haiku_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, 
_EGLDisplay *disp)
 {
-       if (dri2_surf->window->dequeueBuffer(dri2_surf->window, 
&dri2_surf->buffer))
+       if (!_eglGetArraySize(disp->Configs)) {
+      _eglLog(_EGL_WARNING, "DRI2: failed to create any config");
       return EGL_FALSE;
+   }
 
-   dri2_surf->buffer->common.incRef(&dri2_surf->buffer->common);
-   dri2_surf->window->lockBuffer(dri2_surf->window, dri2_surf->buffer);
    return EGL_TRUE;
-}*/
+}
+
+extern "C"
+EGLBoolean
+dri2_initialize_haiku(_EGLDriver *drv, _EGLDisplay *dpy)
+{
+       printf("INITIALIZING HAIKU");
+       struct dri2_egl_display_vtbl dri2_haiku_display_vtbl;
+       dri2_haiku_display_vtbl={};
+       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_image = NULL;
+   dri2_haiku_display_vtbl.swap_interval = dri2_fallback_swap_interval;
+   dri2_haiku_display_vtbl.swap_buffers = NULL;
+   dri2_haiku_display_vtbl.swap_buffers_region = 
dri2_fallback_swap_buffers_region;
+   dri2_haiku_display_vtbl.post_sub_buffer = dri2_fallback_post_sub_buffer;
+   dri2_haiku_display_vtbl.copy_buffers = NULL;
+   dri2_haiku_display_vtbl.query_buffer_age = dri2_fallback_query_buffer_age,
+   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;
+       
+       struct dri2_egl_display *dri2_dpy;
+       const char *err;
+       
+       _eglSetLogProc(haiku_log);
+       
+       //loader_set_logger(_eglLog);
+       
+       dri2_dpy =(struct dri2_egl_display*) calloc(1, sizeof(*dri2_dpy));
+       if (!dri2_dpy)
+               return _eglError(EGL_BAD_ALLOC, "eglInitialize");
+       dpy->DriverData=(void*) dri2_dpy;
+       if(dpy->PlatformDisplay == NULL)
+       {
+               /* OPEN DEVICE */
+               dri2_dpy->bwindow=(void*)haiku_create_window();
+               dri2_dpy->own_device=true;      
+       }else{
+               BWindow* win=(BWindow*)dpy->PlatformDisplay;
+               dri2_dpy->bwindow=win;
+       }
+       
+       dri2_dpy->driver_name = strdup("Haiku OpenGL");
+       if (!dri2_load_driver_swrast(dpy))
+               return EGL_FALSE;
+       
+       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->extensions[0] = &dri2_dpy->swrast_loader_extension.base;
+   dri2_dpy->extensions[1] = NULL;
+   dri2_dpy->extensions[2] = NULL;
+       
+       if (dri2_dpy->bwindow) {
+      if (!dri2_haiku_add_configs_for_visuals(dri2_dpy, dpy))
+       return EGL_FALSE;
+    }
+       
+       
+       dpy->VersionMajor=1;
+       dpy->VersionMinor=4;
+       
+       dri2_dpy->vtbl = &dri2_haiku_display_vtbl;
+       
+       return EGL_TRUE;
+       
+}
-- 
1.7.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to