Merge "Framebuffer: Support variable number of framebuffers in the UI"
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <ui/egl/android_natives.h>
|
#include <ui/egl/android_natives.h>
|
||||||
|
|
||||||
|
#define NUM_FRAME_BUFFERS 2
|
||||||
|
|
||||||
extern "C" EGLNativeWindowType android_createDisplaySurface(void);
|
extern "C" EGLNativeWindowType android_createDisplaySurface(void);
|
||||||
|
|
||||||
@@ -69,7 +70,7 @@ private:
|
|||||||
framebuffer_device_t* fbDev;
|
framebuffer_device_t* fbDev;
|
||||||
alloc_device_t* grDev;
|
alloc_device_t* grDev;
|
||||||
|
|
||||||
sp<NativeBuffer> buffers[2];
|
sp<NativeBuffer> buffers[NUM_FRAME_BUFFERS];
|
||||||
sp<NativeBuffer> front;
|
sp<NativeBuffer> front;
|
||||||
|
|
||||||
mutable Mutex mutex;
|
mutable Mutex mutex;
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ FramebufferNativeWindow::FramebufferNativeWindow()
|
|||||||
if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
|
if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
|
||||||
int stride;
|
int stride;
|
||||||
int err;
|
int err;
|
||||||
|
int i;
|
||||||
err = framebuffer_open(module, &fbDev);
|
err = framebuffer_open(module, &fbDev);
|
||||||
LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err));
|
LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err));
|
||||||
|
|
||||||
@@ -95,27 +96,33 @@ FramebufferNativeWindow::FramebufferNativeWindow()
|
|||||||
mUpdateOnDemand = (fbDev->setUpdateRect != 0);
|
mUpdateOnDemand = (fbDev->setUpdateRect != 0);
|
||||||
|
|
||||||
// initialize the buffer FIFO
|
// initialize the buffer FIFO
|
||||||
mNumBuffers = 2;
|
mNumBuffers = NUM_FRAME_BUFFERS;
|
||||||
mNumFreeBuffers = 2;
|
mNumFreeBuffers = NUM_FRAME_BUFFERS;
|
||||||
mBufferHead = mNumBuffers-1;
|
mBufferHead = mNumBuffers-1;
|
||||||
buffers[0] = new NativeBuffer(
|
|
||||||
fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
|
|
||||||
buffers[1] = new NativeBuffer(
|
|
||||||
fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
|
|
||||||
|
|
||||||
err = grDev->alloc(grDev,
|
for (i = 0; i < mNumBuffers; i++)
|
||||||
fbDev->width, fbDev->height, fbDev->format,
|
{
|
||||||
GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride);
|
buffers[i] = new NativeBuffer(
|
||||||
|
fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
|
||||||
|
}
|
||||||
|
|
||||||
LOGE_IF(err, "fb buffer 0 allocation failed w=%d, h=%d, err=%s",
|
for (i = 0; i < mNumBuffers; i++)
|
||||||
fbDev->width, fbDev->height, strerror(-err));
|
{
|
||||||
|
err = grDev->alloc(grDev,
|
||||||
|
fbDev->width, fbDev->height, fbDev->format,
|
||||||
|
GRALLOC_USAGE_HW_FB, &buffers[i]->handle, &buffers[i]->stride);
|
||||||
|
|
||||||
err = grDev->alloc(grDev,
|
LOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s",
|
||||||
fbDev->width, fbDev->height, fbDev->format,
|
i, fbDev->width, fbDev->height, strerror(-err));
|
||||||
GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride);
|
|
||||||
|
|
||||||
LOGE_IF(err, "fb buffer 1 allocation failed w=%d, h=%d, err=%s",
|
if (err)
|
||||||
fbDev->width, fbDev->height, strerror(-err));
|
{
|
||||||
|
mNumBuffers = i;
|
||||||
|
mNumFreeBuffers = i;
|
||||||
|
mBufferHead = mNumBuffers-1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const_cast<uint32_t&>(android_native_window_t::flags) = fbDev->flags;
|
const_cast<uint32_t&>(android_native_window_t::flags) = fbDev->flags;
|
||||||
const_cast<float&>(android_native_window_t::xdpi) = fbDev->xdpi;
|
const_cast<float&>(android_native_window_t::xdpi) = fbDev->xdpi;
|
||||||
|
|||||||
Reference in New Issue
Block a user