From 44311757be4494ad601b6249d3722c71ffb17777 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 12 Jan 2010 15:19:05 -0800 Subject: [PATCH] android-2.1_r1 snapshot --- libcopybit/copybit.cpp | 8 +++++ libgralloc-qsd8k/framebuffer.cpp | 54 +++++++++++++++++++++----------- libgralloc-qsd8k/gralloc.cpp | 36 ++++++++++----------- libgralloc-qsd8k/gralloc_priv.h | 6 ++-- 4 files changed, 63 insertions(+), 41 deletions(-) diff --git a/libcopybit/copybit.cpp b/libcopybit/copybit.cpp index ba8531b..fb605fe 100644 --- a/libcopybit/copybit.cpp +++ b/libcopybit/copybit.cpp @@ -42,8 +42,10 @@ #if defined(COPYBIT_MSM7K) #define MAX_SCALE_FACTOR (4) +#define MAX_DIMENSION (4096) #elif defined(COPYBIT_QSD8K) #define MAX_SCALE_FACTOR (8) +#define MAX_DIMENSION (2048) #else #error "Unsupported MDP version" #endif @@ -366,6 +368,12 @@ static int stretch_copybit( return -EINVAL; } + if (src->w > MAX_DIMENSION || src->h > MAX_DIMENSION) + return -EINVAL; + + if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) + return -EINVAL; + const uint32_t maxCount = sizeof(list.req)/sizeof(list.req[0]); const struct copybit_rect_t bounds = { 0, 0, dst->w, dst->h }; struct copybit_rect_t clip; diff --git a/libgralloc-qsd8k/framebuffer.cpp b/libgralloc-qsd8k/framebuffer.cpp index 797982f..11b303a 100644 --- a/libgralloc-qsd8k/framebuffer.cpp +++ b/libgralloc-qsd8k/framebuffer.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -59,7 +60,8 @@ struct fb_context_t { /*****************************************************************************/ static void -msm_copy_buffer(buffer_handle_t handle, int fd, int width, int height, +msm_copy_buffer(buffer_handle_t handle, int fd, + int width, int height, int format, int x, int y, int w, int h); static int fb_setSwapInterval(struct framebuffer_device_t* dev, @@ -120,9 +122,6 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) m->currentBuffer = buffer; } 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; @@ -138,8 +137,9 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) //memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres); - msm_copy_buffer(m->framebuffer, m->framebuffer->fd, - m->info.xres, m->info.yres, + msm_copy_buffer( + m->framebuffer, m->framebuffer->fd, + m->info.xres, m->info.yres, m->fbFormat, m->info.xoffset, m->info.yoffset, m->info.width, m->info.height); @@ -152,7 +152,7 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) static int fb_compositionComplete(struct framebuffer_device_t* dev) { - // STOPSHIP: Properly implement composition complete callback + // TODO: Properly implement composition complete callback glFinish(); return 0; @@ -199,19 +199,35 @@ int mapFrameBufferLocked(struct private_module_t* module) info.yoffset = 0; info.activate = FB_ACTIVATE_NOW; + /* Interpretation of offset for color fields: All offsets are from the right, + * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you + * can use the offset as right argument to <<). A pixel afterwards is a bit + * stream and is written to video memory as that unmodified. This implies + * big-endian byte order if bits_per_pixel is greater than 8. + */ + /* - * Explicitly request 5/6/5 + * Explicitly request RGBA_8888 */ - info.bits_per_pixel = 16; - info.red.offset = 11; - info.red.length = 5; - info.green.offset = 5; - info.green.length = 6; - info.blue.offset = 0; - info.blue.length = 5; + info.bits_per_pixel = 32; + info.red.offset = 24; + info.red.length = 8; + info.green.offset = 16; + info.green.length = 8; + info.blue.offset = 8; + info.blue.length = 8; info.transp.offset = 0; info.transp.length = 0; + /* Note: the GL driver does not have a r=8 g=8 b=8 a=0 config, so if we do + * not use the MDP for composition (i.e. hw composition == 0), ask for + * RGBA instead of RGBX. */ + char property[PROPERTY_VALUE_MAX]; + if (property_get("debug.sf.hw", property, NULL) > 0 && atoi(property) == 0) + module->fbFormat = HAL_PIXEL_FORMAT_RGBX_8888; + else + module->fbFormat = HAL_PIXEL_FORMAT_RGBA_8888; + /* * Request NUM_BUFFERS screens (at lest 2 for page flipping) */ @@ -322,7 +338,6 @@ int mapFrameBufferLocked(struct private_module_t* module) return -errno; } module->framebuffer->base = intptr_t(vaddr); - module->framebuffer->phys = intptr_t(finfo.smem_start); memset(vaddr, 0, fbSize); return 0; } @@ -378,7 +393,7 @@ int fb_device_open(hw_module_t const* module, const char* name, const_cast(dev->device.width) = m->info.xres; const_cast(dev->device.height) = m->info.yres; const_cast(dev->device.stride) = stride; - const_cast(dev->device.format) = HAL_PIXEL_FORMAT_RGB_565; + const_cast(dev->device.format) = m->fbFormat; const_cast(dev->device.xdpi) = m->xdpi; const_cast(dev->device.ydpi) = m->ydpi; const_cast(dev->device.fps) = m->fps; @@ -400,7 +415,8 @@ int fb_device_open(hw_module_t const* module, const char* name, /* Copy a pmem buffer to the framebuffer */ static void -msm_copy_buffer(buffer_handle_t handle, int fd, int width, int height, +msm_copy_buffer(buffer_handle_t handle, int fd, + int width, int height, int format, int x, int y, int w, int h) { struct { @@ -425,7 +441,7 @@ msm_copy_buffer(buffer_handle_t handle, int fd, int width, int height, blit.req.dst.height = height; blit.req.dst.offset = 0; blit.req.dst.memory_id = fd; - blit.req.dst.format = MDP_RGB_565; + blit.req.dst.format = format; blit.req.src_rect.x = blit.req.dst_rect.x = x; blit.req.src_rect.y = blit.req.dst_rect.y = y; diff --git a/libgralloc-qsd8k/gralloc.cpp b/libgralloc-qsd8k/gralloc.cpp index 45746ef..9887057 100644 --- a/libgralloc-qsd8k/gralloc.cpp +++ b/libgralloc-qsd8k/gralloc.cpp @@ -104,6 +104,7 @@ struct private_module_t HAL_MODULE_INFO_SYM = { perform: gralloc_perform, }, framebuffer: 0, + fbFormat: 0, flags: 0, numBuffers: 0, bufferMask: 0, @@ -111,7 +112,6 @@ struct private_module_t HAL_MODULE_INFO_SYM = { currentBuffer: 0, pmem_master: -1, pmem_master_base: 0, - master_phys: 0 }; /*****************************************************************************/ @@ -165,7 +165,6 @@ static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev, hnd->base = vaddr; hnd->offset = vaddr - intptr_t(m->framebuffer->base); - hnd->phys = intptr_t(m->framebuffer->phys) + hnd->offset; *pHandle = hnd; return 0; @@ -205,15 +204,6 @@ static int init_pmem_area_locked(private_module_t* m) base = 0; close(master_fd); master_fd = -1; - } else { - // FIXME: get physical address, eventually this will have to go away - pmem_region region; - err = ioctl(master_fd, PMEM_GET_PHYS, ®ion); - if (err < 0) { - LOGE("PMEM_GET_PHYS failed (%s)", strerror(-errno)); - } else { - m->master_phys = (unsigned long)region.offset; - } } m->pmem_master = master_fd; m->pmem_master_base = base; @@ -289,9 +279,16 @@ try_ashmem: err = -ENOMEM; } else { struct pmem_region sub = { offset, size }; - + int openFlags = O_RDWR | O_SYNC; + uint32_t uread = usage & GRALLOC_USAGE_SW_READ_MASK; + uint32_t uwrite = usage & GRALLOC_USAGE_SW_WRITE_MASK; + if (uread == GRALLOC_USAGE_SW_READ_OFTEN || + uwrite == GRALLOC_USAGE_SW_WRITE_OFTEN) { + openFlags &= ~O_SYNC; + } + // now create the "sub-heap" - fd = open("/dev/pmem", O_RDWR, 0); + fd = open("/dev/pmem", openFlags, 0); err = fd < 0 ? fd : 0; // and connect to it @@ -307,8 +304,11 @@ try_ashmem: close(fd); sAllocator.deallocate(offset); fd = -1; + } else { + memset((char*)base + offset, 0, size); + // clean and invalidate the new allocation + cacheflush(intptr_t(base) + offset, size, 0); } - memset((char*)base + offset, 0, size); //LOGD_IF(!err, "allocating pmem size=%d, offset=%d", size, offset); } } else { @@ -328,11 +328,6 @@ try_ashmem: hnd->offset = offset; hnd->base = int(base)+offset; hnd->lockState = lockState; - if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM) { - private_module_t* m = reinterpret_cast( - dev->common.module); - hnd->phys = m->master_phys + offset; - } *pHandle = hnd; } @@ -391,6 +386,9 @@ static int gralloc_alloc(alloc_device_t* dev, size = alignedw * alignedh * bpp; } + if ((ssize_t)size <= 0) + return -EINVAL; + int err; if (usage & GRALLOC_USAGE_HW_FB) { err = gralloc_alloc_framebuffer(dev, size, usage, pHandle); diff --git a/libgralloc-qsd8k/gralloc_priv.h b/libgralloc-qsd8k/gralloc_priv.h index 534b4c0..d74c1f2 100644 --- a/libgralloc-qsd8k/gralloc_priv.h +++ b/libgralloc-qsd8k/gralloc_priv.h @@ -38,6 +38,7 @@ struct private_module_t { gralloc_module_t base; struct private_handle_t* framebuffer; + uint32_t fbFormat; uint32_t flags; uint32_t numBuffers; uint32_t bufferMask; @@ -45,7 +46,6 @@ struct private_module_t { buffer_handle_t currentBuffer; int pmem_master; void* pmem_master_base; - unsigned long master_phys; struct fb_var_screeninfo info; struct fb_fix_screeninfo finfo; @@ -92,7 +92,7 @@ struct private_handle_t { int base; int lockState; int writeOwner; - int phys; // The physical address of that chunk of memory. If using ashmem, set to 0 They don't care + int gpuaddr; // The gpu address mapped into the mmu. If using ashmem, set to 0 They don't care int pid; #ifdef __cplusplus @@ -102,7 +102,7 @@ struct private_handle_t { private_handle_t(int fd, int size, int flags) : fd(fd), magic(sMagic), flags(flags), size(size), offset(0), gpu_fd(-1), - base(0), lockState(0), writeOwner(0), phys(0), pid(getpid()) + base(0), lockState(0), writeOwner(0), gpuaddr(0), pid(getpid()) { version = sizeof(native_handle); numInts = sNumInts;