OSDN Git Service

Revert "minigbm: Revert "minigbm: flush buffer instead of unmapping""
[android-x86/external-minigbm.git] / cros_gralloc / cros_gralloc_helpers.cc
index 51e09bf..e662084 100644 (file)
@@ -8,55 +8,9 @@
 
 #include <cstdlib>
 #include <cutils/log.h>
-#include <fcntl.h>
-#include <xf86drm.h>
+#include <sync/sync.h>
 
-uint64_t cros_gralloc_convert_flags(int flags)
-{
-       uint64_t usage = DRV_BO_USE_NONE;
-
-       if (flags & GRALLOC_USAGE_CURSOR)
-               usage |= DRV_BO_USE_CURSOR;
-       if ((flags & sw_read()) == GRALLOC_USAGE_SW_READ_RARELY)
-               usage |= DRV_BO_USE_SW_READ_RARELY;
-       if ((flags & sw_read()) == GRALLOC_USAGE_SW_READ_OFTEN)
-               usage |= DRV_BO_USE_SW_READ_OFTEN;
-       if ((flags & sw_write()) == GRALLOC_USAGE_SW_WRITE_RARELY)
-               usage |= DRV_BO_USE_SW_WRITE_RARELY;
-       if ((flags & sw_write()) == GRALLOC_USAGE_SW_WRITE_OFTEN)
-               usage |= DRV_BO_USE_SW_WRITE_OFTEN;
-       if (flags & GRALLOC_USAGE_HW_TEXTURE)
-               usage |= DRV_BO_USE_RENDERING;
-       if (flags & GRALLOC_USAGE_HW_RENDER)
-               usage |= DRV_BO_USE_RENDERING;
-       if (flags & GRALLOC_USAGE_HW_2D)
-               usage |= DRV_BO_USE_RENDERING;
-       if (flags & GRALLOC_USAGE_HW_COMPOSER)
-       /* HWC wants to use display hardware, but can defer to OpenGL. */
-               usage |= DRV_BO_USE_SCANOUT | DRV_BO_USE_RENDERING;
-       if (flags & GRALLOC_USAGE_HW_FB)
-               usage |= DRV_BO_USE_SCANOUT;
-       if (flags & GRALLOC_USAGE_EXTERNAL_DISP)
-       /* We're ignoring this flag until we decide what to with display link */
-               usage |= DRV_BO_USE_NONE;
-       if (flags & GRALLOC_USAGE_PROTECTED)
-               usage |= DRV_BO_USE_PROTECTED;
-       if (flags & GRALLOC_USAGE_HW_VIDEO_ENCODER)
-               /*HACK: See b/30054495 */
-               usage |= DRV_BO_USE_SW_READ_OFTEN;
-       if (flags & GRALLOC_USAGE_HW_CAMERA_WRITE)
-               usage |= DRV_BO_USE_HW_CAMERA_WRITE;
-       if (flags & GRALLOC_USAGE_HW_CAMERA_READ)
-               usage |= DRV_BO_USE_HW_CAMERA_READ;
-       if (flags & GRALLOC_USAGE_HW_CAMERA_ZSL)
-               usage |= DRV_BO_USE_HW_CAMERA_ZSL;
-       if (flags & GRALLOC_USAGE_RENDERSCRIPT)
-               usage |= DRV_BO_USE_RENDERSCRIPT;
-
-       return usage;
-}
-
-drv_format_t cros_gralloc_convert_format(int format)
+uint32_t cros_gralloc_convert_format(int format)
 {
        /*
         * Conversion from HAL to fourcc-based DRV formats based on
@@ -65,70 +19,77 @@ drv_format_t cros_gralloc_convert_format(int format)
 
        switch (format) {
        case HAL_PIXEL_FORMAT_BGRA_8888:
-               return DRV_FORMAT_ARGB8888;
+               return DRM_FORMAT_ARGB8888;
        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
-               return DRV_FORMAT_FLEX_IMPLEMENTATION_DEFINED;
+               return DRM_FORMAT_FLEX_IMPLEMENTATION_DEFINED;
        case HAL_PIXEL_FORMAT_RGB_565:
-               return DRV_FORMAT_RGB565;
+               return DRM_FORMAT_RGB565;
        case HAL_PIXEL_FORMAT_RGB_888:
-               return DRV_FORMAT_RGB888;
+               return DRM_FORMAT_RGB888;
        case HAL_PIXEL_FORMAT_RGBA_8888:
-               return DRV_FORMAT_ABGR8888;
+               return DRM_FORMAT_ABGR8888;
        case HAL_PIXEL_FORMAT_RGBX_8888:
-               return DRV_FORMAT_XBGR8888;
+               return DRM_FORMAT_XBGR8888;
        case HAL_PIXEL_FORMAT_YCbCr_420_888:
-               return DRV_FORMAT_FLEX_YCbCr_420_888;
+               return DRM_FORMAT_FLEX_YCbCr_420_888;
        case HAL_PIXEL_FORMAT_YV12:
-               return DRV_FORMAT_YVU420;
+               return DRM_FORMAT_YVU420_ANDROID;
+       /*
+        * Choose DRM_FORMAT_R8 because <system/graphics.h> requires the buffers
+        * with a format HAL_PIXEL_FORMAT_BLOB have a height of 1, and width
+        * equal to their size in bytes.
+        */
+       case HAL_PIXEL_FORMAT_BLOB:
+               return DRM_FORMAT_R8;
        }
 
-       return DRV_FORMAT_NONE;
+       return DRM_FORMAT_NONE;
 }
 
-int32_t cros_gralloc_rendernode_open(struct driver **drv)
+cros_gralloc_handle_t cros_gralloc_convert_handle(buffer_handle_t handle)
 {
-       /* TODO(gsingh): Enable render nodes on udl/evdi. */
-       int fd;
-       char const *name = "%s/renderD%d";
-       int32_t num_nodes = 63;
-       int32_t min_node = 128;
-       int32_t max_node = (min_node + num_nodes);
-
-       for (int i = min_node; i < max_node; i++) {
-               char *node;
-
-               if (asprintf(&node, name, DRM_DIR_NAME, i) < 0)
-                       continue;
+       auto hnd = reinterpret_cast<cros_gralloc_handle_t>(handle);
+       if (!hnd || hnd->magic != cros_gralloc_magic)
+               return nullptr;
 
-               fd = open(node, O_RDWR, 0);
-               free(node);
+       return hnd;
+}
 
-               if (fd < 0)
-                       continue;
+int32_t cros_gralloc_sync_wait(int32_t acquire_fence)
+{
+       if (acquire_fence < 0)
+               return 0;
 
-               *drv = drv_create(fd);
+       /*
+        * Wait initially for 1000 ms, and then wait indefinitely. The SYNC_IOC_WAIT
+        * documentation states the caller waits indefinitely on the fence if timeout < 0.
+        */
+       int err = sync_wait(acquire_fence, 1000);
+       if (err < 0) {
+               cros_gralloc_error("Timed out on sync wait, err = %s", strerror(errno));
+               err = sync_wait(acquire_fence, -1);
+               if (err < 0) {
+                       cros_gralloc_error("sync wait error = %s", strerror(errno));
+                       return -errno;
+               }
+       }
 
-               if (*drv)
-                       return CROS_GRALLOC_ERROR_NONE;
+       err = close(acquire_fence);
+       if (err) {
+               cros_gralloc_error("Unable to close fence fd, err = %s", strerror(errno));
+               return -errno;
        }
 
-       return CROS_GRALLOC_ERROR_NO_RESOURCES;
+       return 0;
 }
 
-int32_t cros_gralloc_validate_handle(struct cros_gralloc_handle *hnd)
+void cros_gralloc_log(const char *prefix, const char *file, int line, const char *format, ...)
 {
-       if (!hnd || hnd->magic != cros_gralloc_magic())
-               return CROS_GRALLOC_ERROR_BAD_HANDLE;
-
-       return CROS_GRALLOC_ERROR_NONE;
-}
+       char buf[50];
+       snprintf(buf, sizeof(buf), "[%s:%s(%d)]", prefix, basename(file), line);
 
-void cros_gralloc_log(const char *prefix, const char *file, int line,
-                     const char *format, ...)
-{
        va_list args;
        va_start(args, format);
-       ALOGE("%s - [%s(%d)]", prefix, basename(file), line);
-       __android_log_vprint(ANDROID_LOG_ERROR, prefix, format, args);
+       __android_log_vprint(ANDROID_LOG_ERROR, buf, format, args);
        va_end(args);
 }