This is a reimplementation of the EGL_MESA_gallium extension over egl_g3d.
It is much simpler and cleaner than the older patch I posted to the list, which
should be disregarded.
GLX support is not implemented. It may be added later to an eventual GLX API
implementation over the egl_g3d core.
The API is changed and eglGetGalliumSurfacesMESA is replaced with
eglGetGalliumTexturesMESA.
Each of the three API functions directly maps to egl_g3d functionality, and the
functions are each implemented with two lines of code:
eglGetGalliumScreenMESA -> gdpy->native->screen
eglCreateGalliumScreenMESA -> gdpy->native->create_context(...)
eglGetGalliumTexturesMESA -> gsurf->native->validate(...)
Note that the two egl_g3d validation patches are necessary to make
eglGetGalliumTexturesMESA work properly.
I think the simplicity of the implementation shows that this is the right
approach as opposed to inventing a Gallium "state tracker".
Of course, once Gallium makes a new stable release, the API could be versioned
with a "compatibility identity" module on top.
This patch removes the egl_g3d code that discards configs not supported by any
API since they can still be used with direct Gallium access.
---
include/EGL/eglext.h | 26 +++++++++++++
src/egl/main/eglapi.c | 40 +++++++++++++++++++-
src/egl/main/eglapi.h | 11 +++++
src/egl/main/egldisplay.h | 1 +
src/egl/main/eglmisc.c | 2 +
.../state_trackers/egl_g3d/common/egl_g3d.c | 37 ++++++++++++++++--
6 files changed, 111 insertions(+), 6 deletions(-)
diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h
index b65f7f2..68f732f 100644
--- a/include/EGL/eglext.h
+++ b/include/EGL/eglext.h
@@ -179,6 +179,32 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYCONTEXTMESA)
(EGLDisplay dpy, EGLCont
#endif /* EGL_MESA_copy_context */
+/* EGL_MESA_gallium >>> PRELIMINARY <<< */
+#ifndef EGL_MESA_gallium
+#define EGL_MESA_gallium 1
+
+struct pipe_screen;
+struct pipe_context;
+struct pipe_texture;
+
+#define EGL_GALLIUM_FRONT_LEFT_MESA 0
+#define EGL_GALLIUM_BACK_LEFT_MESA 1
+#define EGL_GALLIUM_FRONT_RIGHT_MESA 2
+#define EGL_GALLIUM_BACK_RIGHT_MESA 3
+#define EGL_GALLIUM_DEPTH_STENCIL_MESA 4
+
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI struct pipe_screen* EGLAPIENTRY eglGetGalliumScreenMESA(EGLDisplay dpy);
+EGLAPI struct pipe_context* EGLAPIENTRY eglCreateGalliumContextMESA(EGLDisplay
dpy);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetGalliumTexturesMESA(EGLDisplay* dpy,
EGLSurface surface, EGLint count, EGLint* attachments, struct pipe_texture**
textures, EGLint* width, EGLint* height, EGLint* seq_num);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+
+typedef struct pipe_screen* (EGLAPIENTRYP
PFNEGLGETGALLIUMSCREENMESA)(EGLDisplay dpy);
+typedef struct pipe_context* (EGLAPIENTRYP
PFNEGLCREATEGALLIUMCONTEXTMESA)(EGLDisplay dpy);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETGALLIUMTEXTURESMESA)(EGLDisplay*
dpy, EGLSurface surface, EGLint count, EGLint* attachments, struct
pipe_texture** textures, EGLint* width, EGLint* height, EGLint* seq_num);
+
+#endif /* EGL_MESA_gallium */
+
#ifdef __cplusplus
}
#endif
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 14cc5fa..6ae123c 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -538,12 +538,15 @@ eglSwapInterval(EGLDisplay dpy, EGLint interval)
EGLBoolean EGLAPIENTRY
eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
{
- _EGLContext *ctx = _eglGetCurrentContext();
+ /* remove binding requirement for EGL_MESA_gallium */
+ /* _EGLContext *ctx = _eglGetCurrentContext(); */
_EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
/* surface must be bound to current context in EGL 1.4 */
+ /*
if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
+ */
return drv->API.SwapBuffers(drv, disp, surf);
}
@@ -991,5 +994,40 @@ eglReleaseThread(void)
return EGL_TRUE;
}
+struct pipe_screen* eglGetGalliumScreenMESA(EGLDisplay dpy)
+{
+ _EGLDisplay *disp = _eglLookupDisplay(dpy);
+ _EGLDriver *drv = _eglCheckDisplay(disp, __FUNCTION__);
+ if (!drv)
+ return 0;
+
+ return drv->API.GetGalliumScreenMESA ? drv->API.GetGalliumScreenMESA(drv,
disp) : 0;
+}
+
+struct pipe_context* eglCreateGalliumContextMESA(EGLDisplay dpy)
+{
+ _EGLDisplay *disp = _eglLookupDisplay(dpy);
+ _EGLDriver *drv = _eglCheckDisplay(disp, __FUNCTION__);
+ if (!drv)
+ return 0;
+
+ return drv->API.CreateGalliumContextMESA ?
drv->API.CreateGalliumContextMESA(drv, disp) : 0;
+}
+
+EGLBoolean eglGetGalliumTexturesMESA(EGLDisplay* dpy, EGLSurface surface,
EGLint count, EGLint* attachments, struct pipe_texture** textures, EGLint*
width, EGLint* height, EGLint* seq_num)
+{
+ _EGLDisplay *disp = _eglLookupDisplay(dpy);
+ _EGLDriver *drv = _eglCheckDisplay(disp, __FUNCTION__);
+ _EGLSurface* surf;
+
+ if (!drv || !drv->API.GetGalliumTexturesMESA)
+ return EGL_FALSE;
+
+ surf = _eglLookupSurface(surface, disp);
+ if(!surf)
+ return EGL_FALSE;
+
+ return drv->API.GetGalliumTexturesMESA(drv, disp, surf, count, attachments,
textures, width, height, seq_num);
+}
#endif /* EGL_VERSION_1_2 */
diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
index aa0abe3..13e8f13 100644
--- a/src/egl/main/eglapi.h
+++ b/src/egl/main/eglapi.h
@@ -69,6 +69,13 @@ typedef _EGLSurface
*(*CreatePbufferFromClientBuffer_t)(_EGLDriver *drv, _EGLDis
#endif /* EGL_VERSION_1_2 */
+struct pipe_screen;
+struct pipe_context;
+struct pipe_surface;
+typedef struct pipe_screen* (*GetGalliumScreenMESA_t)(_EGLDriver *drv,
_EGLDisplay *dpy);
+typedef struct pipe_context* (*CreateGalliumContextMESA_t)(_EGLDriver *drv,
_EGLDisplay *dpy);
+typedef EGLBoolean (*GetGalliumTexturesMESA_t)(_EGLDriver *drv, _EGLDisplay*
dpy, _EGLSurface* surf, EGLint count, EGLint* attachments, struct
pipe_texture** textures, EGLint* width, EGLint* height, EGLint* seq_num);
+
/**
* The API dispatcher jumps through these functions
@@ -120,6 +127,10 @@ struct _egl_api
#ifdef EGL_VERSION_1_2
CreatePbufferFromClientBuffer_t CreatePbufferFromClientBuffer;
+
+ GetGalliumScreenMESA_t GetGalliumScreenMESA;
+ CreateGalliumContextMESA_t CreateGalliumContextMESA;
+ GetGalliumTexturesMESA_t GetGalliumTexturesMESA;
#endif
};
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index ea4e35a..c711ca3 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -14,6 +14,7 @@ struct _egl_extensions
{
EGLBoolean MESA_screen_surface;
EGLBoolean MESA_copy_context;
+ EGLBoolean MESA_gallium;
char String[_EGL_MAX_EXTENSIONS_LEN];
};
diff --git a/src/egl/main/eglmisc.c b/src/egl/main/eglmisc.c
index e669133..e2ca56d 100644
--- a/src/egl/main/eglmisc.c
+++ b/src/egl/main/eglmisc.c
@@ -54,6 +54,8 @@ _eglUpdateExtensionsString(_EGLDisplay *dpy)
strcat(exts, "EGL_MESA_screen_surface ");
if (dpy->Extensions.MESA_copy_context)
strcat(exts, "EGL_MESA_copy_context ");
+ if (dpy->Extensions.MESA_gallium)
+ strcat(exts, "EGL_MESA_gallium");
assert(strlen(exts) < _EGL_MAX_EXTENSIONS_LEN);
}
diff --git a/src/gallium/state_trackers/egl_g3d/common/egl_g3d.c
b/src/gallium/state_trackers/egl_g3d/common/egl_g3d.c
index 480f5a7..2eae4e9 100644
--- a/src/gallium/state_trackers/egl_g3d/common/egl_g3d.c
+++ b/src/gallium/state_trackers/egl_g3d/common/egl_g3d.c
@@ -349,11 +349,6 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy,
EGLint id)
EGLBoolean valid;
api_mask = get_mode_api_mask(&native_configs[i]->mode, gdrv->api_mask);
- if (!api_mask) {
- _eglLog(_EGL_DEBUG, "no state tracker supports config 0x%x",
- native_configs[i]->mode.visualID);
- continue;
- }
gconf = CALLOC_STRUCT(egl_g3d_config);
if (!gconf)
@@ -444,6 +439,8 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
*major = 1;
*minor = 4;
+ dpy->Extensions.MESA_gallium = EGL_TRUE;
+
return EGL_TRUE;
fail:
@@ -856,6 +853,32 @@ egl_g3d_unload(_EGLDriver *drv)
free(gdrv);
}
+
+static struct pipe_screen*
+egl_g3d_get_gallium_screen(_EGLDriver *drv, _EGLDisplay *dpy)
+{
+ struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
+ return gdpy->native->screen;
+}
+
+static struct pipe_context*
+egl_g3d_create_gallium_context(_EGLDriver *drv, _EGLDisplay *dpy)
+{
+ struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
+ return gdpy->native->create_context(gdpy->native, 0);
+}
+
+static EGLBoolean
+egl_g3d_get_gallium_textures(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface*
surf, EGLint count, EGLint* attachments, struct pipe_texture** textures,
EGLint* width, EGLint* height, EGLint* seq_num)
+{
+ struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
+ gsurf->native->validate(gsurf->native,
+ (enum native_attachment*)attachments, count,
+ textures,
+ width, height, seq_num);
+ return EGL_TRUE;
+}
+
_EGLDriver *
_eglMain(const char *args)
{
@@ -889,6 +912,10 @@ _eglMain(const char *args)
gdrv->base.API.BindTexImage = egl_g3d_bind_tex_image;
gdrv->base.API.ReleaseTexImage = egl_g3d_release_tex_image;
+ gdrv->base.API.GetGalliumScreenMESA = egl_g3d_get_gallium_screen;
+ gdrv->base.API.CreateGalliumContextMESA = egl_g3d_create_gallium_context;
+ gdrv->base.API.GetGalliumTexturesMESA = egl_g3d_get_gallium_textures;
+
gdrv->base.Name = driver_name;
gdrv->base.Unload = egl_g3d_unload;
--
1.6.3.3
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev