OSDN Git Service

drm_hwcomposer: add overlapping rectangle seperation algorithm
[android-x86/external-drm_hwcomposer.git] / hwcomposer_import_nv_gralloc.cpp
index f012aab..ef6bdb2 100644 (file)
  * limitations under the License.
  */
 
-
 #include <cutils/log.h>
 #include <hardware/gralloc.h>
 
+#include <stdlib.h>
 #include <xf86drm.h>
 #include <xf86drmMode.h>
 #include "drm_hwcomposer.h"
 #define ARRAY_SIZE(arr) (int)(sizeof(arr) / sizeof((arr)[0]))
 
 struct hwc_import_context {
-       const gralloc_module_t *gralloc_module;
+  const gralloc_module_t *gralloc_module;
 };
 
-int hwc_import_init(struct hwc_import_context **ctx)
-{
-       int ret;
-       struct hwc_import_context *import_ctx;
-
-       import_ctx = (struct hwc_import_context *)calloc(1,
-                               sizeof(*import_ctx));
-       if (!ctx) {
-               ALOGE("Failed to allocate gralloc import context");
-               return -ENOMEM;
-       }
-
-       ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
-                       (const hw_module_t **)&import_ctx->gralloc_module);
-       if (ret) {
-               ALOGE("Failed to open gralloc module");
-               goto err;
-       }
+int hwc_import_init(struct hwc_import_context **ctx) {
+  struct hwc_import_context *import_ctx = (struct hwc_import_context *)calloc(1, sizeof(*import_ctx));
+  if (!ctx) {
+    ALOGE("Failed to allocate gralloc import context");
+    return -ENOMEM;
+  }
 
-       if (!strcasecmp(import_ctx->gralloc_module->common.author, "NVIDIA"))
-               ALOGW("Using non-NVIDIA gralloc module: %s\n",
-                       import_ctx->gralloc_module->common.name);
+  int ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID,
+                      (const hw_module_t **)&import_ctx->gralloc_module);
+  if (ret) {
+    ALOGE("Failed to open gralloc module");
+    free(import_ctx);
+    return ret;
+  }
 
-       *ctx = import_ctx;
+  if (!strcasecmp(import_ctx->gralloc_module->common.author, "NVIDIA"))
+    ALOGW("Using non-NVIDIA gralloc module: %s\n",
+          import_ctx->gralloc_module->common.name);
 
-       return 0;
+  *ctx = import_ctx;
 
-err:
-       free(import_ctx);
-       return ret;
+  return 0;
 }
 
-int hwc_import_destroy(struct hwc_import_context *ctx)
-{
-       free(ctx);
-       return 0;
+int hwc_import_destroy(struct hwc_import_context *ctx) {
+  free(ctx);
+  return 0;
 }
 
-struct importer_priv
-{
-       int drm_fd;
-       struct hwc_drm_bo bo;
+struct importer_priv {
+  int drm_fd;
+  struct hwc_drm_bo bo;
 };
 
-static void free_priv(void *p)
-{
-       struct importer_priv *priv = (struct importer_priv *)p;
-       struct drm_gem_close gem_close;
-       int i, ret;
-
-       if (priv->bo.fb_id) {
-               ret = drmModeRmFB(priv->drm_fd, priv->bo.fb_id);
-               if (ret)
-                       ALOGE("Failed to rm fb %d", ret);
-       }
-
-       memset(&gem_close, 0, sizeof(gem_close));
-       for (i = 0; i < ARRAY_SIZE(priv->bo.gem_handles); i++) {
-               if (!priv->bo.gem_handles[i])
-                       continue;
-               gem_close.handle = priv->bo.gem_handles[i];
-               ret = drmIoctl(priv->drm_fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
-               if (ret)
-                       ALOGE("Failed to close gem handle %d", ret);
-       }
-
-       free(priv);
+static void free_priv(void *p) {
+  struct importer_priv *priv = (struct importer_priv *)p;
+  if (priv->bo.fb_id) {
+    int ret = drmModeRmFB(priv->drm_fd, priv->bo.fb_id);
+    if (ret)
+      ALOGE("Failed to rm fb %d", ret);
+  }
+
+  struct drm_gem_close gem_close;
+  memset(&gem_close, 0, sizeof(gem_close));
+  for (int i = 0; i < ARRAY_SIZE(priv->bo.gem_handles); i++) {
+    if (!priv->bo.gem_handles[i])
+      continue;
+    gem_close.handle = priv->bo.gem_handles[i];
+    int ret = drmIoctl(priv->drm_fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
+    if (ret)
+      ALOGE("Failed to close gem handle %d", ret);
+  }
+
+  free(priv);
 }
 
-static int
-hwc_import_set_priv(hwc_import_context *ctx, buffer_handle_t handle, struct importer_priv *priv)
-{
-       int ret;
-       const gralloc_module_t *g = ctx->gralloc_module;
-
-       return g->perform(g, GRALLOC_MODULE_PERFORM_SET_IMPORTER_PRIVATE, handle, free_priv, priv);
+static int hwc_import_set_priv(hwc_import_context *ctx, buffer_handle_t handle,
+                               struct importer_priv *priv) {
+  const gralloc_module_t *g = ctx->gralloc_module;
+  return g->perform(g, GRALLOC_MODULE_PERFORM_SET_IMPORTER_PRIVATE, handle,
+                    free_priv, priv);
 }
 
-static struct importer_priv *
-hwc_import_get_priv(hwc_import_context *ctx, buffer_handle_t handle)
-{
-       int ret;
-       void *priv = NULL;
-       const gralloc_module_t *g = ctx->gralloc_module;
-
-       ret = g->perform(g, GRALLOC_MODULE_PERFORM_GET_IMPORTER_PRIVATE, handle, free_priv, &priv);
-       return ret ? NULL : (struct importer_priv *)priv;
+static struct importer_priv *hwc_import_get_priv(hwc_import_context *ctx,
+                                                 buffer_handle_t handle) {
+  const gralloc_module_t *g = ctx->gralloc_module;
+  void *priv = NULL;
+  int ret = g->perform(g, GRALLOC_MODULE_PERFORM_GET_IMPORTER_PRIVATE, handle,
+                   free_priv, &priv);
+  return ret ? NULL : (struct importer_priv *)priv;
 }
 
 int hwc_import_bo_create(int fd, hwc_import_context *ctx,
-                       buffer_handle_t handle, struct hwc_drm_bo *bo)
-{
-       int ret = 0;
-       const gralloc_module_t *g = ctx->gralloc_module;
-
-       /* Get imported bo that is cached in gralloc buffer, or create a new one. */
-       struct importer_priv *priv = hwc_import_get_priv(ctx, handle);
-       if (!priv) {
-               priv = (struct importer_priv *)calloc(1, sizeof(*priv));
-               if (!priv)
-                       return -ENOMEM;
-               priv->drm_fd = fd;
-
-               ret = g->perform(g, GRALLOC_MODULE_PERFORM_DRM_IMPORT, fd, handle, &priv->bo);
-               if (ret) {
-                       ALOGE("GRALLOC_MODULE_PERFORM_DRM_IMPORT failed %d", ret);
-                       free_priv(priv);
-                       return ret;
-               }
-
-               ret = drmModeAddFB2(fd, priv->bo.width, priv->bo.height,
-                                   priv->bo.format, priv->bo.gem_handles,
-                                   priv->bo.pitches, priv->bo.offsets,
-                                   &priv->bo.fb_id, 0);
-               if (ret) {
-                       ALOGE("Failed to add fb %d", ret);
-                       free_priv(priv);
-                       return ret;
-               }
-
-               ret = hwc_import_set_priv(ctx, handle, priv);
-               if (ret) {
-                       /* This will happen is persist.tegra.gpu_mapping_cache is 0/off,
-                        * or if NV gralloc runs out of "priv slots" (currently 3 per buffer,
-                        * only one of which should be used by drm_hwcomposer). */
-                       ALOGE("Failed to register free callback for imported buffer %d", ret);
-                       free_priv(priv);
-                       return ret;
-               }
-       }
-       *bo = priv->bo;
-       return ret;
+                         buffer_handle_t handle, struct hwc_drm_bo *bo) {
+  /* Get imported bo that is cached in gralloc buffer, or create a new one. */
+  struct importer_priv *priv = hwc_import_get_priv(ctx, handle);
+  if (priv) {
+    *bo = priv->bo;
+    return 0;
+  }
+
+  priv = (struct importer_priv *)calloc(1, sizeof(*priv));
+  if (!priv)
+    return -ENOMEM;
+  priv->drm_fd = fd;
+
+  const gralloc_module_t *g = ctx->gralloc_module;
+  int ret =
+      g->perform(g, GRALLOC_MODULE_PERFORM_DRM_IMPORT, fd, handle, &priv->bo);
+  if (ret) {
+    ALOGE("GRALLOC_MODULE_PERFORM_DRM_IMPORT failed %d", ret);
+    free_priv(priv);
+    return ret;
+  }
+
+  ret = drmModeAddFB2(fd, priv->bo.width, priv->bo.height, priv->bo.format,
+                      priv->bo.gem_handles, priv->bo.pitches,
+                      priv->bo.offsets, &priv->bo.fb_id, 0);
+  if (ret) {
+    ALOGE("Failed to add fb %d", ret);
+    free_priv(priv);
+    return ret;
+  }
+
+  ret = hwc_import_set_priv(ctx, handle, priv);
+  if (ret) {
+    /* This will happen is persist.tegra.gpu_mapping_cache is 0/off,
+     * or if NV gralloc runs out of "priv slots" (currently 3 per buffer,
+     * only one of which should be used by drm_hwcomposer). */
+    ALOGE("Failed to register free callback for imported buffer %d", ret);
+    free_priv(priv);
+    return ret;
+  }
+  *bo = priv->bo;
+  return ret;
 }
 
 bool hwc_import_bo_release(int fd, hwc_import_context *ctx,
-                       struct hwc_drm_bo *bo)
-{
-       /* hwc may not close the gem handles, we own them */
-       return false;
+                           struct hwc_drm_bo *bo) {
+  /* hwc may not close the gem handles, we own them */
+  return false;
 }