[Mesa-dev] Add pbuffer support for drm platform
Liu, Ying2
ying2.liu at intel.com
Wed Jun 10 23:54:04 PDT 2015
Hi, Matt,
I have updated the patch based on your review comments. As for createNewDrawable, I add the condition to only use dri2_surf for pbuffer and keep everything else unchanged.
Hi, Emil,
I have rebased my patch to master branch. Our QA team had run several 3D workloads in windows7 VM using Mesa10.5, such as 3DMark03, Unigine Heaven 4.0, PassMark8 3D and Lightsmark. We didn't run those workloads for master branch. We don't use Khronos Conformance suite. We run piglit, but didn't use piglit to test pbuffer. QA team also had run Mesa Demos.
Thanks
Ying
-----Original Message-----
From: Liu, Ying2
Sent: Wednesday, June 10, 2015 4:05 PM
To: mesa-dev at lists.freedesktop.org
Cc: Liu, Ying2
Subject: EGL: Add pbuffer support for drm platform
Add pbuffer support for drm platform, because some customers are still using this feature.
Signed-off-by: Ying Liu <ying2.liu at intel.com>
---
src/egl/drivers/dri2/egl_dri2.c | 3 +++
src/egl/drivers/dri2/platform_drm.c | 30 +++++++++++++++++++++++-------
2 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 44a6c96..d56795e 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -909,6 +909,9 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
*/
if (conf->SurfaceType & EGL_WINDOW_BIT)
dri2_ctx->base.WindowRenderBuffer = EGL_BACK_BUFFER;
+
+ if (conf->SurfaceType & EGL_PBUFFER_BIT)
+ dri2_ctx->base.WindowRenderBuffer = EGL_BACK_BUFFER;
}
else
dri_config = NULL;
diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
index 3391afc..c8b7e92 100644
--- a/src/egl/drivers/dri2/platform_drm.c
+++ b/src/egl/drivers/dri2/platform_drm.c
@@ -123,16 +123,23 @@ dri2_drm_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
dri2_surf->base.Height = surf->base.height;
surf->dri_private = dri2_surf;
break;
+ case EGL_PBUFFER_BIT:
+ break;
default:
goto cleanup_surf;
}
if (dri2_dpy->dri2) {
- dri2_surf->dri_drawable =
- (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen,
- dri2_conf->dri_double_config,
- dri2_surf->gbm_surf);
-
+ if (type == EGL_PBUFFER_BIT)
+ dri2_surf->dri_drawable =
+ (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen,
+ dri2_conf->dri_double_config,
+ dri2_surf);
+ else
+ dri2_surf->dri_drawable =
+ (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen,
+ dri2_conf->dri_double_config,
+ dri2_surf->gbm_surf);
} else {
assert(dri2_dpy->swrast != NULL);
dri2_surf->dri_drawable =
@@ -155,6 +162,15 @@ dri2_drm_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, }
static _EGLSurface *
+dri2_drm_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
+ _EGLConfig *conf,
+ const EGLint *attrib_list) {
+ return dri2_drm_create_surface(drv, disp, EGL_PBUFFER_BIT, conf,
+ NULL, attrib_list); }
+
+static _EGLSurface *
dri2_drm_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
_EGLConfig *conf, void *native_window,
const EGLint *attrib_list) @@ -576,7 +592,7 @@ static struct dri2_egl_display_vtbl dri2_drm_display_vtbl = {
.authenticate = dri2_drm_authenticate,
.create_window_surface = dri2_drm_create_window_surface,
.create_pixmap_surface = dri2_drm_create_pixmap_surface,
- .create_pbuffer_surface = dri2_fallback_create_pbuffer_surface,
+ .create_pbuffer_surface = dri2_drm_create_pbuffer_surface,
.destroy_surface = dri2_drm_destroy_surface,
.create_image = dri2_drm_create_image_khr,
.swap_interval = dri2_fallback_swap_interval, @@ -693,7 +709,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
attr_list[2] = EGL_NONE;
dri2_add_config(disp, dri2_dpy->driver_configs[i],
- i + 1, EGL_WINDOW_BIT, attr_list, NULL);
+ i + 1, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
+ attr_list, NULL);
}
disp->Extensions.KHR_image_pixmap = EGL_TRUE;
--
2.1.0
More information about the mesa-dev
mailing list