summaryrefslogtreecommitdiffstats
path: root/exynos4
diff options
context:
space:
mode:
authorDominggoes Isakh <drjisakh@gmail.com>2018-12-29 00:22:46 +0100
committerShilin Victor <chrono.monochrome@gmail.com>2019-02-23 16:52:03 +0300
commite822933568474ec583ea05c63d32050bac54a251 (patch)
treeadbfd4c83dc39d2eee7074872c39600024b564d6 /exynos4
parent227cf05df6e632411f03634264ef3d0439f7a267 (diff)
downloadhardware_samsung-e822933568474ec583ea05c63d32050bac54a251.tar.gz
hardware_samsung-e822933568474ec583ea05c63d32050bac54a251.tar.bz2
hardware_samsung-e822933568474ec583ea05c63d32050bac54a251.zip
gralloc: Implement FIFO in partial flush's rect_list
Change-Id: I275f41de4b55065b1644e7dfc11def81bf86eff6
Diffstat (limited to 'exynos4')
-rw-r--r--exynos4/hal/include/gralloc_priv.h1
-rw-r--r--exynos4/hal/libgralloc_ump/alloc_device.cpp44
-rw-r--r--exynos4/hal/libgralloc_ump/gralloc_module.cpp133
3 files changed, 166 insertions, 12 deletions
diff --git a/exynos4/hal/include/gralloc_priv.h b/exynos4/hal/include/gralloc_priv.h
index 8c8df72..a230d03 100644
--- a/exynos4/hal/include/gralloc_priv.h
+++ b/exynos4/hal/include/gralloc_priv.h
@@ -48,6 +48,7 @@
#define GRALLOC_ARM_UMP_MODULE 1
#define debug_level 0
+#define debug_partial_flush 0
static int gMemfd = 0;
diff --git a/exynos4/hal/libgralloc_ump/alloc_device.cpp b/exynos4/hal/libgralloc_ump/alloc_device.cpp
index 78d293d..3ce7aca 100644
--- a/exynos4/hal/libgralloc_ump/alloc_device.cpp
+++ b/exynos4/hal/libgralloc_ump/alloc_device.cpp
@@ -93,6 +93,10 @@ extern struct private_handle_rect *rect_list;
extern private_handle_rect *find_rect(int secure_id);
extern private_handle_rect *find_last_rect(int secure_id);
extern int release_rect(int secure_id);
+extern int count_rect(int secure_id);
+extern void dump_rect();
+extern void insert_rect_first(private_handle_rect *new_rect);
+extern void insert_rect_last(private_handle_rect *new_rect);
#endif
extern int get_bpp(int format);
@@ -337,13 +341,26 @@ static int gralloc_alloc_buffer(alloc_device_t* dev, size_t size, int usage,
#ifdef USE_PARTIAL_FLUSH
if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === BEGIN === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ if (debug_partial_flush > 0)
+ dump_rect();
+
private_handle_rect *psRect;
- private_handle_rect *psFRect;
psRect = (private_handle_rect *)calloc(1, sizeof(private_handle_rect));
psRect->handle = (int)hnd->ump_id;
psRect->stride = stride_raw;
- psFRect = find_last_rect((int)hnd->ump_id);
- psFRect->next = psRect;
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === insert_rect_last === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ insert_rect_last(psRect);
+
+ if (debug_partial_flush > 0)
+ dump_rect();
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === END === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
}
#endif
@@ -363,6 +380,9 @@ static int gralloc_alloc_buffer(alloc_device_t* dev, size_t size, int usage,
ALOGD_IF(debug_level > 0, "%s hnd->format=0x%x hnd->uoffset=%d hnd->voffset=%d hnd->paddr=%x hnd->bpp=%d", __func__, hnd->format, hnd->uoffset, hnd->voffset, hnd->paddr, hnd->bpp);
ALOGD_IF(debug_level > 1, "%s: ump_id:%d", __func__, hnd->ump_id);
+ ALOGD_IF(debug_partial_flush > 0, "%s: PARTIAL_FLUSH ump_id:%d ump_mem_handle:%08x flags=%x usage=%x", __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage);
+
+
/*
if (hnd->flags & private_handle_t::PRIV_FLAGS_GRAPHICBUFFER) {
ALOGD_IF(debug_level > 0, "%s: GraphicBuffer (ump_id:%d): ump_reference_add ump_mem_handle:%08x", __func__, ump_id, ump_mem_handle);
@@ -655,6 +675,7 @@ static int alloc_device_free(alloc_device_t* dev, buffer_handle_t handle)
private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
+ ALOGD_IF(debug_partial_flush > 0, "%s: PARTIAL_FLUSH ump_id:%d ump_mem_handle:%08x flags=%x usage=%x", __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage);
ALOGD_IF(debug_level > 1, "%s: ump_id:%d", __func__, hnd->ump_id);
pthread_mutex_lock(&l_surface);
@@ -674,8 +695,23 @@ static int alloc_device_free(alloc_device_t* dev, buffer_handle_t handle)
ALOGD_IF(debug_level > 0, "%s hnd->ump_mem_handle:%08x hnd->ump_id=%d", __func__, hnd->ump_mem_handle, hnd->ump_id);
#ifdef USE_PARTIAL_FLUSH
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === BEGIN === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ if (debug_partial_flush > 0)
+ dump_rect();
+
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === release_rect === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
if (!release_rect((int)hnd->ump_id))
- ALOGE("%s secure id: 0x%x, release error", __func__, (int)hnd->ump_id);
+ ALOGE("%s: PARTIAL_FLUSH secure id: 0x%d, release error", __func__, (int)hnd->ump_id);
+
+ if (debug_partial_flush > 0)
+ dump_rect();
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === END === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
#endif
ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
diff --git a/exynos4/hal/libgralloc_ump/gralloc_module.cpp b/exynos4/hal/libgralloc_ump/gralloc_module.cpp
index 74a23c4..1761019 100644
--- a/exynos4/hal/libgralloc_ump/gralloc_module.cpp
+++ b/exynos4/hal/libgralloc_ump/gralloc_module.cpp
@@ -97,7 +97,7 @@ int get_bpp(int format)
}
#ifdef USE_PARTIAL_FLUSH
-struct private_handle_rect *rect_list;
+static struct private_handle_rect *rect_list;
static pthread_mutex_t s_rect_lock = PTHREAD_MUTEX_INITIALIZER;
private_handle_rect *find_rect(int secure_id)
@@ -115,12 +115,71 @@ private_handle_rect *find_rect(int secure_id)
return psRect;
}
+void insert_rect_first(private_handle_rect *new_rect) {
+ int secure_id = new_rect->handle;
+ private_handle_rect *psRect = NULL;
+ private_handle_rect *psFRect = NULL;
+
+ ALOGD_IF(debug_level > 0, "%s secure_id=%d",__func__,secure_id);
+
+ pthread_mutex_lock(&s_rect_lock);
+ if (rect_list == NULL) {
+ rect_list = (private_handle_rect *)calloc(1, sizeof(private_handle_rect));
+ rect_list->next = new_rect;
+ } else {
+ for (psRect = rect_list; psRect; psRect = psRect->next) {
+ if (psRect->handle == secure_id) {
+ // Inserts rect before existing
+ psFRect->next = new_rect;
+ new_rect->next = psRect;
+ pthread_mutex_unlock(&s_rect_lock);
+ return;
+ }
+ psFRect = psRect;
+ }
+ // No match found, just append it
+ psFRect->next = new_rect;
+ }
+ pthread_mutex_unlock(&s_rect_lock);
+}
+
+void insert_rect_last(private_handle_rect *new_rect) {
+ int secure_id = new_rect->handle;
+ private_handle_rect *psRect = NULL;
+ private_handle_rect *psFRect = NULL;
+ private_handle_rect *psMatchRect = NULL;
+
+
+ ALOGD_IF(debug_level > 0, "%s secure_id=%d",__func__,secure_id);
+
+ pthread_mutex_lock(&s_rect_lock);
+ if (rect_list == NULL) {
+ rect_list = (private_handle_rect *)calloc(1, sizeof(private_handle_rect));
+ rect_list->next = new_rect;
+ } else {
+ for (psRect = rect_list; psRect; psRect = psRect->next) {
+ if (psRect->handle == secure_id) {
+ psMatchRect = psRect;
+ } else if (psMatchRect) {
+ psMatchRect->next = new_rect;
+ new_rect->next = psRect;
+ pthread_mutex_unlock(&s_rect_lock);
+ return;
+ }
+ psFRect = psRect;
+ }
+ // No match found, just append it
+ psFRect->next = new_rect;
+ }
+ pthread_mutex_unlock(&s_rect_lock);
+}
+
private_handle_rect *find_last_rect(int secure_id)
{
private_handle_rect *psRect = NULL;
private_handle_rect *psFRect = NULL;
- ALOGD_IF(debug_level > 0, "%s secure_id=%d",__func__,secure_id);
+ ALOGD_IF(debug_level > 0, "%s secure_id=%d",__func__, secure_id);
pthread_mutex_lock(&s_rect_lock);
if (rect_list == NULL) {
@@ -137,6 +196,36 @@ private_handle_rect *find_last_rect(int secure_id)
return psFRect;
}
+int count_rect(int secure_id) {
+ private_handle_rect *psRect;
+ private_handle_rect *next;
+
+ int count = 0;
+ pthread_mutex_lock(&s_rect_lock);
+ for (psRect = rect_list; psRect; psRect = psRect->next) {
+ next = psRect->next;
+ if (next && next->handle == secure_id) {
+ count++;
+ }
+ }
+
+ pthread_mutex_unlock(&s_rect_lock);
+ return count;
+}
+
+void dump_rect() {
+ private_handle_rect *psRect;
+ private_handle_rect *next;
+
+ pthread_mutex_lock(&s_rect_lock);
+ for (psRect = rect_list; psRect; psRect = psRect->next) {
+ ALOGD_IF(debug_partial_flush > 0, "%s:PARTIAL_FLUSH handle/ump_id:%d w:%d h:%d stride:%d, psRect:%08x", __func__, psRect->handle, psRect->w, psRect->h, psRect->stride, psRect);
+ next = psRect->next;
+ }
+
+ pthread_mutex_unlock(&s_rect_lock);
+}
+
int release_rect(int secure_id)
{
int rc = 0;
@@ -282,13 +371,24 @@ static int gralloc_register_buffer(gralloc_module_t const* module, buffer_handle
#ifdef USE_PARTIAL_FLUSH
if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === BEGIN === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ if (debug_partial_flush > 0)
+ dump_rect();
private_handle_rect *psRect;
- private_handle_rect *psFRect;
psRect = (private_handle_rect *)calloc(1, sizeof(private_handle_rect));
psRect->handle = (int)hnd->ump_id;
- psRect->stride = (int) (hnd->stride * get_bpp(hnd->format));;
- psFRect = find_last_rect((int)hnd->ump_id);
- psFRect->next = psRect;
+ psRect->stride = (int) (hnd->stride * get_bpp(hnd->format));
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === insert_rect_last === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ insert_rect_last(psRect);
+ if (debug_partial_flush > 0)
+ dump_rect();
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === END === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
}
#endif
@@ -327,6 +427,7 @@ sd
ALOGD_IF(debug_level > 1, "%s: ump_id:%d ump_mem_handle:%08x", __func__, hnd->ump_id, hnd->ump_mem_handle);
hnd->ump_mem_handle = (int)ump_handle_create_from_secure_id(hnd->ump_id);
+ ALOGD_IF(debug_partial_flush > 0, "%s: PARTIAL_FLUSH ump_id:%d ump_mem_handle:%08x flags=%x usage=%x count:%d backing_store:%d", __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
ALOGD_IF(debug_level > 0, "%s PRIV_FLAGS_USES_UMP hnd->ump_mem_handle=%d(%x)", __func__, hnd->ump_mem_handle, hnd->ump_mem_handle);
@@ -424,9 +525,25 @@ static int unregister_buffer(private_handle_t* hnd) {
}
#ifdef USE_PARTIAL_FLUSH
- if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP)
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === BEGIN === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ if (debug_partial_flush > 0)
+ dump_rect();
+
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === release_rect === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
if (!release_rect((int)hnd->ump_id))
- ALOGE("%s secureID: 0x%x, release error", __func__, (int)hnd->ump_id);
+ ALOGE("%s: PARTIAL_FLUSH ump_id:%d, release error", __func__, (int)hnd->ump_id);
+
+ if (debug_partial_flush > 0)
+ dump_rect();
+ ALOGD_IF(debug_partial_flush > 0,
+ "%s: PARTIAL_FLUSH ump_id:%d === END === ump_mem_handle:%08x flags=%x usage=%x count:%d backingstore:%d",
+ __func__, hnd->ump_id, hnd->ump_mem_handle, hnd->flags, hnd->usage, count_rect(hnd->ump_id), hnd->backing_store);
+ }
#endif
ALOGE_IF(hnd->lockState & private_handle_t::LOCK_STATE_READ_MASK,
"%s [unregister] handle %p still locked (state=%08x)", __func__, hnd, hnd->lockState);