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:
parent
4fa0ce6a29
commit
06304d437b
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user