diff --git a/libgralloc-qsd8k/gpu.cpp b/libgralloc-qsd8k/gpu.cpp index 9006528..b3a83ce 100755 --- a/libgralloc-qsd8k/gpu.cpp +++ b/libgralloc-qsd8k/gpu.cpp @@ -218,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, &masterFd); + err = pma->alloc_pmem_buffer(size, usage, &base, &offset, &fd, &masterFd, format); if (err < 0) { if (((usage & GRALLOC_USAGE_HW_MASK) == 0) && ((usage & GRALLOC_USAGE_PRIVATE_PMEM_ADSP) == 0)) { diff --git a/libgralloc-qsd8k/gralloc.cpp b/libgralloc-qsd8k/gralloc.cpp index 019a8cd..16f026e 100755 --- a/libgralloc-qsd8k/gralloc.cpp +++ b/libgralloc-qsd8k/gralloc.cpp @@ -96,6 +96,13 @@ class PmemAllocatorDepsDeviceImpl : public PmemUserspaceAllocator::Deps, return ioctl(fd, PMEM_UNMAP, &sub); } + virtual int alignPmem(int fd, size_t size, int align) { + struct pmem_allocation allocation; + allocation.size = size; + allocation.align = align; + return ioctl(fd, PMEM_ALLOCATE_ALIGNED, &allocation); + } + virtual int getErrno() { return errno; } diff --git a/libgralloc-qsd8k/pmemalloc.cpp b/libgralloc-qsd8k/pmemalloc.cpp index dc756be..ea30b2b 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, int* masterFd) + void** pBase, int* pOffset, int* pFd, int* masterFd, int format) { BEGIN_FUNC; int err = init_pmem_area(); @@ -260,7 +260,7 @@ static unsigned clp2(unsigned x) { int PmemKernelAllocator::alloc_pmem_buffer(size_t size, int usage, - void** pBase,int* pOffset, int* pFd, int* masterFd) + void** pBase,int* pOffset, int* pFd, int* masterFd, int format) { BEGIN_FUNC; @@ -292,6 +292,14 @@ int PmemKernelAllocator::alloc_pmem_buffer(size_t size, int usage, // The size should already be page aligned, now round it up to a power of 2. //size = clp2(size); + if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED) { + // Tile format buffers need physical alignment to 8K + err = deps.alignPmem(master_fd, size, 8192); + if (err < 0) { + LOGE("alignPmem failed"); + } + } + void* base = deps.mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, master_fd, 0); if (base == MAP_FAILED) { LOGE("%s: failed to map pmem fd: %s", device, diff --git a/libgralloc-qsd8k/pmemalloc.h b/libgralloc-qsd8k/pmemalloc.h index dfe114e..a6d98b8 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, int* masterFd) = 0; + int* pOffset, int* pFd, int* masterFd, int format) = 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* masterFd); + int* pOffset, int* pFd, int* masterFd, int format); virtual int free_pmem_buffer(size_t size, void* base, int offset, int fd); #ifndef ANDROID_OS @@ -142,6 +142,7 @@ class PmemKernelAllocator: public PmemAllocator { virtual int connectPmem(int fd, int master_fd) = 0; virtual int mapPmem(int fd, int offset, size_t size) = 0; virtual int unmapPmem(int fd, int offset, size_t size) = 0; + virtual int alignPmem(int fd, size_t size, int align) = 0; }; PmemKernelAllocator(Deps& deps); @@ -151,7 +152,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* masterFd); + int* pOffset, int* pFd, int* masterFd, int format); virtual int free_pmem_buffer(size_t size, void* base, int offset, int fd); private: