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@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....@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to