Суть проекта - спрайтовые игры. Отрисовка проводится с помощью g2d_blit, в связи с чем для получения физического адреса, ресурсы в памяти размещаются с помощью g2d_alloc.
При попытке выделить память для более "тяжёлых" игр g2d_alloc возвращает ошибку, и как свойственно libg2d никакой диагностической информации не даётся.
Прогоняю под отладчиком, дохожу до выделения памяти под "проблемную" картинку, вывожу top в консоли linux - оставшейся памяти заметно больше, чем необходимо для выделения.
Отсюда догадка - скорее всего "видеопамять", то есть память, которую может выделить g2d_alloc ограничена каким-то значением. Прав ли я и можно ли в таком случае расширить допустимое количество памяти для выделения?
1) Для всех аппаратных ускорителей используется аалокатор CMA, размер зарезервированной памяти можно изменить в конфиге ядра
make ARCH=arm menuconfig
Device Drivers --->
Generic Driver Options --->
*** Default contiguous memory area size: ***
(320) Size in Mega Bytes
или через параметр передаваемый ядру при загрузке
cma=320M
2) Есть еще такой момент как фрагментация - вполне может быть причиной отказа "При попытке выделить память для более "тяжёлых" игр" - память есть но непрерывного куска большого размера аллокатор выделить не может после множественных аллокаций более мелких кусков.
Вариант с определением cma что в настройках ядра, что в cmdline результата не давал.
Вариант с galcore.contiguoussize в строке ядра дал нужный эффект. Теперь самая тяжелая игра загружается нормально, правда я проделал ещё некоторые оптимизации, в том числе при выделении памяти под ресурсы начинаю выделять сначала под самые большие текстуры, затем по степени уменьшения. Это по идее должно уменьшить фрагментацию выделяемой памяти, хотя только с этой оптимизацией всё равно "не взлетало".