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