summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gralloc/framebuffer.cpp78
1 files changed, 46 insertions, 32 deletions
diff --git a/gralloc/framebuffer.cpp b/gralloc/framebuffer.cpp
index 1fc133e..dcdf335 100644
--- a/gralloc/framebuffer.cpp
+++ b/gralloc/framebuffer.cpp
@@ -52,7 +52,11 @@ inline size_t roundUpToPageSize(size_t x) {
// numbers of buffers for page flipping
#define NUM_BUFFERS 2
-#define HWC_EXIST 1
+
+// Can we use the HWC for page flipping?
+// Most modern devices should be able to use this and you will face
+// performance degradation without it.
+static bool page_flip_allowed = true;
struct hwc_callback_entry
{
@@ -68,6 +72,28 @@ struct fb_context_t {
/*****************************************************************************/
+/*
+ * Copy buffer to the front if page flip is not available/allowed because of
+ * size constraints.
+ */
+inline void memcpy_buffer(private_module_t* m, buffer_handle_t &buffer) {
+ void* fb_vaddr;
+ void* buffer_vaddr;
+
+ m->base.lock(&m->base, m->framebuffer, GRALLOC_USAGE_SW_WRITE_RARELY,
+ 0, 0, m->info.xres, m->info.yres, &fb_vaddr);
+
+ m->base.lock(&m->base, buffer, GRALLOC_USAGE_SW_READ_RARELY,
+ 0, 0, m->info.xres, m->info.yres, &buffer_vaddr);
+
+ // Do a direct copy.
+ // TODO: Implement a copybit HAL for this
+ memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres);
+ m->base.unlock(&m->base, buffer);
+ m->base.unlock(&m->base, m->framebuffer);
+}
+
+/*****************************************************************************/
/*
* Keep track of the vsync state to avoid making excessive ioctl calls.
@@ -107,39 +133,27 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(buffer);
private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-#if HWC_EXIST
- hwc_callback_queue_t *queue = reinterpret_cast<hwc_callback_queue_t *>(m->queue);
- pthread_mutex_lock(&m->queue_lock);
- if(queue->isEmpty())
- pthread_mutex_unlock(&m->queue_lock);
- else {
- private_handle_t *hnd = private_handle_t::dynamicCast(buffer);
- struct hwc_callback_entry entry = queue->top();
- queue->pop();
- pthread_mutex_unlock(&m->queue_lock);
- entry.callback(entry.data, hnd);
- }
-#else
- // If we can't do the page_flip, just copy the buffer to the front
- // FIXME: use copybit HAL instead of memcpy
- void* fb_vaddr;
- void* buffer_vaddr;
-
- m->base.lock(&m->base, m->framebuffer,
- GRALLOC_USAGE_SW_WRITE_RARELY,
- 0, 0, m->info.xres, m->info.yres,
- &fb_vaddr);
- m->base.lock(&m->base, buffer,
- GRALLOC_USAGE_SW_READ_RARELY,
- 0, 0, m->info.xres, m->info.yres,
- &buffer_vaddr);
-
- memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres);
+ ALOGW("%s: page flipping %s", page_flip_allowed ? " allowed" : " not allowed");
+
+ if (page_flip_allowed) {
+ hwc_callback_queue_t *queue = reinterpret_cast<hwc_callback_queue_t *>(m->queue);
+ pthread_mutex_lock(&m->queue_lock);
+ if(queue->isEmpty())
+ pthread_mutex_unlock(&m->queue_lock);
+ else {
+ private_handle_t *hnd = private_handle_t::dynamicCast(buffer);
+ struct hwc_callback_entry entry = queue->top();
+ queue->pop();
+ pthread_mutex_unlock(&m->queue_lock);
+ entry.callback(entry.data, hnd);
+ }
+ } else {
+ // If we can't do the page_flip, just copy the buffer to the front
+ // FIXME: use copybit HAL instead of memcpy
+ memcpy_buffer(m, buffer);
+ }
- m->base.unlock(&m->base, buffer);
- m->base.unlock(&m->base, m->framebuffer);
-#endif
return 0;
}