egl: Reintroduce eglGetRenderBufferANDROID

eglGetRenderBufferANDROID was removed as it had no users. This commit
reintroduces this extensions as it's used by Qualcomm graphics HAL.

Change-Id: I493306830a0d4f8722a42bcc84fb49236afdabeb
This commit is contained in:
Bjorn Andersson 2012-08-21 22:22:02 -07:00
parent d7007cd4bb
commit f9752cc4cf
3 changed files with 55 additions and 1 deletions

View File

@ -213,6 +213,7 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);
typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);
typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETRENDERBUFFERANDROIDPROC) (EGLDisplay dpy, EGLSurface draw);
#endif
#ifndef EGL_KHR_fence_sync
@ -262,6 +263,15 @@ typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy,
EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
#endif
/* EGL_ANDROID_get_render_buffer
*/
#ifndef EGL_ANDROID_get_render_buffer
#define EGL_ANDROID_get_render_buffer 1
#ifdef EGL_EGLEXT_PROTOTYPES
EGLAPI EGLClientBuffer EGLAPIENTRY eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw);
#endif
#endif
/* EGL_IMG_hibernate_process
*/
#ifndef EGL_IMG_hibernate_process

View File

@ -165,6 +165,7 @@ struct egl_surface_t
virtual EGLint getSwapBehavior() const;
virtual EGLBoolean swapBuffers();
virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
virtual EGLClientBuffer getRenderBuffer() const;
protected:
GGLSurface depth;
};
@ -208,6 +209,9 @@ EGLBoolean egl_surface_t::setSwapRectangle(
{
return EGL_FALSE;
}
EGLClientBuffer egl_surface_t::getRenderBuffer() const {
return 0;
}
// ----------------------------------------------------------------------------
@ -233,6 +237,7 @@ struct egl_window_surface_v2_t : public egl_surface_t
virtual EGLint getRefreshRate() const;
virtual EGLint getSwapBehavior() const;
virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
virtual EGLClientBuffer getRenderBuffer() const;
private:
status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr);
@ -571,6 +576,11 @@ EGLBoolean egl_window_surface_v2_t::setSwapRectangle(
return EGL_TRUE;
}
EGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
{
return buffer;
}
EGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
{
GGLSurface buffer;
@ -801,6 +811,7 @@ static char const * const gExtensionsString =
// "KHR_image_pixmap "
"EGL_ANDROID_image_native_buffer "
"EGL_ANDROID_swap_rectangle "
"EGL_ANDROID_get_render_buffer "
;
// ----------------------------------------------------------------------------
@ -861,6 +872,8 @@ static const extention_map_t gExtentionMap[] = {
(__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR },
{ "eglSetSwapRectangleANDROID",
(__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
{ "eglGetRenderBufferANDROID",
(__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
};
/*
@ -2154,3 +2167,18 @@ EGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
return EGL_TRUE;
}
EGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
{
if (egl_display_t::is_valid(dpy) == EGL_FALSE)
return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
egl_surface_t* d = static_cast<egl_surface_t*>(draw);
if (!d->isValid())
return setError(EGL_BAD_SURFACE, (EGLClientBuffer)0);
if (d->dpy != dpy)
return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
// post the surface
return d->getRenderBuffer();
}

View File

@ -70,6 +70,8 @@ static const extention_map_t sExtentionMap[] = {
(__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
{ "eglDestroyImageKHR",
(__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
{ "eglGetRenderBufferANDROID",
(__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
{ "eglGetSystemTimeFrequencyNV",
(__eglMustCastToProperFunctionPointerType)&eglGetSystemTimeFrequencyNV },
{ "eglGetSystemTimeNV",
@ -1190,7 +1192,21 @@ EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync,
// ANDROID extensions
// ----------------------------------------------------------------------------
/* ANDROID extensions entry-point go here */
EGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
{
clearError();
const egl_display_ptr dp = validate_display(dpy);
if (!dp) return EGL_FALSE;
egl_surface_t const * const s = get_surface(draw);
egl_connection_t* const cnx = &gEGLImpl;
if (cnx->dso && cnx->egl.eglGetRenderBufferANDROID) {
return cnx->egl.eglGetRenderBufferANDROID(dp->disp.dpy, s->surface);
}
return setError(EGL_BAD_DISPLAY, (EGLClientBuffer*)0);
}
// ----------------------------------------------------------------------------
// NVIDIA extensions