<div dir="ltr">+ Karl</div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-01 17:02 GMT+02:00 Mauro Rossi <span dir="ltr"><<a href="mailto:issor.oruam@gmail.com" target="_blank">issor.oruam@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">2017-01-06 18:35 GMT+01:00 Wu Zhen <span dir="ltr"><<a href="mailto:wuzhen@jidemail.com" target="_blank">wuzhen@jidemail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: WuZhen <<a href="mailto:wuzhen@jidemail.com" target="_blank">wuzhen@jidemail.com</a>><br>
<br>
this commit enable software rendering on android with llvmpipe.<br>
the system boots fine antutu 3D benchmark is passing<br>
<br>
this commit incorporates some further work done by:<br>
Paulo Sergio Travaglia <<a href="mailto:pstglia@gmail.com" target="_blank">pstglia@gmail.com</a>><br>
Mauro Rossi <<a href="mailto:issor.oruam@gmail.com" target="_blank">issor.oruam@gmail.com</a>><br>
<br>
Change-Id: Ibe0114333a278fd5e64632ac8c17c<wbr>ffde7c9b359<br>
Reviewed-by: Mauro Rossi <<a href="mailto:issor.oruam@gmail.com" target="_blank">issor.oruam@gmail.com</a>><br>
Reviewed-by: Chih-Wei Huang <<a href="mailto:cwhuang@linux.org.tw" target="_blank">cwhuang@linux.org.tw</a>><br>
---<br>
 src/egl/Android.mk                      |   1 +<br>
 src/egl/drivers/dri2/egl_<wbr>dri2.c         |   1 +<br>
 src/egl/drivers/dri2/<wbr>platform_android.c | 389 ++++++++++++++++++++++++++++++<wbr>+-<br>
 3 files changed, 386 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/egl/Android.mk b/src/egl/Android.mk<br>
index bfd56a744d..d63e71da92 100644<br>
--- a/src/egl/Android.mk<br>
+++ b/src/egl/Android.mk<br>
@@ -46,6 +46,7 @@ LOCAL_CFLAGS := \<br>
 LOCAL_C_INCLUDES := \<br>
        $(MESA_TOP)/src/egl/main \<br>
        $(MESA_TOP)/src/egl/drivers/dr<wbr>i2 \<br>
+       $(MESA_TOP)/src/gallium/inclu<wbr>de<br>
<br>
 LOCAL_STATIC_LIBRARIES := \<br>
        libmesa_loader<br>
diff --git a/src/egl/drivers/dri2/egl_dri<wbr>2.c b/src/egl/drivers/dri2/egl_dri<wbr>2.c<br>
index 52fbdff0b1..bdb3119496 100644<br>
--- a/src/egl/drivers/dri2/egl_dri<wbr>2.c<br>
+++ b/src/egl/drivers/dri2/egl_dri<wbr>2.c<br>
@@ -402,6 +402,7 @@ static const struct dri2_extension_match swrast_driver_extensions[] = {<br>
<br>
 static const struct dri2_extension_match swrast_core_extensions[] = {<br>
    { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) },<br>
+   { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },<br>
    { NULL, 0, 0 }<br>
 };<br>
<br>
diff --git a/src/egl/drivers/dri2/platfor<wbr>m_android.c b/src/egl/drivers/dri2/platfor<wbr>m_android.c<br>
index 1c880f934a..61c0aa4818 100644<br>
--- a/src/egl/drivers/dri2/platfor<wbr>m_android.c<br>
+++ b/src/egl/drivers/dri2/platfor<wbr>m_android.c<br>
@@ -40,6 +40,7 @@<br>
 #include "loader.h"<br>
 #include "egl_dri2.h"<br>
 #include "egl_dri2_fallbacks.h"<br>
+#include "state_tracker/drm_driver.h"<br>
 #include "gralloc_drm.h"<br>
<br>
 #define ALIGN(val, align)      (((val) + (align) - 1) & ~((align) - 1))<br>
@@ -157,6 +158,8 @@ get_native_buffer_name(struct ANativeWindowBuffer *buf)<br>
    return gralloc_drm_get_gem_handle(buf<wbr>->handle);<br>
 }<br>
<br>
+static const gralloc_module_t *gr_module = NULL;<br>
+<br>
 static EGLBoolean<br>
 droid_window_dequeue_buffer(s<wbr>truct dri2_egl_surface *dri2_surf)<br>
 {<br>
@@ -338,9 +341,14 @@ droid_create_surface(_EGLDrive<wbr>r *drv, _EGLDisplay *disp, EGLint type,<br>
    if (!config)<br>
       goto cleanup_surface;<br>
<br>
-   dri2_surf->dri_drawable =<br>
-      (*dri2_dpy->dri2->createNewDra<wbr>wable)(dri2_dpy->dri_screen, config,<br>
-                                           dri2_surf);<br>
+   if (dri2_dpy->dri2) {<br>
+      dri2_surf->dri_drawable =<br>
+         dri2_dpy->dri2->createNewDraw<wbr>able(dri2_dpy->dri_screen, config, dri2_surf);<br>
+   } else {<br>
+      dri2_surf->dri_drawable =<br>
+         dri2_dpy->swrast->createNewDr<wbr>awable(dri2_dpy->dri_screen, config, dri2_surf);<br>
+   }<br>
+<br>
    if (dri2_surf->dri_drawable == NULL) {<br>
       _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");<br>
       goto cleanup_surface;<br>
@@ -980,6 +988,259 @@ droid_add_configs_for_visuals(<wbr>_EGLDriver *drv, _EGLDisplay *dpy)<br>
    return (count != 0);<br>
 }<br>
<br>
+static int swrastUpdateBuffer(struct dri2_egl_surface *dri2_surf)<br>
+{<br>
+   if (dri2_surf->base.Type == EGL_WINDOW_BIT) {<br>
+       if (!dri2_surf->buffer && !droid_window_dequeue_buffer(d<wbr>ri2_surf)) {<br>
+          _eglLog(_EGL_WARNING, "failed to dequeue buffer for window");<br>
+          return 1;<br>
+       }<br>
+       dri2_surf->base.Width = dri2_surf->buffer->width;<br>
+       dri2_surf->base.Height = dri2_surf->buffer->height;<br>
+   }<br>
+   return 0;<br>
+}<br>
+<br>
+static void<br>
+swrastGetDrawableInfo(__DRIdr<wbr>awable * draw,<br>
+                      int *x, int *y, int *w, int *h,<br>
+                      void *loaderPrivate)<br>
+{<br>
+   struct dri2_egl_surface *dri2_surf = loaderPrivate;<br>
+<br>
+   swrastUpdateBuffer(dri2_surf)<wbr>;<br>
+<br>
+   *x = 0;<br>
+   *y = 0;<br>
+   *w = dri2_surf->base.Width;<br>
+   *h = dri2_surf->base.Height;<br>
+}<br>
+<br>
+static void<br>
+swrastPutImage2(__DRIdrawable * draw, int op,<br>
+                int x, int y, int w, int h, int stride,<br>
+                char *data, void *loaderPrivate)<br>
+{<br>
+   struct dri2_egl_surface *dri2_surf = loaderPrivate;<br>
+   struct _EGLDisplay *egl_dpy = dri2_surf->base.Resource.Displ<wbr>ay;<br>
+   char *dstPtr, *srcPtr;<br>
+   size_t BPerPixel, dstStride, copyWidth, xOffset;<br>
+<br>
+   if (swrastUpdateBuffer(dri2_surf)<wbr>) {<br>
+      return;<br>
+   }<br>
+<br>
+   BPerPixel = get_format_bpp(dri2_surf->buff<wbr>er->format);<br>
+   dstStride = BPerPixel * dri2_surf->buffer->stride;<br>
+   copyWidth = BPerPixel * w;<br>
+   xOffset = BPerPixel * x;<br>
+<br>
+   /* drivers expect we do these checks (and some rely on it) */<br>
+   if (copyWidth > dstStride - xOffset)<br>
+      copyWidth = dstStride - xOffset;<br>
+   if (h > dri2_surf->base.Height - y)<br>
+      h = dri2_surf->base.Height - y;<br>
+<br>
+   if (gr_module->lock(gr_module, dri2_surf->buffer->handle, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,<br>
+                       0, 0, dri2_surf->buffer->width, dri2_surf->buffer->height, (void**)&dstPtr)) {<br>
+      _eglLog(_EGL_WARNING, "can not lock window buffer");<br>
+      return;<br>
+   }<br>
+<br>
+   dstPtr += y * dstStride + xOffset;<br>
+   srcPtr = data;<br>
+<br>
+   if (xOffset == 0 && copyWidth == stride && copyWidth == dstStride) {<br>
+      memcpy(dstPtr, srcPtr, copyWidth * h);<br>
+   } else {<br>
+      for (; h>0; h--) {<br>
+         memcpy(dstPtr, srcPtr, copyWidth);<br>
+         srcPtr += stride;<br>
+         dstPtr += dstStride;<br>
+      }<br>
+   }<br>
+<br>
+   if (gr_module->unlock(gr_module, dri2_surf->buffer->handle)) {<br>
+      _eglLog(_EGL_WARNING, "unlock buffer failed");<br>
+   }<br>
+<br>
+   droid_window_enqueue_buffer(e<wbr>gl_dpy, dri2_surf);<br>
+}<br>
+<br>
+static void<br>
+swrastPutImage(__DRIdrawable * draw, int op,<br>
+              int x, int y, int w, int h,<br>
+              char *data, void *loaderPrivate)<br>
+{<br>
+   struct dri2_egl_surface *dri2_surf = loaderPrivate;<br>
+   int stride;<br>
+<br>
+   if (swrastUpdateBuffer(dri2_surf)<wbr>) {<br>
+      return;<br>
+   }<br>
+<br>
+   stride = get_format_bpp(dri2_surf->buff<wbr>er->format) * w;<br>
+   swrastPutImage2(draw, op, x, y, w, h, stride, data, loaderPrivate);<br>
+}<br>
+<br>
+static void<br>
+swrastGetImage(__DRIdrawable * read,<br>
+               int x, int y, int w, int h,<br>
+               char *data, void *loaderPrivate)<br>
+{<br>
+   struct dri2_egl_surface *dri2_surf = loaderPrivate;<br>
+   size_t BPerPixel, srcStride, copyWidth, xOffset;<br>
+   char *dstPtr, *srcPtr;<br>
+<br>
+   _eglLog(_EGL_WARNING, "calling swrastGetImage with read=%p, private=%p, w=%d, h=%d", read, loaderPrivate, w, h);<br>
+<br>
+   if (swrastUpdateBuffer(dri2_surf)<wbr>) {<br>
+      _eglLog(_EGL_WARNING, "swrastGetImage failed data unchanged");<br>
+      return;<br>
+   }<br>
+<br>
+   BPerPixel = get_format_bpp(dri2_surf->buff<wbr>er->format);<br>
+   srcStride = BPerPixel * dri2_surf->buffer->stride;<br>
+   copyWidth = BPerPixel * w;<br>
+   xOffset = BPerPixel * x;<br>
+<br>
+   if (gr_module->lock(gr_module, dri2_surf->buffer->handle, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,<br>
+                       0, 0, dri2_surf->buffer->width, dri2_surf->buffer->height, (void**)&srcPtr)) {<br>
+      _eglLog(_EGL_WARNING, "can not lock window buffer");<br>
+      memset(data, 0, copyWidth * h);<br>
+      return;<br>
+   }<br>
+<br>
+   srcPtr += y * srcStride + xOffset;<br>
+   dstPtr = data;<br>
+<br>
+   if (xOffset == 0 && copyWidth == srcStride) {<br>
+      memcpy(dstPtr, srcPtr, copyWidth * h);<br>
+   } else {<br>
+      for (; h>0; h--) {<br>
+         memcpy(dstPtr, srcPtr, copyWidth);<br>
+         srcPtr += srcStride;<br>
+         dstPtr += copyWidth;<br>
+      }<br>
+   }<br>
+<br>
+   if (gr_module->unlock(gr_module, dri2_surf->buffer->handle)) {<br>
+      _eglLog(_EGL_WARNING, "unlock buffer failed");<br>
+   }<br>
+}<br>
+<br>
+static EGLBoolean<br>
+swrast_swap_buffers(_EGLDrive<wbr>r *drv, _EGLDisplay *disp, _EGLSurface *draw)<br>
+{<br>
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);<br>
+   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);<br>
+<br>
+   dri2_dpy->core->swapBuffers(d<wbr>ri2_surf->dri_drawable);<br>
+<br>
+   return EGL_TRUE;<br>
+}<br>
+<br>
+static _EGLImage *<br>
+swrast_create_image_android_n<wbr>ative_buffer(_EGLDisplay *disp, _EGLContext *ctx,<br>
+                                          struct ANativeWindowBuffer *buf)<br>
+{<br>
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);<br>
+   struct dri2_egl_image *dri2_img;<br>
+   struct winsys_handle whandle;<br>
+   EGLint format;<br>
+<br>
+   if (ctx != NULL) {<br>
+      /* From the EGL_ANDROID_image_native_buffe<wbr>r spec:<br>
+       *<br>
+       *     * If <target> is EGL_NATIVE_BUFFER_ANDROID and <ctx> is not<br>
+       *       EGL_NO_CONTEXT, the error EGL_BAD_CONTEXT is generated.<br>
+       */<br>
+      _eglError(EGL_BAD_CONTEXT, "eglCreateEGLImageKHR: for "<br>
+                "EGL_NATIVE_BUFFER_ANDROID, the context must be "<br>
+                "EGL_NO_CONTEXT");<br>
+      return NULL;<br>
+   }<br>
+<br>
+   if (!buf || buf->common.magic != ANDROID_NATIVE_BUFFER_MAGIC ||<br>
+       buf->common.version != sizeof(*buf)) {<br>
+      _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR");<br>
+      return NULL;<br>
+   }<br>
+<br>
+   /* see the table in droid_add_configs_for_visuals */<br>
+   format = get_format(buf->format);<br>
+   if (format < 0)<br>
+      return NULL;<br>
+<br>
+   dri2_img = calloc(1, sizeof(*dri2_img));<br>
+   if (!dri2_img) {<br>
+      _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm")<wbr>;<br>
+      return NULL;<br>
+   }<br>
+<br>
+   if (!_eglInitImage(&dri2_img->bas<wbr>e, disp)) {<br>
+      free(dri2_img);<br>
+      return NULL;<br>
+   }<br>
+<br>
+   memset(&whandle, 0, sizeof(whandle));<br>
+   whandle.type = DRM_API_HANDLE_TYPE_BUFFER;<br>
+   whandle.external_buffer = buf;<br>
+   whandle.stride = buf->stride * get_format_bpp(buf->format);<br>
+<br>
+   dri2_img->dri_image =<br>
+         dri2_dpy->swrast->createImage<wbr>FromWinsys(dri2_dpy->dri_<wbr>screen,<br>
+                                                 buf->width,<br>
+                                                 buf->height,<br>
+                                                 format,<br>
+                                                 1, &whandle,<br>
+                                                 dri2_img);<br>
+<br>
+   if (!dri2_img->dri_image) {<br>
+      free(dri2_img);<br>
+      _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm")<wbr>;<br>
+      return NULL;<br>
+   }<br>
+<br>
+   return &dri2_img->base;<br>
+}<br>
+<br>
+static _EGLImage *<br>
+swrast_create_image_khr(_EGLD<wbr>river *drv, _EGLDisplay *disp,<br>
+                        _EGLContext *ctx, EGLenum target,<br>
+                        EGLClientBuffer buffer, const EGLint *attr_list)<br>
+{<br>
+   switch (target) {<br>
+   case EGL_NATIVE_BUFFER_ANDROID:<br>
+      return swrast_create_image_android_na<wbr>tive_buffer(disp, ctx,<br>
+            (struct ANativeWindowBuffer *) buffer);<br>
+   default:<br>
+      return dri2_create_image_khr(drv, disp, ctx, target, buffer, attr_list);<br>
+   }<br>
+}<br>
+<br>
+static int<br>
+load_gralloc(void)<br>
+{<br>
+   const hw_module_t *mod;<br>
+   int err;<br>
+<br>
+   err = hw_get_module(GRALLOC_HARDWARE<wbr>_MODULE_ID, &mod);<br>
+   if (!err) {<br>
+      gr_module = (gralloc_module_t *) mod;<br>
+   } else {<br>
+      _eglLog(_EGL_WARNING, "fail to load gralloc");<br>
+   }<br>
+   return err;<br>
+}<br>
+<br>
+static int<br>
+is_drm_gralloc(void)<br>
+{<br>
+   /* need a cleaner way to distinguish drm_gralloc and gralloc.default */<br>
+   return !!gr_module->perform;<br>
+}<br>
+<br>
 static int<br>
 droid_open_device(struct dri2_egl_display *dri2_dpy)<br>
 {<br>
@@ -1064,6 +1325,15 @@ static const __DRIimageLoaderExtension droid_image_loader_extension = {<br>
    .flushFrontBuffer    = droid_flush_front_buffer,<br>
 };<br>
<br>
+static const __DRIswrastLoaderExtension droid_swrast_loader_extension = {<br>
+   .base = { __DRI_SWRAST_LOADER, 2 },<br>
+<br>
+   .getDrawableInfo     = swrastGetDrawableInfo,<br>
+   .putImage            = swrastPutImage,<br>
+   .getImage            = swrastGetImage,<br>
+   .putImage2           = swrastPutImage2,<br>
+};<br>
+<br>
 static const __DRIextension *droid_dri2_loader_extensions[<wbr>] = {<br>
    &droid_dri2_loader_extension.b<wbr>ase,<br>
    &image_lookup_extension.base,<br>
@@ -1078,8 +1348,14 @@ static const __DRIextension *droid_image_loader_extensions<wbr>[] = {<br>
    NULL,<br>
 };<br>
<br>
-EGLBoolean<br>
-dri2_initialize_android(_EGLD<wbr>river *drv, _EGLDisplay *dpy)<br>
+static const __DRIextension *droid_swrast_loader_extension<wbr>s[] = {<br>
+   &droid_swrast_loader_extensio<wbr>n.base,<br>
+   &image_lookup_extension.base,<br>
+   NULL,<br>
+};<br>
+<br>
+static EGLBoolean<br>
+dri2_initialize_android_drm(_<wbr>EGLDriver *drv, _EGLDisplay *dpy)<br>
 {<br>
    struct dri2_egl_display *dri2_dpy;<br>
    const char *err;<br>
@@ -1163,3 +1439,106 @@ cleanup_display:<br>
<br>
    return _eglError(EGL_NOT_INITIALIZED, err);<br>
 }<br>
+<br>
+/* differs with droid_display_vtbl in create_image, swap_buffers */<br>
+static struct dri2_egl_display_vtbl swrast_display_vtbl = {<br>
+    .authenticate = NULL,<br>
+    .create_window_surface = droid_create_window_surface,<br>
+    .create_pixmap_surface = dri2_fallback_create_pixmap_su<wbr>rface,<br>
+    .create_pbuffer_surface = droid_create_pbuffer_surface,<br>
+    .destroy_surface = droid_destroy_surface,<br>
+    .create_image = swrast_create_image_khr,<br>
+    .swap_interval = dri2_fallback_swap_interval,<br>
+    .swap_buffers = swrast_swap_buffers,<br>
+    .swap_buffers_with_damage = dri2_fallback_swap_buffers_wit<wbr>h_damage,<br>
+    .swap_buffers_region = dri2_fallback_swap_buffers_reg<wbr>ion,<br>
+    .post_sub_buffer = dri2_fallback_post_sub_buffer,<br>
+    .copy_buffers = dri2_fallback_copy_buffers,<br>
+    .query_buffer_age = dri2_fallback_query_buffer_age<wbr>,<br>
+    .create_wayland_buffer_from_im<wbr>age = dri2_fallback_create_wayland_b<wbr>uffer_from_image,<br>
+    .get_sync_values = dri2_fallback_get_sync_values,<br>
+    .get_dri_drawable = dri2_surface_get_dri_drawable,<br>
+};<br>
+<br>
+static EGLBoolean<br>
+dri2_initialize_android_swras<wbr>t(_EGLDriver *drv, _EGLDisplay *dpy)<br>
+{<br>
+   struct dri2_egl_display *dri2_dpy;<br>
+   const char *err = "";<br>
+   const hw_module_t *mod;<br>
+<br>
+   _eglSetLogProc(droid_log);<br>
+<br>
+   loader_set_logger(_eglLog);<br>
+<br>
+   dri2_dpy = calloc(1, sizeof(*dri2_dpy));<br>
+   if (!dri2_dpy)<br>
+      return _eglError(EGL_BAD_ALLOC, "eglInitialize");<br>
+<br>
+   dpy->DriverData = (void *) dri2_dpy;<br>
+<br>
+   dri2_dpy->driver_name = strdup("swrast");<br>
+   if (!dri2_load_driver_swrast(dpy)<wbr>) {<br>
+      err = "DRISW: failed to load swrast driver";<br>
+      goto cleanup_driver_name;<br>
+   }<br>
+<br>
+   dri2_dpy->loader_extensions = droid_swrast_loader_extensions<wbr>;<br>
+<br>
+   if (!dri2_create_screen(dpy)) {<br>
+      err = "DRISW: failed to create screen";<br>
+      goto cleanup_driver;<br>
+   }<br>
+<br>
+   if (!droid_add_configs_for_visual<wbr>s(drv, dpy)) {<br>
+      err = "DRISW: failed to add configs";<br>
+      goto cleanup_screen;<br>
+   }<br>
+<br>
+   dpy->Extensions.ANDROID_frame<wbr>buffer_target = EGL_TRUE;<br>
+   dpy->Extensions.ANDROID_<wbr>image_native_buffer = EGL_TRUE;<br>
+   dpy->Extensions.ANDROID_recor<wbr>dable = EGL_TRUE;<br>
+   dpy->Extensions.KHR_image_<wbr>base = EGL_TRUE;<br>
+<br>
+   /* Fill vtbl last to prevent accidentally calling virtual function during<br>
+    * initialization.<br>
+    */<br>
+   dri2_dpy->vtbl = &swrast_display_vtbl;<br>
+<br>
+   return EGL_TRUE;<br>
+<br>
+cleanup_screen:<br>
+   dri2_dpy->core-><wbr>destroyScreen(dri2_dpy->dri_<wbr>screen);<br>
+cleanup_driver:<br>
+   dlclose(dri2_dpy->driver);<br>
+cleanup_driver_name:<br>
+   free(dri2_dpy->driver_name);<br>
+   free(dri2_dpy);<br>
+<br>
+   return _eglError(EGL_NOT_INITIALIZED, err);<br>
+}<br>
+<br>
+EGLBoolean<br>
+dri2_initialize_android(_EGLD<wbr>river *drv, _EGLDisplay *dpy)<br>
+{<br>
+   EGLBoolean initialized = EGL_TRUE;<br>
+<br>
+   if (load_gralloc()) {<br>
+      return EGL_FALSE;<br>
+   }<br>
+<br>
+   int droid_hw_accel = (getenv("LIBGL_ALWAYS_SOFTWARE<wbr>") == NULL) && is_drm_gralloc();<br>
+<br>
+   if (droid_hw_accel) {<br>
+      if (!dri2_initialize_android_drm(<wbr>drv, dpy)) {<br>
+         initialized = dri2_initialize_android_swrast<wbr>(drv, dpy);<br>
+         if (initialized) {<br>
+            _eglLog(_EGL_INFO, "Android: Fallback to software renderer");<br>
+         }<br>
+      }<br>
+   } else {<br>
+      initialized = dri2_initialize_android_swrast<wbr>(drv, dpy);<br>
+   }<br>
+<br>
+   return initialized;<br>
+}<br>
<span class="m_2887269286617607820gmail-HOEnZb"><font color="#888888">--<br>
2.11.0<br></font></span></blockquote><div><br></div></div></div><div>Hi Emil, Tomasz, Tapani, Karl,</div><div><br></div><div>comparing this series with other swrast implementations in CrOS, Android-IA,</div><div>are there other android platform swrast implementations? [Tomasz, Tapani if the question does makes sense]<br></div><div><br></div><div>I had checked in other platforms (drm, EGL wayland)</div><div>but in the past I had found no changes in backbuffer handling/swapBuffer/PutImage2,</div><div>do you know and could explain me the reason? [Emil if you know, but do not use time if it requires research]</div><div><br></div><div>I also wanted to check if situation may have changed since January 2017,<br></div><div>because of swr and other patches in gallium/swrast submitted to mesa-dev like [1], [2], [3], [4]</div><div>which seem to tackle with functional needs in backbuffer/image2 and swapbuffer area,</div><div>even if addressed in winsys instead of EGL platform android. [Karl a brief update will suffice, no hurry]</div><div><br></div><div>Are there news or consolidated choices about the implementation approach? [` Emil or others]</div><div>Thanks for sharing you thoughts</div><div><br></div><div>Mauro</div><div><br></div><div>[1] <a href="https://lists.freedesktop.org/archives/mesa-dev/2017-January/141614.html" target="_blank">https://lists.freedesktop.org/<wbr>archives/mesa-dev/2017-<wbr>January/141614.html</a><br></div><div><br></div><div>[2] <a href="https://lists.freedesktop.org/archives/mesa-dev/2017-January/141621.html" target="_blank">https://lists.freedesktop.<wbr>org/archives/mesa-dev/2017-<wbr>January/141621.html</a></div><div><br></div><div>[3] <a href="https://lists.freedesktop.org/archives/mesa-dev/2017-January/141616.html" target="_blank">https://lists.freedesktop.<wbr>org/archives/mesa-dev/2017-<wbr>January/141616.html</a><br></div><div><br></div><div>[4] <a href="https://lists.freedesktop.org/archives/mesa-dev/2017-January/141624.html" target="_blank">https://lists.freedesktop.<wbr>org/archives/mesa-dev/2017-<wbr>January/141624.html</a></div></div></div></div>
</blockquote></div><br></div>