--- docs/MESA_image_drm.spec | 101 +++++++++++++++++++++++++++++++++++++++++++++ include/EGL/eglext.h | 23 ++++++++++ src/egl/main/eglapi.c | 48 +++++++++++++++++++++ src/egl/main/eglapi.h | 10 ++++ src/egl/main/eglconfig.c | 1 + src/egl/main/egldisplay.h | 1 + src/egl/main/eglmisc.c | 1 + 7 files changed, 185 insertions(+), 0 deletions(-) create mode 100644 docs/MESA_image_drm.spec
diff --git a/docs/MESA_image_drm.spec b/docs/MESA_image_drm.spec new file mode 100644 index 0000000..fc0f076 --- /dev/null +++ b/docs/MESA_image_drm.spec @@ -0,0 +1,101 @@ +Name + + MESA_image_drm + +Name Strings + + EGL_MESA_image_drm + +Contact + + Kristian Høgsberg <k...@bitplanet.net> + +Status + + Proposal + +Version + + Version 1, June 3, 2010 + +Number + + EGL Extension #not assigned + +Dependencies + + Reguires EGL 1.4 or later. This extension is written against the + wording of the EGL 1.4 specification. + + EGL_KHR_base_image is required. + +Overview + + Create EGLImages from DRM buffer handles. + +IP Status + + Open-source; freely implementable. + +Issues + + Nopes + +New Procedures and Functions + + EGLImageKHR eglCreateDRMImageMESA(EGLDisplay dpy, + EGLContext ctx, + khronos_uint32_t *handle, + khronos_uint32_t *stride, + const EGLint *attrib_list); + + EGLBoolean eglShareDRMImageMESA(EGLDisplay dpy, + EGLImageKHR image, + khronos_uint32_t *name); + +New Tokens + + Accepted in the <attrib_list> parameter of eglCreateDRMImageMESA: + + EGL_IMAGE_FORMAT_MESA 0xce01 + EGL_IMAGE_USE_MESA 0xce02 + + Bits accepted in EGL_IMAGE_USE_MESA: + + EGL_IMAGE_USE_SCANOUT_MESA 0x0001 + EGL_IMAGE_USE_SHARE_MESA 0x0002 + + Accepted in the <target> parameter of eglCreateImageKHR: + + EGL_DRM_BUFFER_MESA 0xce03 + + Use when importing drm buffer: + + EGL_IMAGE_NAME_MESA 0xce04 + EGL_IMAGE_STRIDE_MESA 0xce05 + + Accepted as values for the EGL_IMAGE_FORMAT_MESA attribute: + + EGL_IMAGE_FORMAT_ARGB8888_MESA 0xce06 + +Additions to the EGL 1.4 Specification: + + Goes here... + + Create drm buffers by calling eglCreateDRMImageMESA, pass + EGL_WIDTH, EGL_EIGHT and format and use in the attrib list using + EGL_IMAGE_FORMAT_MESA and EGL_IMAGE_USE_MESA. If non-NULL, the + handle (local to the drm fd, for use with KMS) is written to + <handle> and the stride (in bytes) is written to <stride>. + + Create a global name for a buffer using eglShareDRMImageMESA. + + Import a shared buffer by calling eglCreateImageKHR with + EGL_DRM_BUFFER_MESA as the target, using EGL_WIDTH, EGL_HEIGHT, + EGL_IMAGE_FORMAT_MESA, EGL_IMAGE_NAME_MESA, EGL_IMAGE_STRIDE_MESA + in the attrib list. + +Revision History + + June 3, 2010 + Initial draft (Kristian Høgsberg) diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h index a1a117a..87e0b0f 100644 --- a/include/EGL/eglext.h +++ b/include/EGL/eglext.h @@ -120,6 +120,29 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGL #define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */ #endif +#ifndef EGL_MESA_image_drm +#define EGL_MESA_image_drm 1 +#define EGL_IMAGE_FORMAT_MESA 0xce01 +#define EGL_IMAGE_USE_MESA 0xce02 +#define EGL_DRM_IMAGE_MESA 0xce03 /* eglCreateImageKHR target */ +#define EGL_IMAGE_NAME_MESA 0xce04 /* eglCreateImageKHR attribute */ +#define EGL_IMAGE_STRIDE_MESA 0xce05 /* eglCreateImageKHR attribute */ + +/* EGL_IMAGE_USE_MESA bits */ +#define EGL_IMAGE_USE_SCANOUT_MESA 0x0001 +#define EGL_IMAGE_USE_SHARE_MESA 0x0002 + +/* EGL_IMAGE_FORMAT_MESA tokens */ +#define EGL_IMAGE_FORMAT_ARGB8888_MESA 0xce06 + +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA(EGLDisplay dpy, EGLContext ctx, EGLint *handle, EGLint *stride, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglShareDRMImageMESA(EGLDisplay dpy, EGLImageKHR image, EGLint *name); +#endif +typedef EGLBoolean (EGLAPIENTRY PFNEGLCREATEDRMIMAGEMESA) (EGLDisplay dpy, EGLint *name, EGLint *stride, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRY PFNEGLSHAREDRMIMAGEMESA) (EGLDisplay dpy, EGLImageKHR image, EGLint *name); +#endif + #ifndef EGL_KHR_reusable_sync #define EGL_KHR_reusable_sync 1 diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 7c4846c..c7136fd 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -853,6 +853,11 @@ eglGetProcAddress(const char *procname) #ifdef EGL_MESA_typed_display { "eglGetTypedDisplayMESA", (_EGLProc) eglGetTypedDisplayMESA }, #endif +#ifdef EGL_MESA_image_drm + { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA }, + { "eglShareDRMImageMESA", (_EGLProc) eglShareDRMImageMESA }, +#endif + { NULL, NULL } }; EGLint i; @@ -1290,3 +1295,46 @@ eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, } #endif /* EGL_NOK_swap_region */ + + +#ifdef EGL_MESA_image_drm + +EGLImageKHR EGLAPIENTRY +eglCreateDRMImageMESA(EGLDisplay dpy, EGLContext ctx, EGLint *handle, + EGLint *stride, const EGLint *attr_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + _EGLContext *context = _eglLookupContext(ctx, disp); + _EGLDriver *drv; + _EGLImage *img; + EGLImageKHR ret; + + _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); + if (!context && ctx != EGL_NO_CONTEXT) + RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); + + img = drv->API.CreateDRMImageMESA(drv, disp, context, + handle, stride, attr_list); + ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR; + + RETURN_EGL_EVAL(disp, ret); +} + +EGLBoolean EGLAPIENTRY +eglShareDRMImageMESA(EGLDisplay dpy, EGLImageKHR image, EGLint *name) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + _EGLImage *img = _eglLookupImage(image, disp); + _EGLDriver *drv; + EGLBoolean ret; + + _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); + if (!img) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + ret = drv->API.ShareDRMImageMESA(drv, disp, img, name); + + RETURN_EGL_EVAL(disp, ret); +} + +#endif diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index d8c8b49..e001c8c 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -80,6 +80,11 @@ typedef EGLBoolean (*DestroyImageKHR_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLI typedef EGLBoolean (*SwapBuffersRegionNOK_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint numRects, const EGLint *rects); #endif +#ifdef EGL_MESA_image_drm +typedef _EGLImage *(*CreateDRMImageMESA_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx, EGLint *handle, EGLint *stride, const EGLint *attr_list); +typedef EGLBoolean (*ShareDRMImageMESA_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img, EGLint *name); +#endif + /** * The API dispatcher jumps through these functions */ @@ -141,6 +146,11 @@ struct _egl_api #ifdef EGL_NOK_swap_region SwapBuffersRegionNOK_t SwapBuffersRegionNOK; #endif + +#ifdef EGL_MESA_image_drm + CreateDRMImageMESA_t CreateDRMImageMESA; + ShareDRMImageMESA_t ShareDRMImageMESA; +#endif }; #endif /* EGLAPI_INCLUDED */ diff --git a/src/egl/main/eglconfig.c b/src/egl/main/eglconfig.c index e178f3e..eb24c6b 100644 --- a/src/egl/main/eglconfig.c +++ b/src/egl/main/eglconfig.c @@ -336,6 +336,7 @@ _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching) break; case EGL_RENDERABLE_TYPE: case EGL_CONFORMANT: + case EGL_NO_SURFACE_CAPABLE_INTEL: mask = EGL_OPENGL_ES_BIT | EGL_OPENVG_BIT | EGL_OPENGL_ES2_BIT | diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index 70c98f7..251aac2 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -44,6 +44,7 @@ struct _egl_extensions { EGLBoolean MESA_screen_surface; EGLBoolean MESA_copy_context; + EGLBoolean MESA_image_drm; EGLBoolean KHR_image_base; EGLBoolean KHR_image_pixmap; EGLBoolean KHR_vg_parent_image; diff --git a/src/egl/main/eglmisc.c b/src/egl/main/eglmisc.c index 3aa8cc1..407cf94 100644 --- a/src/egl/main/eglmisc.c +++ b/src/egl/main/eglmisc.c @@ -84,6 +84,7 @@ _eglUpdateExtensionsString(_EGLDisplay *dpy) _EGL_CHECK_EXTENSION(MESA_screen_surface); _EGL_CHECK_EXTENSION(MESA_copy_context); + _EGL_CHECK_EXTENSION(MESA_image_drm); _EGL_CHECK_EXTENSION(KHR_image_base); _EGL_CHECK_EXTENSION(KHR_image_pixmap); -- 1.7.1
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev