Align pmem for NV12 Tiled buffers

The decoder requires the NV12Tiled buffers to be physically aligned to 8k.

Change-Id: I07a40d2a390601192a01213a5de94df2ab1ee06c
This commit is contained in:
Naomi Luis 2011-03-07 18:00:54 -08:00 committed by Govind Surti
parent 4fa0ce6a29
commit 06304d437b
4 changed files with 22 additions and 6 deletions

View File

@ -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)) {

View File

@ -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;
}

View File

@ -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,

View File

@ -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: