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