<div dir="ltr">Hi Chad,<div><br></div><div>Yes, we are running dEQP on the surfaceless platform.  The front-buffered pbuffer approach mostly works, though with a double-buffered pbuffer or back-buffered pbuffer + the pastebin changes we do pass an additional 70 GLES3 tests.  It is probably best to follow what X11 does to avoid breaking things.  I'll have an updated patch shortly.</div><div><br></div><div>Best wishes,</div><div>Gurchetan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 16, 2016 at 12:36 PM, Chad Versace <span dir="ltr"><<a href="mailto:chad.versace@intel.com" target="_blank">chad.versace@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">+Kristian, who also has an interest EGL<br>
<span class=""><br>
On Tue 10 May 2016, Gurchetan Singh wrote:<br>
> Hi Chad,<br>
><br>
> Thanks for the review and good suggestions.  I am interested to know your<br>
> opinion regarding an issue that comes up when implementing a back-buffered<br>
> pbuffer.  The problem is we'll be creating a front renderbuffer, not a back<br>
> renderbuffer if we pass in single buffered visuals.<br>
<br>
</span>I was afraid that this would cause a chain of issues.<br>
<span class=""><br>
> For example, in intelCreateBuffer in the i965 driver, the back buffer is<br>
> only created when double-buffered visuals are passed in:<br>
><br>
> >>_mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base);<br>
><br>
> >>if (mesaVis->doubleBufferMode) {<br>
> >>      rb = intel_create_renderbuffer(rgbFormat, num_samples);<br>
> >>      _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base)<br>
> >>}<br>
<br>
</span>Right, that's a problem.<br>
<span class=""><br>
> Due to this, with a single-buffered configuration, we'll have to do the<br>
> following in surfaceless_image_get_buffers:<br>
><br>
> >>buffers->image_mask |= __DRI_IMAGE_BUFFER_FRONT<br>
><br>
> not this:<br>
><br>
> >>buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK<br>
<br>
</span>I think the above snippet is the correct solution. The surfaceless<br>
platform should assign single-buffered configs to the pbuffers, and<br>
create a *front* buffer for the pbuffer but no back buffer.<br>
<span class=""><br>
> If this a problem, we'll have to pass in a parameter in the visual<br>
> indicating we're trying to create an EGL pbuffer (i.e,<br>
> mesaVis->is_egl_pbuffer).  Then we'll set the proper renderbuffer and<br>
> framebuffer options from that config in several places.  Some these places<br>
> include:<br>
><br>
> <a href="http://pastebin.com/28ddebWF" rel="noreferrer" target="_blank">http://pastebin.com/28ddebWF</a><br>
<br>
</span>I think you should avoid fixing all the things the pastebin patch. In<br>
attempting to fix the world, I believe there is a lot of risk that the<br>
"fixed" code will break existing users of pbuffers and, more<br>
importantly, pixmaps. The Mesa/i965 code around pixmaps and pbuffers<br>
have many hidden assumptions, I'm afraid of breaking those assumptions.<br>
<span class=""><br>
> Is the fact we'll work with the default front render buffer a problem?  If<br>
> so, what's the best way to fix the issue?<br>
<br>
</span>Yes, it's a small problem. But I think it's an acceptable compromise,<br>
and the correct way forward.<br>
<br>
I investigated the EGL/X11 platform more deeply, to learn exactly how it<br>
handles pbuffers. After a good hour in gdb, I discovered that it handles<br>
pbuffers exactly as you suggested in this email: the X11 platform<br>
assigns single-buffered configs to pbuffers, and creates<br>
__DRI_IMAGE_BUFFER_FRONT but never __DRI_IMAGE_BUFFER_BACK.<br>
<br>
In experimenting with gdb, I played with the approach you suggested by<br>
modifying your patch. Below is my experimental diff against your patch.<br>
As far as I can tell, your patch + the diff works as expected.<br>
It succeeds in making Piglit's egl-create-pbuffer-surface test pass<br>
(though I had to also hack the Piglit test to remove the X11<br>
dependency).<br>
<br>
How are you testing this patch? Even more importantly, what prompted you<br>
to write this patch?!? Is this patch related to dEQP somehow?<br>
<br>
By the way, I'm currently on my sabbatical, so I'm not checking mesa-dev<br>
daily. I'll do my best to check my email bi-daily, though, until we get<br>
this patch resolved.<br>
<br>
------ Hacky experimental diff<br>
<br>
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h<br>
index ecf9c76..5fe7697 100644<br>
--- a/src/egl/drivers/dri2/egl_dri2.h<br>
+++ b/src/egl/drivers/dri2/egl_dri2.h<br>
@@ -294,7 +294,10 @@ struct dri2_egl_surface<br>
<br>
 #if defined(HAVE_SURFACELESS_PLATFORM)<br>
       __DRIimage           *front;<br>
-      __DRIimage           *back;<br>
+<br>
+      /* FIXME: The 'format' field breaks the build because it conflicts with<br>
+       * the same field in the Wayland section.<br>
+       * */<br>
       unsigned int         format;<br>
 #endif<br>
<br>
diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c<br>
index 08d5448..745d481 100644<br>
--- a/src/egl/drivers/dri2/platform_surfaceless.c<br>
+++ b/src/egl/drivers/dri2/platform_surfaceless.c<br>
@@ -65,20 +65,13 @@ surfaceless_free_images(struct dri2_egl_surface *dri2_surf)<br>
       dri2_dpy->image->destroyImage(dri2_surf->front);<br>
       dri2_surf->front = NULL;<br>
    }<br>
-   if(dri2_surf->back) {<br>
-      dri2_dpy->image->destroyImage(dri2_surf->back);<br>
-      dri2_surf->back = NULL;<br>
-   }<br>
 }<br>
<br>
 static EGLBoolean<br>
<span class=""> surfaceless_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)<br>
</span> {<br>
-   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);<br>
-    __DRIimage *temp = dri2_surf->back;<br>
-<br>
-   dri2_surf->back = dri2_surf->front;<br>
-   dri2_surf->front = temp;<br>
+   /* The EGL spec mandates that eglSwapBuffers is a no-op for pbuffers. */<br>
+   return EGL_TRUE;<br>
 }<br>
<br>
 static int<br>
@@ -96,6 +89,19 @@ surfaceless_image_get_buffers(__DRIdrawable *driDrawable,<br>
    buffers->front = NULL;<br>
    buffers->back = NULL;<br>
<br>
+   /* The EGL 1.5 spec states that pbuffers are single-buffered. Specifically,<br>
+    * the spec states that they have a back buffer but no front buffer, in<br>
+    * contrast to pixmaps, which have a front buffer but no back buffer.<br>
+    *<br>
+    * Single-buffered surfaces with no front buffer confuse Mesa; so We deviate<br>
+    * from the spec, following the precedent of Mesa's EGL X11 platform. The<br>
+    * X11 platform correctly assigns pbuffers to single-buffered configs, but<br>
+    * assigns the pbuffer a front buffer instead of a back buffer.<br>
+    *<br>
+    * Pbuffers in the X11 platform mostly work today, so let's just copy its<br>
+    * behavior instead of trying to fix (and hence potentially breaking) the<br>
+    * world.<br>
+    */<br>
    if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {<br>
       if (!dri2_surf->front)<br>
          dri2_surf->front =<br>
@@ -104,14 +110,6 @@ surfaceless_image_get_buffers(__DRIdrawable *driDrawable,<br>
       buffers->image_mask |= __DRI_IMAGE_BUFFER_FRONT;<br>
<span class="">       buffers->front = dri2_surf->front;<br>
    }<br>
</span>-   if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {<br>
-      if (!dri2_surf->back)<br>
-         dri2_surf->back =<br>
-            surfaceless_alloc_image(dri2_dpy, dri2_surf);<br>
-<br>
-      buffers->image_mask |= __DRI_IMAGE_BUFFER_BACK;<br>
-      buffers->back = dri2_surf->back;<br>
-   }<br>
<br>
    return 1;<br>
 }<br>
@@ -142,7 +140,7 @@ dri2_surfaceless_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,<br>
<span class="">     * configs were filtered out in surfaceless_add_configs_for_visuals).<br>
</span>     */<br>
<span class="">    srgb = (dri2_surf->base.GLColorspace == EGL_GL_COLORSPACE_SRGB_KHR);<br>
</span>-   config = dri2_conf->dri_double_config[srgb];<br>
+   config = dri2_conf->dri_single_config[srgb];<br>
<br>
    if (!config)<br>
       goto cleanup_surface;<br>
@@ -211,19 +209,10 @@ surfaceless_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *dpy)<br>
    count = 0;<br>
<span class="">    for (i = 0; i < ARRAY_SIZE(visuals); i++) {<br>
</span><span class="">       for (j = 0; dri2_dpy->driver_configs[j]; j++) {<br>
</span>-         const EGLint surface_type = EGL_WINDOW_BIT | EGL_PBUFFER_BIT;<br>
          struct dri2_egl_config *dri2_conf;<br>
-         unsigned int double_buffered = 0;<br>
-<br>
-         dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[j],<br>
-            __DRI_ATTRIB_DOUBLE_BUFFER, &double_buffered);<br>
-<br>
-         /* support only double buffered configs */<br>
-         if (!double_buffered)<br>
-            continue;<br>
<span class=""><br>
          dri2_conf = dri2_add_config(dpy, dri2_dpy->driver_configs[j],<br>
</span>-               count + 1, surface_type, NULL, visuals[i]);<br>
+               count + 1, EGL_PBUFFER_BIT, NULL, visuals[i]);<br>
          if (dri2_conf)<br>
             count++;<br>
       }<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.8.1<br>
<br>
</font></span></blockquote></div><br></div>