aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinil Cheeramvelil <vinil.cheeramvelil@intel.com>2014-09-09 08:23:45 +0800
committerPatrick Tjin <pattjin@google.com>2015-06-12 14:56:13 -0700
commit2046ea17ddb468c845f542a88761a03b04898fd7 (patch)
treecf45956cf7227171951e854230e466daec7c7d9d
parent94ef7ebe0b0f58b76bf652ce74d09673c8918936 (diff)
downloadpsb_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.cpp9
-rw-r--r--src/android/psb_gralloc.h3
-rw-r--r--src/android/psb_surface_gralloc.c6
-rw-r--r--src/psb_buffer.c12
-rw-r--r--src/psb_buffer.h4
-rw-r--r--src/psb_surface_attrib.c11
-rw-r--r--src/psb_surface_attrib.h1
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
);