diff --git a/libgralloc-qsd8k/gpu.cpp b/libgralloc-qsd8k/gpu.cpp index 0a3ac33..9006528 100755 --- a/libgralloc-qsd8k/gpu.cpp +++ b/libgralloc-qsd8k/gpu.cpp @@ -168,6 +168,7 @@ int gpu_context_t::gralloc_alloc_buffer(size_t size, int usage, buffer_handle_t* // the PmemAllocator rather than getting the base & offset separately int offset = 0; int lockState = 0; + int masterFd = -1; size = roundUpToPageSize(size); #ifndef USE_ASHMEM if (usage & GRALLOC_USAGE_HW_TEXTURE) { @@ -217,7 +218,7 @@ int gpu_context_t::gralloc_alloc_buffer(size_t size, int usage, buffer_handle_t* // PMEM buffers are always mmapped lockState |= private_handle_t::LOCK_STATE_MAPPED; - err = pma->alloc_pmem_buffer(size, usage, &base, &offset, &fd); + err = pma->alloc_pmem_buffer(size, usage, &base, &offset, &fd, &masterFd); if (err < 0) { if (((usage & GRALLOC_USAGE_HW_MASK) == 0) && ((usage & GRALLOC_USAGE_PRIVATE_PMEM_ADSP) == 0)) { @@ -243,6 +244,7 @@ try_ashmem: hnd->offset = offset; hnd->base = int(base)+offset; hnd->lockState = lockState; + hnd->masterFd = masterFd; *pHandle = hnd; } @@ -393,7 +395,7 @@ int gpu_context_t::free_impl(private_handle_t const* hnd) { const size_t bufferSize = m->finfo.line_length * m->info.yres; int index = (hnd->base - m->framebuffer->base) / bufferSize; m->bufferMask &= ~(1<flags & private_handle_t::PRIV_FLAGS_USES_PMEM) { pmem_allocator = &pmemAllocator; @@ -404,10 +406,14 @@ int gpu_context_t::free_impl(private_handle_t const* hnd) { pmem_allocator->free_pmem_buffer(hnd->size, (void*)hnd->base, hnd->offset, hnd->fd); } + deps.terminateBuffer(&m->base, const_cast(hnd)); } deps.close(hnd->fd); + if (hnd->masterFd != -1) { + deps.close(hnd->masterFd); + } delete hnd; // XXX JMG: move this to the deps return 0; } diff --git a/libgralloc-qsd8k/gralloc_priv.h b/libgralloc-qsd8k/gralloc_priv.h index cdb18dc..64d24cf 100755 --- a/libgralloc-qsd8k/gralloc_priv.h +++ b/libgralloc-qsd8k/gralloc_priv.h @@ -269,16 +269,17 @@ struct private_handle_t { int format; int width; int height; + int masterFd; #ifdef __cplusplus - static const int sNumInts = 13; + static const int sNumInts = 14; static const int sNumFds = 1; static const int sMagic = 'gmsm'; private_handle_t(int fd, int size, int flags, int bufferType, int format, int width, int height) : fd(fd), magic(sMagic), flags(flags), size(size), offset(0), bufferType(bufferType), base(0), lockState(0), writeOwner(0), gpuaddr(0), pid(getpid()), format(format), width(width), - height(height) + height(height), masterFd(-1) { version = sizeof(native_handle); numInts = sNumInts; diff --git a/libgralloc-qsd8k/pmemalloc.cpp b/libgralloc-qsd8k/pmemalloc.cpp index 1d78333..dc756be 100755 --- a/libgralloc-qsd8k/pmemalloc.cpp +++ b/libgralloc-qsd8k/pmemalloc.cpp @@ -143,7 +143,7 @@ int PmemUserspaceAllocator::init_pmem_area() int PmemUserspaceAllocator::alloc_pmem_buffer(size_t size, int usage, - void** pBase, int* pOffset, int* pFd) + void** pBase, int* pOffset, int* pFd, int* masterFd) { BEGIN_FUNC; int err = init_pmem_area(); @@ -185,6 +185,7 @@ int PmemUserspaceAllocator::alloc_pmem_buffer(size_t size, int usage, *pBase = base; *pOffset = offset; *pFd = fd; + *masterFd = -1; } //LOGD_IF(!err, "%s: allocating pmem size=%d, offset=%d", pmemdev, size, offset); } @@ -259,7 +260,7 @@ static unsigned clp2(unsigned x) { int PmemKernelAllocator::alloc_pmem_buffer(size_t size, int usage, - void** pBase,int* pOffset, int* pFd) + void** pBase,int* pOffset, int* pFd, int* masterFd) { BEGIN_FUNC; @@ -320,6 +321,7 @@ int PmemKernelAllocator::alloc_pmem_buffer(size_t size, int usage, *pBase = base; *pOffset = 0; *pFd = fd; + *masterFd = master_fd; } else { deps.munmap(base, size); deps.unmapPmem(fd, offset, size); @@ -346,12 +348,7 @@ int PmemKernelAllocator::free_pmem_buffer(size_t size, void* base, int offset, i LOGW("error unmapping pmem fd: %s", strerror(err)); return -err; } - err = deps.munmap(base, size); - if (err < 0) { - err = deps.getErrno(); - LOGW("error unmapping pmem master_fd: %s", strerror(err)); - return -err; - } + END_FUNC; return 0; } diff --git a/libgralloc-qsd8k/pmemalloc.h b/libgralloc-qsd8k/pmemalloc.h index f433010..dfe114e 100755 --- a/libgralloc-qsd8k/pmemalloc.h +++ b/libgralloc-qsd8k/pmemalloc.h @@ -36,7 +36,7 @@ class PmemAllocator { virtual void* get_base_address() = 0; virtual int alloc_pmem_buffer(size_t size, int usage, void** pBase, - int* pOffset, int* pFd) = 0; + int* pOffset, int* pFd, int* masterFd) = 0; virtual int free_pmem_buffer(size_t size, void* base, int offset, int fd) = 0; }; @@ -89,7 +89,7 @@ class PmemUserspaceAllocator: public PmemAllocator { virtual int init_pmem_area_locked(); virtual int init_pmem_area(); virtual int alloc_pmem_buffer(size_t size, int usage, void** pBase, - int* pOffset, int* pFd); + int* pOffset, int* pFd, int* masterFd); virtual int free_pmem_buffer(size_t size, void* base, int offset, int fd); #ifndef ANDROID_OS @@ -151,7 +151,7 @@ class PmemKernelAllocator: public PmemAllocator { virtual void* get_base_address(); virtual int alloc_pmem_buffer(size_t size, int usage, void** pBase, - int* pOffset, int* pFd); + int* pOffset, int* pFd, int* masterFd); virtual int free_pmem_buffer(size_t size, void* base, int offset, int fd); private: