diff options
author | Vinil Cheeramvelil <vinil.cheeramvelil@intel.com> | 2014-09-09 08:23:45 +0800 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2015-06-12 14:56:13 -0700 |
commit | 2046ea17ddb468c845f542a88761a03b04898fd7 (patch) | |
tree | cf45956cf7227171951e854230e466daec7c7d9d | |
parent | 94ef7ebe0b0f58b76bf652ce74d09673c8918936 (diff) | |
download | psb_video-2046ea17ddb468c845f542a88761a03b04898fd7.tar.gz |
ION support in psb_video
when ion is enabled as backend of gralloc.
video driver needs to pass down fd of graphics buffer
when creat surface from it.
Orig-Author: Randy Xu <randy.xu@intel.com>
Bug: 18731042
BZ: 230505
Change-Id: Ic85a04e1b2766764fb85ff98503022fb7be6b54f
Signed-off-by: mahongpe <hongpeng.ma@intel.com>
-rw-r--r-- | src/android/psb_gralloc.cpp | 9 | ||||
-rw-r--r-- | src/android/psb_gralloc.h | 3 | ||||
-rw-r--r-- | src/android/psb_surface_gralloc.c | 6 | ||||
-rw-r--r-- | src/psb_buffer.c | 12 | ||||
-rw-r--r-- | src/psb_buffer.h | 4 | ||||
-rw-r--r-- | src/psb_surface_attrib.c | 11 | ||||
-rw-r--r-- | src/psb_surface_attrib.h | 1 |
7 files changed, 33 insertions, 13 deletions
diff --git a/src/android/psb_gralloc.cpp b/src/android/psb_gralloc.cpp index e231a62..a6a934b 100644 --- a/src/android/psb_gralloc.cpp +++ b/src/android/psb_gralloc.cpp @@ -37,6 +37,10 @@ #ifdef BAYTRAIL #include <ufo/gralloc.h> #endif +#ifndef BAYTRAIL +#include <hal/hal_public.h> +#endif + using namespace android; #ifdef LOG_TAG @@ -161,3 +165,8 @@ int gralloc_getdisplaystatus(buffer_handle_t handle, int* status) return err; } + +int gralloc_getbuffd(buffer_handle_t handle) +{ + return ((IMG_native_handle_t*)handle)->fd[0]; +} diff --git a/src/android/psb_gralloc.h b/src/android/psb_gralloc.h index 1d0e550..461070d 100644 --- a/src/android/psb_gralloc.h +++ b/src/android/psb_gralloc.h @@ -44,6 +44,9 @@ int gralloc_unlock(buffer_handle_t handle); int gralloc_init(void); int gralloc_getdisplaystatus(buffer_handle_t handle, int* status); + +int gralloc_getbuffd(buffer_handle_t handle); + #ifdef __cplusplus } #endif diff --git a/src/android/psb_surface_gralloc.c b/src/android/psb_surface_gralloc.c index fcd4b47..1fc7013 100644 --- a/src/android/psb_surface_gralloc.c +++ b/src/android/psb_surface_gralloc.c @@ -200,9 +200,10 @@ VAStatus psb_CreateSurfacesFromGralloc( vaStatus = VA_STATUS_ERROR_UNKNOWN; } else { int cache_flag = PSB_USER_BUFFER_UNCACHED; + int buf_fd = gralloc_getbuffd(handle); vaStatus = psb_surface_create_from_ub(driver_data, width, height, fourcc, - external_buffers, psb_surface, vaddr, + external_buffers, psb_surface, vaddr, buf_fd, cache_flag); psb_surface->buf.handle = handle; @@ -367,12 +368,13 @@ VAStatus psb_CreateSurfacesFromGralloc( vaStatus = VA_STATUS_ERROR_UNKNOWN; } else { int cache_flag = PSB_USER_BUFFER_UNCACHED; + int buf_fd = gralloc_getbuffd((buffer_handle_t)handle); #ifdef PSBVIDEO_MRFL //cache_flag = 0; #endif vaStatus = psb_surface_create_from_ub(driver_data, width, height, fourcc, (VASurfaceAttributeTPI *)external_buffers, psb_surface, - vaddr[GRALLOC_SUB_BUFFER0], cache_flag); + vaddr[GRALLOC_SUB_BUFFER0], buf_fd, cache_flag); psb_surface->buf.handle = (void *)handle; obj_surface->share_info = NULL; diff --git a/src/psb_buffer.c b/src/psb_buffer.c index 38ba4ef..64ef263 100644 --- a/src/psb_buffer.c +++ b/src/psb_buffer.c @@ -206,6 +206,7 @@ VAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, psb_buffer_type_t type, psb_buffer_p buf, void * vaddr, + int fd, unsigned int flags ) { @@ -221,6 +222,7 @@ VAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, buf->type = type; buf->driver_data = driver_data; /* only for RAR buffers */ buf->user_ptr = vaddr; + buf->fd = fd; /* Xvideo will share surface buffer, set SHARED flag */ @@ -259,16 +261,16 @@ VAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, } /* here use the placement when gen buffer setted */ - drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size); + drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d, fd = %d\n", vaddr, size, fd); - ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr); + ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr, fd); if (ret) { - drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers, buf->drm_buf is 0x%x, size is %d, vaddr is 0x%x\n", buf->drm_buf, size, vaddr); + drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers, buf->drm_buf is 0x%x, size is %d, vaddr is 0x%x, fd=%d\n", buf->drm_buf, size, vaddr, fd); return 1; } - drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n", - vaddr, size, wsbmBOOffsetHint(buf->drm_buf)); + drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte), fd=%d, BO GPU offset hint=0x%08x\n", + vaddr, size, fd, wsbmBOOffsetHint(buf->drm_buf)); buf->pl_flags = placement; buf->status = psb_bs_ready; diff --git a/src/psb_buffer.h b/src/psb_buffer.h index ad05068..b4aeb3f 100644 --- a/src/psb_buffer.h +++ b/src/psb_buffer.h @@ -77,10 +77,11 @@ struct psb_buffer_s { unsigned int buffer_ofs; /* several buffers may share one BO (camera/RAR), and use offset to distinguish it */ struct psb_buffer_s *next; unsigned char *user_ptr; /* user pointer for user buffers */ + int fd; /* fd of user buffers if it is from GFX; else it is -1*/ psb_driver_data_p driver_data; /* for RAR buffer release */ uint32_t size; void *handle; - unsigned char *virtual_addr; + unsigned char *virtual_addr; int unfence_flag; }; @@ -103,6 +104,7 @@ VAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, psb_buffer_type_t type, psb_buffer_p buf, void * vaddr, + int fd, unsigned int flags ); diff --git a/src/psb_surface_attrib.c b/src/psb_surface_attrib.c index 6b83ab4..9f7c316 100644 --- a/src/psb_surface_attrib.c +++ b/src/psb_surface_attrib.c @@ -56,6 +56,7 @@ VAStatus psb_surface_create_from_ub( VASurfaceAttributeTPI *graphic_buffers, psb_surface_p psb_surface, /* out */ void *vaddr, + int fd, unsigned flags ) { @@ -121,12 +122,12 @@ VAStatus psb_surface_create_from_ub( if (graphic_buffers->tiling) ret = psb_buffer_create_from_ub(driver_data, psb_surface->size, psb_bt_mmu_tiling, &psb_surface->buf, - vaddr, 0); + vaddr, fd, 0); else #endif ret = psb_buffer_create_from_ub(driver_data, psb_surface->size, psb_bt_surface, &psb_surface->buf, - vaddr, flags); + vaddr, fd, flags); return ret ? VA_STATUS_ERROR_ALLOCATION_FAILED : VA_STATUS_SUCCESS; } @@ -606,10 +607,10 @@ VAStatus psb_CreateSurfaceFromUserspace( if (attribute_tpi->type == VAExternalMemoryNoneCacheUserPointer) vaStatus = psb_surface_create_from_ub(driver_data, width, height, fourcc, - attribute_tpi, psb_surface, vaddr, PSB_USER_BUFFER_UNCACHED); + attribute_tpi, psb_surface, vaddr, -1, PSB_USER_BUFFER_UNCACHED); else vaStatus = psb_surface_create_from_ub(driver_data, width, height, fourcc, - attribute_tpi, psb_surface, vaddr, 0); + attribute_tpi, psb_surface, vaddr, -1, 0); obj_surface->psb_surface = psb_surface; if (VA_STATUS_SUCCESS != vaStatus) { @@ -727,7 +728,7 @@ VAStatus psb_CreateSurfaceFromION( } vaStatus = psb_surface_create_from_ub(driver_data, width, height, fourcc, - attribute_tpi, psb_surface, vaddr, 0); + attribute_tpi, psb_surface, vaddr, ion_source_share.fd, 0); obj_surface->psb_surface = psb_surface; if (VA_STATUS_SUCCESS != vaStatus) { diff --git a/src/psb_surface_attrib.h b/src/psb_surface_attrib.h index 9b1dee5..220d471 100644 --- a/src/psb_surface_attrib.h +++ b/src/psb_surface_attrib.h @@ -39,6 +39,7 @@ VAStatus psb_surface_create_from_ub( int width, int height, int fourcc, VASurfaceAttributeTPI *graphic_buffers, psb_surface_p psb_surface, /* out */ void *vaddr, + int fd, unsigned int flags ); |