История изменений
Исправление robus, (текущая версия) :
Сейчас, глянув код в адекватном состоянии, вместо утреннего тупняка, вижу в чём там может быть проблема. Почему бы не выделять shmem того размера, который указан в VkMemoryRequirements
(после vkGetImageMemoryRequirements
)? На сколько я вижу, в твоём коде именно ты управляешь количеством выделенной памяти в том месте, а не xcb. Т.е. там, где posix::SharedMemory::Shared Window::getOffscreenShmImageData( posix::SharedMemory::Shared shm )
const std::uint32_t imageSize = windowGeometry.height * windowGeometry.width * 4;
shm->reinit( imageSize );
станет чем-то вроде
std::uint32_t imageSize = windowGeometry.height * windowGeometry.width * 4;
const double k = static_cast< double >( imageSize ) / static_cast< double >( align );
imageSize = align * std::ceil ( k );
shm->reinit( imageSize );
Алсо auto allocSize = ( pixmapDataSize / allocAligment + 1 ) * allocAligment;
-> auto allocSize = allocAligment * std::ceil ( static_cast< double > ( pixmapDataSize ) / static_cast<double> ( allocAligment ) );
, иначе всегда будешь создавать VkDeviceMemory большего размера, чем нужно (даже если всё ок по выравниванию).
Исходная версия robus, :
Сейчас, глянув код в адекватном состоянии, вместо утреннего тупняка, вижу в чём там может быть проблема. Почему бы не выделять shmem того размера, который указан в VkMemoryRequirements
? На сколько я вижу, в твоём коде именно ты управляешь количеством выделенной памяти в том месте, а не xcb. Т.е. там, где posix::SharedMemory::Shared Window::getOffscreenShmImageData( posix::SharedMemory::Shared shm )
const std::uint32_t imageSize = windowGeometry.height * windowGeometry.width * 4;
shm->reinit( imageSize );
станет чем-то вроде
std::uint32_t imageSize = windowGeometry.height * windowGeometry.width * 4;
const double k = static_cast< double >( imageSize ) / static_cast< double >( align );
imageSize = align * std::ceil ( k );
shm->reinit( imageSize );
Алсо auto allocSize = ( pixmapDataSize / allocAligment + 1 ) * allocAligment;
-> auto allocSize = allocAligment * std::ceil ( static_cast< double > ( pixmapDataSize ) / static_cast<double> ( allocAligment ) );
, иначе всегда будешь создавать VkDeviceMemory большего размера, чем нужно (даже если всё ок по выравниванию).