Я создаю плагин OpenFX для обработки изображений для системы VR.
Поскольку как наш существующий код обработки, так и хост, для которого предназначен плагин, основаны на OpenCL, разработчики хоста дали мне расширение для OFX для совместного использования среды OpenCL.
Однако — наш код использует C ++ API (cl :: Context), и предоставленное ими расширение дает мне указатель на C cl_context.
Есть ли способ для меня создать cl :: Context из cl_context, не вступая во владение последним? (и то же самое для cl :: CommandQueue из cl_command_queue). Онлайновые документы по API предполагают, что и конструктор копирования, и оператор присваивания становятся собственниками.
К счастью, вы можете проверить заголовок OpenCL C ++, чтобы точно узнать, что он делает (в нижней части он просто делает вызовы C API), и вы можете войти в код, чтобы проверить это. При работе как с C, так и с C ++ API вы должны быть осторожны с количеством сохраняемых / освобождаемых объектов OpenCL, особенно если конструктор C ++ не сохраняет, а деструктор освобождает, тогда у вас есть проблема (потому что вы освобождаете контекст хоста из-под них). Однако, это легко исправить, потому что вы можете просто вызвать retain себя на объекте после построения, чтобы сбалансировать вещи. Я смешал C API и C ++ API в OpenCL, и это было философией сохранения / выпуска заголовка C ++, которая меня тоже порадовала, поэтому я чувствую вашу боль. Любопытно, хозяин OpenFX Resolve, Vegas, Catalyst или что-то еще? На пути к OpenFX есть унифицированное расширение OpenCL.
Других решений пока нет …