LINUX.ORG.RU

История изменений

Исправление 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 большего размера, чем нужно (даже если всё ок по выравниванию).