diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2021-10-26 18:55:55 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-10-26 18:55:55 +0000 |
commit | f93420adc43d2dfad5716a4f90546174ec859222 (patch) | |
tree | 7c3a043eea20aa0355d1fe3c86911eac8c32a15d | |
parent | fd45d3616c6c206dd470e9d3a5621253c7a33d34 (diff) | |
parent | a13250dce16f141f101f27d0bdc6b38939e5784d (diff) | |
download | dragonboard-f93420adc43d2dfad5716a4f90546174ec859222.tar.gz |
Merge "db845c: Remove gralloc_gbm implmentation" am: 7e4a1f660b am: a13250dce1
Original change: https://android-review.googlesource.com/c/device/linaro/dragonboard/+/1772065
Change-Id: Ic3cf094b20c28da350f84b604689445722a7742e
-rw-r--r-- | gralloc/Android.mk | 61 | ||||
-rw-r--r-- | gralloc/gralloc.cpp | 273 | ||||
-rw-r--r-- | gralloc/gralloc_drm.h | 42 | ||||
-rw-r--r-- | gralloc/gralloc_gbm.cpp | 531 | ||||
-rw-r--r-- | gralloc/gralloc_gbm_priv.h | 57 |
5 files changed, 0 insertions, 964 deletions
diff --git a/gralloc/Android.mk b/gralloc/Android.mk deleted file mode 100644 index e517e3d..0000000 --- a/gralloc/Android.mk +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) 2016 Linaro, Ltd., Rob Herring <robh@kernel.org> -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - gralloc_gbm.cpp \ - gralloc.cpp - -LOCAL_SHARED_LIBRARIES := \ - libdrm \ - libgbm_mesa \ - liblog \ - libcutils - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH) - -LOCAL_C_INCLUDES += system/core/include hardware/libhardware/include -LOCAL_C_INCLUDES += system/core/libsystem/include system/core - -LOCAL_MODULE := gralloc.gbm -LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_PROPRIETARY_MODULE := true - -include $(BUILD_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH) - -LOCAL_MODULE := libgralloc_drm -LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_MODULE_TAGS := optional -LOCAL_PROPRIETARY_MODULE := true - -include $(BUILD_SHARED_LIBRARY) diff --git a/gralloc/gralloc.cpp b/gralloc/gralloc.cpp deleted file mode 100644 index 1cc9f55..0000000 --- a/gralloc/gralloc.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (C) 2010-2011 Chia-I Wu <olvaffe@gmail.com> - * Copyright (C) 2010-2011 LunarG Inc. - * Copyright (C) 2016 Linaro, Ltd., Rob Herring <robh@kernel.org> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#define LOG_TAG "GRALLOC-GBM" - -#include <log/log.h> -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <pthread.h> -#include <errno.h> - -#include <hardware/gralloc.h> -#include <system/graphics.h> - -#include <gbm.h> - -#include "gralloc_drm.h" -#include "gralloc_gbm_priv.h" - -struct gbm_module_t { - gralloc_module_t base; - - pthread_mutex_t mutex; - struct gbm_device *gbm; -}; - -/* - * Initialize the DRM device object - */ -static int gbm_init(struct gbm_module_t *dmod) -{ - int err = 0; - - pthread_mutex_lock(&dmod->mutex); - if (!dmod->gbm) { - dmod->gbm = gbm_dev_create(); - if (!dmod->gbm) - err = -EINVAL; - } - pthread_mutex_unlock(&dmod->mutex); - - return err; -} - -static int gbm_mod_perform(const struct gralloc_module_t *mod, int op, ...) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - va_list args; - int err; - uint32_t uop = static_cast<uint32_t>(op); - - err = gbm_init(dmod); - if (err) - return err; - - va_start(args, op); - switch (uop) { - case GRALLOC_MODULE_PERFORM_GET_DRM_FD: - { - int *fd = va_arg(args, int *); - *fd = gbm_device_get_fd(dmod->gbm); - err = 0; - } - break; - default: - err = -EINVAL; - break; - } - va_end(args); - - return err; -} - -static int gbm_mod_register_buffer(const gralloc_module_t *mod, - buffer_handle_t handle) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - err = gbm_init(dmod); - if (err) - return err; - - pthread_mutex_lock(&dmod->mutex); - err = gralloc_gbm_handle_register(handle, dmod->gbm); - pthread_mutex_unlock(&dmod->mutex); - - return err; -} - -static int gbm_mod_unregister_buffer(const gralloc_module_t *mod, - buffer_handle_t handle) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - pthread_mutex_lock(&dmod->mutex); - err = gralloc_gbm_handle_unregister(handle); - pthread_mutex_unlock(&dmod->mutex); - - return err; -} - -static int gbm_mod_lock(const gralloc_module_t *mod, buffer_handle_t handle, - int usage, int x, int y, int w, int h, void **ptr) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - pthread_mutex_lock(&dmod->mutex); - - err = gralloc_gbm_bo_lock(handle, usage, x, y, w, h, ptr); - ALOGV("buffer %p lock usage = %08x", handle, usage); - - pthread_mutex_unlock(&dmod->mutex); - return err; -} - -static int gbm_mod_unlock(const gralloc_module_t *mod, buffer_handle_t handle) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - pthread_mutex_lock(&dmod->mutex); - err = gralloc_gbm_bo_unlock(handle); - pthread_mutex_unlock(&dmod->mutex); - - return err; -} - -static int gbm_mod_lock_ycbcr(gralloc_module_t const *mod, buffer_handle_t handle, - int usage, int x, int y, int w, int h, struct android_ycbcr *ycbcr) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - pthread_mutex_lock(&dmod->mutex); - err = gralloc_gbm_bo_lock_ycbcr(handle, usage, x, y, w, h, ycbcr); - pthread_mutex_unlock(&dmod->mutex); - - return err; -} - -static int gbm_mod_close_gpu0(struct hw_device_t *dev) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *)dev->module; - struct alloc_device_t *alloc = (struct alloc_device_t *) dev; - - gbm_dev_destroy(dmod->gbm); - delete alloc; - - return 0; -} - -static int gbm_mod_free_gpu0(alloc_device_t *dev, buffer_handle_t handle) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) dev->common.module; - - pthread_mutex_lock(&dmod->mutex); - gbm_free(handle); - native_handle_close(handle); - delete handle; - - pthread_mutex_unlock(&dmod->mutex); - return 0; -} - -static int gbm_mod_alloc_gpu0(alloc_device_t *dev, - int w, int h, int format, int usage, - buffer_handle_t *handle, int *stride) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) dev->common.module; - int err = 0; - - pthread_mutex_lock(&dmod->mutex); - - *handle = gralloc_gbm_bo_create(dmod->gbm, w, h, format, usage, stride); - if (!*handle) - err = -errno; - - ALOGV("buffer %p usage = %08x", *handle, usage); - pthread_mutex_unlock(&dmod->mutex); - return err; -} - -static int gbm_mod_open_gpu0(struct gbm_module_t *dmod, hw_device_t **dev) -{ - struct alloc_device_t *alloc; - int err; - - err = gbm_init(dmod); - if (err) - return err; - - alloc = new alloc_device_t(); - if (!alloc) - return -EINVAL; - - alloc->common.tag = HARDWARE_DEVICE_TAG; - alloc->common.version = 0; - alloc->common.module = &dmod->base.common; - alloc->common.close = gbm_mod_close_gpu0; - - alloc->alloc = gbm_mod_alloc_gpu0; - alloc->free = gbm_mod_free_gpu0; - - *dev = &alloc->common; - - return 0; -} - -static int gbm_mod_open(const struct hw_module_t *mod, - const char *name, struct hw_device_t **dev) -{ - struct gbm_module_t *dmod = (struct gbm_module_t *) mod; - int err; - - if (strcmp(name, GRALLOC_HARDWARE_GPU0) == 0) - err = gbm_mod_open_gpu0(dmod, dev); - else - err = -EINVAL; - - return err; -} - -static struct hw_module_methods_t gbm_mod_methods = { - .open = gbm_mod_open -}; - -struct gbm_module_t HAL_MODULE_INFO_SYM = { - .base = { - .common = { - .tag = HARDWARE_MODULE_TAG, - .version_major = 1, - .version_minor = 0, - .id = GRALLOC_HARDWARE_MODULE_ID, - .name = "GBM Memory Allocator", - .author = "Rob Herring - Linaro", - .methods = &gbm_mod_methods - }, - .registerBuffer = gbm_mod_register_buffer, - .unregisterBuffer = gbm_mod_unregister_buffer, - .lock = gbm_mod_lock, - .unlock = gbm_mod_unlock, - .lock_ycbcr = gbm_mod_lock_ycbcr, - .perform = gbm_mod_perform - }, - - .mutex = PTHREAD_MUTEX_INITIALIZER, - .gbm = NULL, -}; diff --git a/gralloc/gralloc_drm.h b/gralloc/gralloc_drm.h deleted file mode 100644 index 0ece652..0000000 --- a/gralloc/gralloc_drm.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2010-2011 Chia-I Wu <olvaffe@gmail.com> - * Copyright (C) 2010-2011 LunarG Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _GRALLOC_DRM_H_ -#define _GRALLOC_DRM_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - /* perform(const struct gralloc_module_t *mod, - * int op, - * int *fd); - */ - GRALLOC_MODULE_PERFORM_GET_DRM_FD = 0x40000002, -}; - -#ifdef __cplusplus -} -#endif -#endif /* _GRALLOC_DRM_H_ */ diff --git a/gralloc/gralloc_gbm.cpp b/gralloc/gralloc_gbm.cpp deleted file mode 100644 index 29d11cd..0000000 --- a/gralloc/gralloc_gbm.cpp +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2010-2011 Chia-I Wu <olvaffe@gmail.com> - * Copyright (C) 2010-2011 LunarG Inc. - * Copyright (C) 2016 Linaro, Ltd., Rob Herring <robh@kernel.org> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#define LOG_TAG "GRALLOC-GBM" - -#include <log/log.h> -#include <cutils/atomic.h> -#include <cutils/properties.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <assert.h> - -#include <hardware/gralloc.h> -#include <system/graphics.h> - -#include <gbm.h> - -#include "gralloc_gbm_priv.h" -#include <android/gralloc_handle.h> - -#include <unordered_map> - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#define unlikely(x) __builtin_expect(!!(x), 0) - -static std::unordered_map<buffer_handle_t, struct gbm_bo *> gbm_bo_handle_map; - -struct bo_data_t { - void *map_data; - int lock_count; - int locked_for; -}; - -void gralloc_gbm_destroy_user_data(struct gbm_bo *bo, void *data) -{ - struct bo_data_t *bo_data = (struct bo_data_t *)data; - delete bo_data; - - (void)bo; -} - -static struct bo_data_t *gbm_bo_data(struct gbm_bo *bo) { - return (struct bo_data_t *)gbm_bo_get_user_data(bo); -} - - -static uint32_t get_gbm_format(int format) -{ - uint32_t fmt; - - switch (format) { - case HAL_PIXEL_FORMAT_RGBA_8888: - fmt = GBM_FORMAT_ABGR8888; - break; - case HAL_PIXEL_FORMAT_RGBX_8888: - fmt = GBM_FORMAT_XBGR8888; - break; - case HAL_PIXEL_FORMAT_RGB_888: - fmt = GBM_FORMAT_RGB888; - break; - case HAL_PIXEL_FORMAT_RGB_565: - fmt = GBM_FORMAT_RGB565; - break; - case HAL_PIXEL_FORMAT_BGRA_8888: - fmt = GBM_FORMAT_ARGB8888; - break; - case HAL_PIXEL_FORMAT_YV12: - /* YV12 is planar, but must be a single buffer so ask for GR88 */ - fmt = GBM_FORMAT_GR88; - break; - case HAL_PIXEL_FORMAT_YCbCr_422_SP: - case HAL_PIXEL_FORMAT_YCrCb_420_SP: - default: - fmt = 0; - break; - } - - return fmt; -} - -static int gralloc_gbm_get_bpp(int format) -{ - int bpp; - - switch (format) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_RGBX_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - bpp = 4; - break; - case HAL_PIXEL_FORMAT_RGB_888: - bpp = 3; - break; - case HAL_PIXEL_FORMAT_RGB_565: - case HAL_PIXEL_FORMAT_YCbCr_422_I: - bpp = 2; - break; - /* planar; only Y is considered */ - case HAL_PIXEL_FORMAT_YV12: - case HAL_PIXEL_FORMAT_YCbCr_422_SP: - case HAL_PIXEL_FORMAT_YCrCb_420_SP: - bpp = 1; - break; - default: - bpp = 0; - break; - } - - return bpp; -} - -static unsigned int get_pipe_bind(int usage) -{ - unsigned int bind = 0; - - if (usage & (GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)) - bind |= GBM_BO_USE_LINEAR; - if (usage & GRALLOC_USAGE_CURSOR) - ;//bind |= GBM_BO_USE_CURSOR; - if (usage & (GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE)) - bind |= GBM_BO_USE_RENDERING; - if (usage & GRALLOC_USAGE_HW_FB) - bind |= GBM_BO_USE_SCANOUT; - if (usage & GRALLOC_USAGE_HW_COMPOSER) - bind |= GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; - - return bind; -} - -static struct gbm_bo *gbm_import(struct gbm_device *gbm, - buffer_handle_t _handle) -{ - struct gbm_bo *bo; - struct gralloc_handle_t *handle = gralloc_handle(_handle); - #ifdef GBM_BO_IMPORT_FD_MODIFIER - struct gbm_import_fd_modifier_data data; - #else - struct gbm_import_fd_data data; - #endif - - int format = get_gbm_format(handle->format); - if (handle->prime_fd < 0) - return NULL; - - memset(&data, 0, sizeof(data)); - data.width = handle->width; - data.height = handle->height; - data.format = format; - /* Adjust the width and height for a GBM GR88 buffer */ - if (handle->format == HAL_PIXEL_FORMAT_YV12) { - data.width /= 2; - data.height += handle->height / 2; - } - - #ifdef GBM_BO_IMPORT_FD_MODIFIER - data.num_fds = 1; - data.fds[0] = handle->prime_fd; - data.strides[0] = handle->stride; - data.modifier = handle->modifier; - bo = gbm_bo_import(gbm, GBM_BO_IMPORT_FD_MODIFIER, &data, 0); - #else - data.fd = handle->prime_fd; - data.stride = handle->stride; - bo = gbm_bo_import(gbm, GBM_BO_IMPORT_FD, &data, 0); - #endif - - return bo; -} - -static struct gbm_bo *gbm_alloc(struct gbm_device *gbm, - buffer_handle_t _handle) -{ - struct gbm_bo *bo; - struct gralloc_handle_t *handle = gralloc_handle(_handle); - int format = get_gbm_format(handle->format); - int usage = get_pipe_bind(handle->usage); - int width, height; - - width = handle->width; - height = handle->height; - if (usage & GBM_BO_USE_CURSOR) { - if (handle->width < 64) - width = 64; - if (handle->height < 64) - height = 64; - } - - /* - * For YV12, we request GR88, so halve the width since we're getting - * 16bpp. Then increase the height by 1.5 for the U and V planes. - */ - if (handle->format == HAL_PIXEL_FORMAT_YV12) { - width /= 2; - height += handle->height / 2; - } - - ALOGV("create BO, size=%dx%d, fmt=%d, usage=%x", - handle->width, handle->height, handle->format, usage); - bo = gbm_bo_create(gbm, width, height, format, usage); - if (!bo) { - ALOGE("failed to create BO, size=%dx%d, fmt=%d, usage=%x", - handle->width, handle->height, handle->format, usage); - return NULL; - } - - handle->prime_fd = gbm_bo_get_fd(bo); - handle->stride = gbm_bo_get_stride(bo); - #ifdef GBM_BO_IMPORT_FD_MODIFIER - handle->modifier = gbm_bo_get_modifier(bo); - #endif - - return bo; -} - -void gbm_free(buffer_handle_t handle) -{ - struct gbm_bo *bo = gralloc_gbm_bo_from_handle(handle); - - if (!bo) - return; - - gbm_bo_handle_map.erase(handle); - gbm_bo_destroy(bo); -} - -/* - * Return the bo of a registered handle. - */ -struct gbm_bo *gralloc_gbm_bo_from_handle(buffer_handle_t handle) -{ - return gbm_bo_handle_map[handle]; -} - -static int gbm_map(buffer_handle_t handle, int x, int y, int w, int h, - int enable_write, void **addr) -{ - int err = 0; - int flags = GBM_BO_TRANSFER_READ; - struct gralloc_gbm_handle_t *gbm_handle = gralloc_handle(handle); - struct gbm_bo *bo = gralloc_gbm_bo_from_handle(handle); - struct bo_data_t *bo_data = gbm_bo_data(bo); - uint32_t stride; - - if (bo_data->map_data) - return -EINVAL; - - if (gbm_handle->format == HAL_PIXEL_FORMAT_YV12) { - if (x || y) - ALOGE("can't map with offset for planar %p", bo); - w /= 2; - h += h / 2; - } - - if (enable_write) - flags |= GBM_BO_TRANSFER_WRITE; - - *addr = gbm_bo_map(bo, 0, 0, x + w, y + h, flags, &stride, &bo_data->map_data); - ALOGV("mapped bo %p (%d, %d)-(%d, %d) at %p", bo, x, y, w, h, *addr); - if (*addr == NULL) - return -ENOMEM; - - assert(stride == gbm_bo_get_stride(bo)); - - return err; -} - -static void gbm_unmap(struct gbm_bo *bo) -{ - struct bo_data_t *bo_data = gbm_bo_data(bo); - - gbm_bo_unmap(bo, bo_data->map_data); - bo_data->map_data = NULL; -} - -void gbm_dev_destroy(struct gbm_device *gbm) -{ - int fd = gbm_device_get_fd(gbm); - - gbm_device_destroy(gbm); - close(fd); -} - -struct gbm_device *gbm_dev_create(void) -{ - struct gbm_device *gbm; - char path[PROPERTY_VALUE_MAX]; - int fd; - - property_get("gralloc.gbm.device", path, "/dev/dri/renderD128"); - fd = open(path, O_RDWR | O_CLOEXEC); - if (fd < 0) { - ALOGE("failed to open %s", path); - return NULL; - } - - gbm = gbm_create_device(fd); - if (!gbm) { - ALOGE("failed to create gbm device"); - close(fd); - } - - return gbm; -} - -/* - * Register a buffer handle. - */ -int gralloc_gbm_handle_register(buffer_handle_t _handle, struct gbm_device *gbm) -{ - struct gbm_bo *bo; - - if (!_handle) - return -EINVAL; - - if (gbm_bo_handle_map.count(_handle)) - return -EINVAL; - - bo = gbm_import(gbm, _handle); - if (!bo) - return -EINVAL; - - gbm_bo_handle_map.emplace(_handle, bo); - - return 0; -} - -/* - * Unregister a buffer handle. It is no-op for handles created locally. - */ -int gralloc_gbm_handle_unregister(buffer_handle_t handle) -{ - gbm_free(handle); - - return 0; -} - -/* - * Create a bo. - */ -buffer_handle_t gralloc_gbm_bo_create(struct gbm_device *gbm, - int width, int height, int format, int usage, int *stride) -{ - struct gbm_bo *bo; - native_handle_t *handle; - - handle = gralloc_handle_create(width, height, format, usage); - if (!handle) - return NULL; - - bo = gbm_alloc(gbm, handle); - if (!bo) { - native_handle_delete(handle); - return NULL; - } - - gbm_bo_handle_map.emplace(handle, bo); - - /* in pixels */ - *stride = gralloc_handle(handle)->stride / gralloc_gbm_get_bpp(format); - - return handle; -} - -/* - * Lock a bo. XXX thread-safety? - */ -int gralloc_gbm_bo_lock(buffer_handle_t handle, - int usage, int x, int y, int w, int h, - void **addr) -{ - struct gralloc_handle_t *gbm_handle = gralloc_handle(handle); - struct gbm_bo *bo = gralloc_gbm_bo_from_handle(handle); - struct bo_data_t *bo_data; - - if (!bo) - return -EINVAL; - - if ((gbm_handle->usage & usage) != (uint32_t)usage) { - /* make FB special for testing software renderer with */ - - if (!(gbm_handle->usage & GRALLOC_USAGE_SW_READ_OFTEN) && - !(gbm_handle->usage & GRALLOC_USAGE_HW_FB) && - !(gbm_handle->usage & GRALLOC_USAGE_HW_TEXTURE)) { - ALOGE("bo.usage:x%X/usage:x%X is not GRALLOC_USAGE_HW_FB or GRALLOC_USAGE_HW_TEXTURE", - gbm_handle->usage, usage); - return -EINVAL; - } - } - - bo_data = gbm_bo_data(bo); - if (!bo_data) { - bo_data = new struct bo_data_t(); - gbm_bo_set_user_data(bo, bo_data, gralloc_gbm_destroy_user_data); - } - - ALOGV("lock bo %p, cnt=%d, usage=%x", bo, bo_data->lock_count, usage); - - /* allow multiple locks with compatible usages */ - if (bo_data->lock_count && (bo_data->locked_for & usage) != usage) - return -EINVAL; - - usage |= bo_data->locked_for; - - /* - * Some users will lock with an null crop rect. - * Interpret this as no-crop (full buffer WxH). - */ - if (w == 0 && h == 0) { - w = gbm_handle->width; - h = gbm_handle->height; - } - - if (usage & (GRALLOC_USAGE_SW_WRITE_MASK | - GRALLOC_USAGE_SW_READ_MASK)) { - /* the driver is supposed to wait for the bo */ - int write = !!(usage & GRALLOC_USAGE_SW_WRITE_MASK); - int err = gbm_map(handle, x, y, w, h, write, addr); - if (err) - return err; - } - else { - /* kernel handles the synchronization here */ - } - - bo_data->lock_count++; - bo_data->locked_for |= usage; - - return 0; -} - -/* - * Unlock a bo. - */ -int gralloc_gbm_bo_unlock(buffer_handle_t handle) -{ - struct gbm_bo *bo = gralloc_gbm_bo_from_handle(handle); - struct bo_data_t *bo_data; - if (!bo) - return -EINVAL; - - bo_data = gbm_bo_data(bo); - - int mapped = bo_data->locked_for & - (GRALLOC_USAGE_SW_WRITE_MASK | GRALLOC_USAGE_SW_READ_MASK); - - if (!bo_data->lock_count) - return 0; - - if (mapped) - gbm_unmap(bo); - - bo_data->lock_count--; - if (!bo_data->lock_count) - bo_data->locked_for = 0; - - return 0; -} - -#define GRALLOC_ALIGN(value, base) (((value) + ((base)-1)) & ~((base)-1)) - -int gralloc_gbm_bo_lock_ycbcr(buffer_handle_t handle, - int usage, int x, int y, int w, int h, - struct android_ycbcr *ycbcr) -{ - struct gralloc_handle_t *hnd = gralloc_handle(handle); - int ystride, cstride; - void *addr = 0; - int err; - - ALOGV("handle %p, hnd %p, usage 0x%x", handle, hnd, usage); - - err = gralloc_gbm_bo_lock(handle, usage, x, y, w, h, &addr); - if (err) - return err; - - memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved)); - - switch (hnd->format) { - case HAL_PIXEL_FORMAT_YCrCb_420_SP: - ystride = cstride = GRALLOC_ALIGN(hnd->width, 16); - ycbcr->y = addr; - ycbcr->cr = (unsigned char *)addr + ystride * hnd->height; - ycbcr->cb = (unsigned char *)addr + ystride * hnd->height + 1; - ycbcr->ystride = ystride; - ycbcr->cstride = cstride; - ycbcr->chroma_step = 2; - break; - case HAL_PIXEL_FORMAT_YV12: - ystride = hnd->width; - cstride = GRALLOC_ALIGN(ystride / 2, 16); - ycbcr->y = addr; - ycbcr->cr = (unsigned char *)addr + ystride * hnd->height; - ycbcr->cb = (unsigned char *)addr + ystride * hnd->height + cstride * hnd->height / 2; - ycbcr->ystride = ystride; - ycbcr->cstride = cstride; - ycbcr->chroma_step = 1; - break; - default: - ALOGE("Can not lock buffer, invalid format: 0x%x", hnd->format); - return -EINVAL; - } - - return 0; -} diff --git a/gralloc/gralloc_gbm_priv.h b/gralloc/gralloc_gbm_priv.h deleted file mode 100644 index cbe9256..0000000 --- a/gralloc/gralloc_gbm_priv.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2010-2011 Chia-I Wu <olvaffe@gmail.com> - * Copyright (C) 2010-2011 LunarG Inc. - * Copyright (C) 2016 Linaro, Ltd., Rob Herring <robh@kernel.org> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _GRALLOC_GBM_PRIV_H_ -#define _GRALLOC_GBM_PRIV_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -struct gbm_device; -struct gbm_bo; - -int gralloc_gbm_handle_register(buffer_handle_t handle, struct gbm_device *gbm); -int gralloc_gbm_handle_unregister(buffer_handle_t handle); - -buffer_handle_t gralloc_gbm_bo_create(struct gbm_device *gbm, - int width, int height, int format, int usage, int *stride); -void gbm_free(buffer_handle_t handle); - -struct gbm_bo *gralloc_gbm_bo_from_handle(buffer_handle_t handle); -buffer_handle_t gralloc_gbm_bo_get_handle(struct gbm_bo *bo); -int gralloc_gbm_get_gem_handle(buffer_handle_t handle); - -int gralloc_gbm_bo_lock(buffer_handle_t handle, int usage, int x, int y, int w, int h, void **addr); -int gralloc_gbm_bo_unlock(buffer_handle_t handle); -int gralloc_gbm_bo_lock_ycbcr(buffer_handle_t handle, int usage, - int x, int y, int w, int h, struct android_ycbcr *ycbcr); - -struct gbm_device *gbm_dev_create(void); -void gbm_dev_destroy(struct gbm_device *gbm); - -#ifdef __cplusplus -} -#endif -#endif /* _GRALLOC_GBM_PRIV_H_ */ |