[waffle] [PATCH 3/7] egl: Allow pbuffers to back wegl_surface
Chad Versace
chadversary at chromium.org
Tue Oct 18 17:33:01 UTC 2016
Add function wegl_pbuffer_init(), which initializes a struct
wegl_surface with eglCreatePbufferSurface().
Not yet used, but will be used later by the new surfaceless platform.
Cc: Gurchetan Singh <gurchetansingh at chromium.org>
Cc: Haixia Shi <hshi at chromium.org>
---
src/waffle/egl/wegl_platform.c | 1 +
src/waffle/egl/wegl_platform.h | 2 ++
src/waffle/egl/wegl_surface.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/waffle/egl/wegl_surface.h | 5 +++++
4 files changed, 50 insertions(+)
diff --git a/src/waffle/egl/wegl_platform.c b/src/waffle/egl/wegl_platform.c
index 71eb29e..331cc89 100644
--- a/src/waffle/egl/wegl_platform.c
+++ b/src/waffle/egl/wegl_platform.c
@@ -139,6 +139,7 @@ wegl_platform_init(struct wegl_platform *self, EGLenum egl_platform)
// window
RETRIEVE_EGL_SYMBOL(eglGetConfigAttrib);
RETRIEVE_EGL_SYMBOL(eglCreateWindowSurface);
+ RETRIEVE_EGL_SYMBOL(eglCreatePbufferSurface);
RETRIEVE_EGL_SYMBOL(eglDestroySurface);
RETRIEVE_EGL_SYMBOL(eglSwapBuffers);
diff --git a/src/waffle/egl/wegl_platform.h b/src/waffle/egl/wegl_platform.h
index d6788eb..a5092a5 100644
--- a/src/waffle/egl/wegl_platform.h
+++ b/src/waffle/egl/wegl_platform.h
@@ -89,6 +89,8 @@ struct wegl_platform {
EGLSurface (*eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config,
EGLNativeWindowType win,
const EGLint *attrib_list);
+ EGLSurface (*eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config,
+ const EGLint *attrib_list);
EGLBoolean (*eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
EGLBoolean (*eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
};
diff --git a/src/waffle/egl/wegl_surface.c b/src/waffle/egl/wegl_surface.c
index ccd0799..0bd0857 100644
--- a/src/waffle/egl/wegl_surface.c
+++ b/src/waffle/egl/wegl_surface.c
@@ -74,6 +74,48 @@ fail:
}
bool
+wegl_pbuffer_init(struct wegl_surface *surf,
+ struct wcore_config *wc_config,
+ int32_t width, int32_t height)
+{
+ struct wegl_config *config = wegl_config(wc_config);
+ struct wegl_display *dpy = wegl_display(wc_config->display);
+ struct wegl_platform *plat = wegl_platform(dpy->wcore.platform);
+ bool ok;
+
+ ok = wcore_window_init(&surf->wcore, wc_config);
+ if (!ok)
+ goto fail;
+
+ // Note on pbuffers and double-buffering: The EGL spec says that pbuffers
+ // are single-buffered. But the spec also says that EGL_RENDER_BUFFER is
+ // always EGL_BACK_BUFFER for pbuffers. Because EGL is weird in its
+ // specification of pbuffers; and because most Piglit tests requests
+ // double-buffering (and we don't want to break Piglit); allow creation of
+ // pbuffers even if the user requested double-buffering.
+ (void) config->wcore.attrs.double_buffered;
+
+ EGLint attrib_list[] = {
+ EGL_WIDTH, width,
+ EGL_HEIGHT, height,
+ EGL_NONE,
+ };
+
+ surf->egl = plat->eglCreatePbufferSurface(dpy->egl, config->egl,
+ attrib_list);
+ if (!surf->egl) {
+ wegl_emit_error(plat, "eglCreatePbufferSurface");
+ goto fail;
+ }
+
+ return true;
+
+fail:
+ wegl_surface_teardown(surf);
+ return false;
+}
+
+bool
wegl_surface_teardown(struct wegl_surface *surf)
{
struct wegl_display *dpy = wegl_display(surf->wcore.display);
diff --git a/src/waffle/egl/wegl_surface.h b/src/waffle/egl/wegl_surface.h
index b107423..51835c4 100644
--- a/src/waffle/egl/wegl_surface.h
+++ b/src/waffle/egl/wegl_surface.h
@@ -51,6 +51,11 @@ wegl_window_init(struct wegl_surface *surf,
intptr_t native_window);
bool
+wegl_pbuffer_init(struct wegl_surface *surf,
+ struct wcore_config *wc_config,
+ int32_t width, int32_t height);
+
+bool
wegl_surface_teardown(struct wegl_surface *surf);
bool
--
2.10.0
More information about the waffle
mailing list