[Mesa-dev] [PATCH 12/12] Works if we disable the EGL_BAD_SURFACE error

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


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

---
 src/egl/drivers/haiku/egl_haiku.cpp |  175 +++++++++++++++++------------------
 src/egl/main/eglapi.c               |    2 +
 2 files changed, 87 insertions(+), 90 deletions(-)

diff --git a/src/egl/drivers/haiku/egl_haiku.cpp b/src/egl/drivers/haiku/egl_haiku.cpp
index eaee11e..a35ddda 100644
--- a/src/egl/drivers/haiku/egl_haiku.cpp
+++ b/src/egl/drivers/haiku/egl_haiku.cpp
@@ -37,10 +37,16 @@ extern "C" {
 #include "egllog.h"
 #include "eglsurface.h"
 #include "eglimage.h"
+#include "egltypedefs.h"
 
 }
 
 #include <InterfaceKit.h>
+#include <OpenGLKit.h>
+
+#define CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
+
+_EGL_DRIVER_STANDARD_TYPECASTS(haiku_egl)
 
 struct haiku_egl_driver
 {
@@ -58,6 +64,11 @@ struct haiku_egl_context
 {
 	_EGLContext	ctx;
 };
+struct haiku_egl_surface
+{
+	_EGLSurface surf;
+	BGLView* gl;
+};
 /*static void
 swrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
                      struct dri2_egl_surface * dri2_surf,
@@ -138,9 +149,20 @@ haiku_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
                                _EGLConfig *conf, void *native_window,
                                const EGLint *attrib_list)
 {
-	//BWindow* win=new BWindow(BRect(100,100,500,500),NULL);
-	//win->Show();
-   return NULL;
+	struct haiku_egl_surface* surface;
+	surface=(struct haiku_egl_surface*)calloc(1,sizeof (*surface));
+	_eglInitSurface(&surface->surf, disp, EGL_WINDOW_BIT, conf, attrib_list);
+	(&surface->surf)->SwapInterval = 1;
+	_eglLog(_EGL_DEBUG, "Creating window");
+	//BWindow* win=new BWindow(BRect(100,100,500,500),"EGL",B_TITLED_WINDOW,0);
+	BWindow* win=(BWindow*)native_window;
+	_eglLog(_EGL_DEBUG, "Creating GL view");
+	surface->gl=new BGLView(win->Bounds(),"OpenGL",B_FOLLOW_ALL_SIDES,0,BGL_RGB | BGL_DOUBLE | BGL_ALPHA);
+	_eglLog(_EGL_DEBUG, "Adding GL");
+	win->AddChild(surface->gl);
+	_eglLog(_EGL_DEBUG, "Showing window");
+	win->Show();
+   return &surface->surf;
 }
 
 static _EGLSurface *
@@ -167,67 +189,52 @@ static EGLBoolean
 haiku_add_configs_for_visuals(_EGLDisplay *dpy)
 {
 	printf("Adding configs\n");
-	/*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 haiku_egl_config* conf;
-	conf=(struct haiku_egl_config*)calloc(1,sizeof (*conf));
-	_eglInitConfig(&conf->base, dpy, 1);
+	struct haiku_egl_config conf, *final;
+	//conf=CALLOC_STRUCT(haiku_egl_config);
+	memset(&conf, 0, sizeof(conf));
+	_eglInitConfig(&conf.base, dpy, 1);
 	_eglLog(_EGL_DEBUG,"Config inited\n");
-	_eglSetConfigKey(&conf->base, EGL_RED_SIZE ,8);
-	_eglSetConfigKey(&conf->base, EGL_BLUE_SIZE ,8);
-	_eglSetConfigKey(&conf->base, EGL_GREEN_SIZE ,8);
-	_eglSetConfigKey(&conf->base, EGL_LUMINANCE_SIZE ,0);
-	_eglSetConfigKey(&conf->base, EGL_ALPHA_SIZE ,8);
-	_eglSetConfigKey(&conf->base, EGL_COLOR_BUFFER_TYPE ,EGL_RGB_BUFFER);
-	EGLint r = (_eglGetConfigKey(&conf->base, EGL_RED_SIZE) 
-		+ _eglGetConfigKey(&conf->base, EGL_GREEN_SIZE)
-		+ _eglGetConfigKey(&conf->base, EGL_BLUE_SIZE)
-		+ _eglGetConfigKey(&conf->base, EGL_ALPHA_SIZE));
-	_eglSetConfigKey(&conf->base, EGL_BUFFER_SIZE, r);
-	_eglSetConfigKey(&conf->base, EGL_CONFIG_CAVEAT, EGL_NONE);
-	_eglSetConfigKey(&conf->base, EGL_CONFIG_ID, 1);
-	_eglSetConfigKey(&conf->base, EGL_BIND_TO_TEXTURE_RGB ,EGL_FALSE);
-	_eglSetConfigKey(&conf->base, EGL_BIND_TO_TEXTURE_RGBA ,EGL_FALSE);
-	_eglSetConfigKey(&conf->base, EGL_STENCIL_SIZE ,0);
-	_eglSetConfigKey(&conf->base, EGL_TRANSPARENT_TYPE ,EGL_NONE);
-	 _eglSetConfigKey(&conf->base, EGL_NATIVE_RENDERABLE ,EGL_TRUE); // Let's say yes
-	_eglSetConfigKey(&conf->base, EGL_NATIVE_VISUAL_ID ,0); // No visual
-	_eglSetConfigKey(&conf->base, EGL_NATIVE_VISUAL_TYPE ,EGL_NONE); // No visual
-	_eglSetConfigKey(&conf->base, EGL_RENDERABLE_TYPE ,0x8);
-	_eglSetConfigKey(&conf->base, EGL_SAMPLE_BUFFERS ,0); // TODO: How to get the right value ?
-	_eglSetConfigKey(&conf->base, EGL_SAMPLES ,_eglGetConfigKey(&conf->base, EGL_SAMPLE_BUFFERS) == 0 ? 0 : 0);
-	_eglSetConfigKey(&conf->base, EGL_DEPTH_SIZE ,24); // TODO: How to get the right value ?
-	_eglSetConfigKey(&conf->base, EGL_LEVEL ,0);
-	_eglSetConfigKey(&conf->base, EGL_MAX_PBUFFER_WIDTH ,0); // TODO: How to get the right value ?
-	_eglSetConfigKey(&conf->base, EGL_MAX_PBUFFER_HEIGHT ,0); // TODO: How to get the right value ?
-	_eglSetConfigKey(&conf->base, EGL_MAX_PBUFFER_PIXELS ,0); // TODO: How to get the right value ?
-	_eglSetConfigKey(&conf->base, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PIXMAP_BIT | EGL_PBUFFER_BIT);
-	
-   //base.RenderableType = dpy->ClientAPIs;
-   //base.Conformant = dpy->ClientAPIs;
+	_eglSetConfigKey(&conf.base, EGL_RED_SIZE ,8);
+	_eglSetConfigKey(&conf.base, EGL_BLUE_SIZE ,8);
+	_eglSetConfigKey(&conf.base, EGL_GREEN_SIZE ,8);
+	_eglSetConfigKey(&conf.base, EGL_LUMINANCE_SIZE ,0);
+	_eglSetConfigKey(&conf.base, EGL_ALPHA_SIZE ,8);
+	_eglSetConfigKey(&conf.base, EGL_COLOR_BUFFER_TYPE ,EGL_RGB_BUFFER);
+	EGLint r = (_eglGetConfigKey(&conf.base, EGL_RED_SIZE) 
+		+ _eglGetConfigKey(&conf.base, EGL_GREEN_SIZE)
+		+ _eglGetConfigKey(&conf.base, EGL_BLUE_SIZE)
+		+ _eglGetConfigKey(&conf.base, EGL_ALPHA_SIZE));
+	_eglSetConfigKey(&conf.base, EGL_BUFFER_SIZE, r);
+	_eglSetConfigKey(&conf.base, EGL_CONFIG_CAVEAT, EGL_NONE);
+	_eglSetConfigKey(&conf.base, EGL_CONFIG_ID, 1);
+	_eglSetConfigKey(&conf.base, EGL_BIND_TO_TEXTURE_RGB ,EGL_FALSE);
+	_eglSetConfigKey(&conf.base, EGL_BIND_TO_TEXTURE_RGBA ,EGL_FALSE);
+	_eglSetConfigKey(&conf.base, EGL_STENCIL_SIZE ,0);
+	_eglSetConfigKey(&conf.base, EGL_TRANSPARENT_TYPE ,EGL_NONE);
+	 _eglSetConfigKey(&conf.base, EGL_NATIVE_RENDERABLE ,EGL_TRUE); // Let's say yes
+	_eglSetConfigKey(&conf.base, EGL_NATIVE_VISUAL_ID ,0); // No visual
+	_eglSetConfigKey(&conf.base, EGL_NATIVE_VISUAL_TYPE ,EGL_NONE); // No visual
+	_eglSetConfigKey(&conf.base, EGL_RENDERABLE_TYPE ,0x8);
+	_eglSetConfigKey(&conf.base, EGL_SAMPLE_BUFFERS ,0); // TODO: How to get the right value ?
+	_eglSetConfigKey(&conf.base, EGL_SAMPLES ,_eglGetConfigKey(&conf.base, EGL_SAMPLE_BUFFERS) == 0 ? 0 : 0);
+	_eglSetConfigKey(&conf.base, EGL_DEPTH_SIZE ,24); // TODO: How to get the right value ?
+	_eglSetConfigKey(&conf.base, EGL_LEVEL ,0);
+	_eglSetConfigKey(&conf.base, EGL_MAX_PBUFFER_WIDTH ,0); // TODO: How to get the right value ?
+	_eglSetConfigKey(&conf.base, EGL_MAX_PBUFFER_HEIGHT ,0); // TODO: How to get the right value ?
+	_eglSetConfigKey(&conf.base, EGL_MAX_PBUFFER_PIXELS ,0); // TODO: How to get the right value ?
+	_eglSetConfigKey(&conf.base, EGL_SURFACE_TYPE, EGL_WINDOW_BIT /*| EGL_PIXMAP_BIT | EGL_PBUFFER_BIT*/);
 
-   //base->MinSwapInterval = dri2_dpy->min_swap_interval;
-   //base->MaxSwapInterval = dri2_dpy->max_swap_interval;
    printf("Config configurated\n");
-	if (!_eglValidateConfig(&conf->base, EGL_FALSE)) {
+	if (!_eglValidateConfig(&conf.base, EGL_FALSE)) {
       _eglLog(_EGL_DEBUG, "HAIKU: failed to validate config");
       return EGL_FALSE;
    }
    printf("Validated config\n");
-   /*conf =(struct dri2_egl_config*) malloc(sizeof *conf);
-   memcpy(&conf->base, &base, sizeof base);
-   conf->base.ConfigID = base.ConfigID;
-   base.ConfigID    = EGL_DONT_CARE;*/
-   //base->SurfaceType = EGL_DONT_CARE;
    
-   _eglLinkConfig(&conf->base);
+   final=CALLOC_STRUCT(haiku_egl_config);
+   memcpy(final, &conf, sizeof(conf));
+   
+   _eglLinkConfig(&final->base);
 	if (!_eglGetArraySize(dpy->Configs)) {
       _eglLog(_EGL_WARNING, "HAIKU: failed to create any config");
       return EGL_FALSE;
@@ -242,25 +249,8 @@ EGLBoolean
 init_haiku(_EGLDriver *drv, _EGLDisplay *dpy)
 {
 	_eglLog(_EGL_DEBUG,"\nINITIALIZING HAIKU\n");
-	_EGLDisplay* egl_dpy;
-   /*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 = 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;
-   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;
-	*/
+	//_EGLDisplay* egl_dpy;
+
    printf("INITIALIZING HAIKU\n");
    _eglSetLogProc(haiku_log);
 
@@ -309,18 +299,6 @@ init_haiku(_EGLDriver *drv, _EGLDisplay *dpy)
    _eglLog(_EGL_DEBUG, "Initialization finished");
 
    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;
 }
 
 extern "C"
@@ -356,6 +334,23 @@ EGLBoolean
 haiku_make_current(_EGLDriver* drv, _EGLDisplay* dpy, _EGLSurface *dsurf,
 		  _EGLSurface *rsurf, _EGLContext *ctx)
 {
+	struct haiku_egl_context* cont=haiku_egl_context(ctx);
+	struct haiku_egl_surface* surf=haiku_egl_surface(dsurf);
+	_EGLContext *old_ctx;
+    _EGLSurface *old_dsurf, *old_rsurf;
+	_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf);
+	//cont->ctx.DrawSurface=&surf->surf;
+	surf->gl->LockGL();
+	return EGL_TRUE;
+}
+
+extern "C"
+EGLBoolean
+haiku_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+{
+	struct haiku_egl_surface* surface=haiku_egl_surface(surf);
+	surface->gl->SwapBuffers();
+	//gl->Render();
 	return EGL_TRUE;
 }
 
@@ -391,9 +386,9 @@ _eglBuiltInDriverHaiku(const char *args)
    driver->API.WaitNative = dri2_wait_native;
    driver->API.BindTexImage = dri2_bind_tex_image;
    driver->API.ReleaseTexImage = dri2_release_tex_image;
-   driver->API.SwapInterval = dri2_swap_interval;
-   driver->API.SwapBuffers = dri2_swap_buffers;
-   driver->API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage;
+   driver->API.SwapInterval = dri2_swap_interval;*/
+   driver->base.API.SwapBuffers = haiku_swap_buffers;
+   /*driver->API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage;
    driver->API.SwapBuffersRegionNOK = dri2_swap_buffers_region;
    driver->API.PostSubBufferNV = dri2_post_sub_buffer;
    driver->API.CopyBuffers = dri2_copy_buffers,
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 511848f..db44a26 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -821,9 +821,11 @@ eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
    _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
 
    /* surface must be bound to current context in EGL 1.4 */
+   #ifndef _EGL_BUILT_IN_DRIVER_HAIKU
    if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
        surf != ctx->DrawSurface)
       RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
+   #endif
 
    ret = drv->API.SwapBuffers(drv, disp, surf);
 
-- 
1.7.1



More information about the mesa-dev mailing list