LINUX.ORG.RU

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

Исправление safocl, (текущая версия) :

Алсо auto allocSize = ( pixmapDataSize / allocAligment + 1 ) * allocAligment; -> auto allocSize = allocAligment * std::ceil ( static_cast< double > ( pixmapDataSize ) / static_cast<double> ( allocAligment ) );

в таком случае размер не будет кратен значению align, что обязательно должно быть согласно спеку vulkan/
А так я выясняю сколько целых значений align будет в размере allocSize — и потом множу на этот самый align, прибавив в allocSize еще один размер align, поскольку почти всегда будет меньше, чем надо, ну или максимум ровно столько же...

сейчас исправил на такой код:

auto allocSize = ( pixmapDataSize / allocAlignment ) * allocAlignment;

if ( allocSize < pixmapDataSize )
    allocSize += allocAlignment;


а так на сколько я уже понял — по крайней мере на nvidia для импорта извне в vulkan api доступен только vkBuffer... — для него не нужно сразу размер вычислять как под хранение определенного image.
Хранение image потому что производится не обязательно тривиальным способом, с разными значениями его параметров это может быть как более компактный вид, так и более расширенный.

Исходная версия safocl, :

Алсо auto allocSize = ( pixmapDataSize / allocAligment + 1 ) * allocAligment; -> auto allocSize = allocAligment * std::ceil ( static_cast< double > ( pixmapDataSize ) / static_cast<double> ( allocAligment ) );

в таком случае размер не будет кратен значению align, что обязательно должно быть согласно спеку vulkan/
А так я выясняю сколько целых значений align будет в размере allocSize — и потом множу на этот самый align, прибавив в allocSize еще один размер align, поскольку почти всегда будет меньше, чем надо, ну или максимум ровно столько же...

сейчас исправил на такой код:

auto allocSize = ( pixmapDataSize / allocAlignment ) * allocAlignment;

if ( allocSize < pixmapDataSize )
    allocSize += allocAlignment;