Hey Chih-Wei,

On 04/23/2018 04:17 AM, Chih-Wei Huang wrote:
What's the impact to drm_gralloc?

I'm not terribly familiar with drm_gralloc, but as far as I understand it depends on flink name support at the moment.

The overarching idea here is to make mesa gralloc independent, but also at the same time provide some infrastructure for making the grallocs able to be separate.

I'm not sure what the best way to keep drm_gralloc support alive and at the same time make mesa gralloc independent is.


Rob.



2018-04-20 5:09 GMT+08:00 Rob Herring <r...@kernel.org>:
Maintaining both flink names and prime fd support which are provided by
2 different gralloc implementations is problematic because we have a
dependency on a specific gralloc implementation header.

This mostly removes the dependency on the gralloc implementation and
headers. The dependency on GRALLOC_MODULE_PERFORM_GET_DRM_FD remains for
now, but the definition is added locally to remove the header
dependency.

Signed-off-by: Rob Herring <r...@kernel.org>
---
With this plus Robert's probing patch, we remove any gralloc
implementation dependency (other than it has to be a pre 1.0
implementation...).

  src/egl/drivers/dri2/egl_dri2.h         |   1 -
  src/egl/drivers/dri2/platform_android.c | 172 ++++----------------------------
  2 files changed, 17 insertions(+), 156 deletions(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index cc76c73eab2f..d9e1f466fbeb 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -61,7 +61,6 @@ struct zwp_linux_dmabuf_v1;

  #include <system/window.h>
  #include <hardware/gralloc.h>
-#include <gralloc_drm_handle.h>

  #endif /* HAVE_ANDROID_PLATFORM */

diff --git a/src/egl/drivers/dri2/platform_android.c 
b/src/egl/drivers/dri2/platform_android.c
index 4f25cb746915..68c85d7f99fa 100644
--- a/src/egl/drivers/dri2/platform_android.c
+++ b/src/egl/drivers/dri2/platform_android.c
@@ -37,7 +37,6 @@
  #include "loader.h"
  #include "egl_dri2.h"
  #include "egl_dri2_fallbacks.h"
-#include "gralloc_drm.h"

  #define ALIGN(val, align)      (((val) + (align) - 1) & ~((align) - 1))

@@ -164,12 +163,6 @@ get_native_buffer_fd(struct ANativeWindowBuffer *buf)
     return (handle && handle->numFds) ? handle->data[0] : -1;
  }

-static int
-get_native_buffer_name(struct ANativeWindowBuffer *buf)
-{
-   return gralloc_drm_get_gem_handle(buf->handle);
-}
-
  static EGLBoolean
  droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf)
  {
@@ -822,50 +815,6 @@ droid_create_image_from_prime_fd(_EGLDisplay *disp, 
_EGLContext *ctx,
     return dri2_create_image_dma_buf(disp, ctx, NULL, attr_list);
  }

-static _EGLImage *
-droid_create_image_from_name(_EGLDisplay *disp, _EGLContext *ctx,
-                             struct ANativeWindowBuffer *buf)
-{
-   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   struct dri2_egl_image *dri2_img;
-   int name;
-   int format;
-
-   name = get_native_buffer_name(buf);
-   if (!name) {
-      _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR");
-      return NULL;
-   }
-
-   format = get_format(buf->format);
-   if (format == -1)
-       return NULL;
-
-   dri2_img = calloc(1, sizeof(*dri2_img));
-   if (!dri2_img) {
-      _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm");
-      return NULL;
-   }
-
-   _eglInitImage(&dri2_img->base, disp);
-
-   dri2_img->dri_image =
-      dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
-                                          buf->width,
-                                          buf->height,
-                                          format,
-                                          name,
-                                          buf->stride,
-                                          dri2_img);
-   if (!dri2_img->dri_image) {
-      free(dri2_img);
-      _eglError(EGL_BAD_ALLOC, "droid_create_image_mesa_drm");
-      return NULL;
-   }
-
-   return &dri2_img->base;
-}
-
  static EGLBoolean
  droid_query_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
                      EGLint attribute, EGLint *value)
@@ -921,7 +870,7 @@ dri2_create_image_android_native_buffer(_EGLDisplay *disp,
     if (fd >= 0)
        return droid_create_image_from_prime_fd(disp, ctx, buf, fd);

-   return droid_create_image_from_name(disp, ctx, buf);
+   return NULL;
  }

  static _EGLImage *
@@ -943,82 +892,6 @@ droid_flush_front_buffer(__DRIdrawable * driDrawable, void 
*loaderPrivate)
  {
  }

-static int
-droid_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf,
-                                    unsigned int *attachments, int count)
-{
-   int num_buffers = 0;
-
-   /* fill dri2_surf->buffers */
-   for (int i = 0; i < count * 2; i += 2) {
-      __DRIbuffer *buf, *local;
-
-      assert(num_buffers < ARRAY_SIZE(dri2_surf->buffers));
-      buf = &dri2_surf->buffers[num_buffers];
-
-      switch (attachments[i]) {
-      case __DRI_BUFFER_BACK_LEFT:
-         if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
-            buf->attachment = attachments[i];
-            buf->name = get_native_buffer_name(dri2_surf->buffer);
-            buf->cpp = get_format_bpp(dri2_surf->buffer->format);
-            buf->pitch = dri2_surf->buffer->stride * buf->cpp;
-            buf->flags = 0;
-
-            if (buf->name)
-               num_buffers++;
-
-            break;
-         }
-         /* fall through for pbuffers */
-      case __DRI_BUFFER_DEPTH:
-      case __DRI_BUFFER_STENCIL:
-      case __DRI_BUFFER_ACCUM:
-      case __DRI_BUFFER_DEPTH_STENCIL:
-      case __DRI_BUFFER_HIZ:
-         local = dri2_egl_surface_alloc_local_buffer(dri2_surf,
-               attachments[i], attachments[i + 1]);
-
-         if (local) {
-            *buf = *local;
-            num_buffers++;
-         }
-         break;
-      case __DRI_BUFFER_FRONT_LEFT:
-      case __DRI_BUFFER_FRONT_RIGHT:
-      case __DRI_BUFFER_FAKE_FRONT_LEFT:
-      case __DRI_BUFFER_FAKE_FRONT_RIGHT:
-      case __DRI_BUFFER_BACK_RIGHT:
-      default:
-         /* no front or right buffers */
-         break;
-      }
-   }
-
-   return num_buffers;
-}
-
-static __DRIbuffer *
-droid_get_buffers_with_format(__DRIdrawable * driDrawable,
-                            int *width, int *height,
-                            unsigned int *attachments, int count,
-                            int *out_count, void *loaderPrivate)
-{
-   struct dri2_egl_surface *dri2_surf = loaderPrivate;
-
-   if (update_buffers(dri2_surf) < 0)
-      return NULL;
-
-   *out_count = droid_get_buffers_parse_attachments(dri2_surf, attachments, 
count);
-
-   if (width)
-      *width = dri2_surf->base.Width;
-   if (height)
-      *height = dri2_surf->base.Height;
-
-   return dri2_surf->buffers;
-}
-
  static unsigned
  droid_get_capability(void *loaderPrivate, enum dri_loader_cap cap)
  {
@@ -1100,6 +973,14 @@ droid_add_configs_for_visuals(_EGLDriver *drv, 
_EGLDisplay *dpy)
     return (config_count != 0);
  }

+enum {
+        /* perform(const struct gralloc_module_t *mod,
+         *         int op,
+         *         int *fd);
+         */
+        GRALLOC_MODULE_PERFORM_GET_DRM_FD                = 0x40000002,
+};
+
  static int
  droid_open_device(struct dri2_egl_display *dri2_dpy)
  {
@@ -1141,15 +1022,6 @@ static const struct dri2_egl_display_vtbl 
droid_display_vtbl = {
     .get_dri_drawable = dri2_surface_get_dri_drawable,
  };

-static const __DRIdri2LoaderExtension droid_dri2_loader_extension = {
-   .base = { __DRI_DRI2_LOADER, 4 },
-
-   .getBuffers           = NULL,
-   .flushFrontBuffer     = droid_flush_front_buffer,
-   .getBuffersWithFormat = droid_get_buffers_with_format,
-   .getCapability        = droid_get_capability,
-};
-
  static const __DRIimageLoaderExtension droid_image_loader_extension = {
     .base = { __DRI_IMAGE_LOADER, 2 },

@@ -1158,13 +1030,6 @@ static const __DRIimageLoaderExtension 
droid_image_loader_extension = {
     .getCapability       = droid_get_capability,
  };

-static const __DRIextension *droid_dri2_loader_extensions[] = {
-   &droid_dri2_loader_extension.base,
-   &image_lookup_extension.base,
-   &use_invalidate.base,
-   NULL,
-};
-
  static const __DRIextension *droid_image_loader_extensions[] = {
     &droid_image_loader_extension.base,
     &image_lookup_extension.base,
@@ -1216,17 +1081,14 @@ dri2_initialize_android(_EGLDriver *drv, _EGLDisplay 
*disp)
     /* render nodes cannot use Gem names, and thus do not support
      * the __DRI_DRI2_LOADER extension */
     if (!dri2_dpy->is_render_node) {
-      dri2_dpy->loader_extensions = droid_dri2_loader_extensions;
-      if (!dri2_load_driver(disp)) {
-         err = "DRI2: failed to load driver";
-         goto cleanup;
-      }
-   } else {
-      dri2_dpy->loader_extensions = droid_image_loader_extensions;
-      if (!dri2_load_driver_dri3(disp)) {
-         err = "DRI3: failed to load driver";
-         goto cleanup;
-      }
+      err = "DRI2: driver is not a render node";
+      goto cleanup;
+   }
+
+   dri2_dpy->loader_extensions = droid_image_loader_extensions;
+   if (!dri2_load_driver_dri3(disp)) {
+      err = "DRI3: failed to load driver";
+      goto cleanup;
     }

     if (!dri2_create_screen(disp)) {
--
2.14.1

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



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

Reply via email to