Используя IOSurfaces с OpenCL
IOSurface является абстракцией для совместного использования данных изображения. IOSurfaces являются эффективным способом управлять видеопамятью, потому что при использовании IOSurface если никакая копия не необходима, никакое время не потрачено впустую на создание копии. IOSurface превышает APIs, архитектуру, адресные пространства и процессы.
При создании изображения OpenCL из IOSurface можно использовать язык C OpenCL для изменения данных изображения, в полной мере пользования параллелизмом, который OpenCL дает Вам. Вы используете ID IOSURFACE для передачи IOSurface от процесса до процесса, так, чтобы абсолютно отдельные приложения могли совместно использовать тот же объект. Это делает совместное использование IOSurface между устройствами очень простым.
При создании объекта видеопамяти OpenCL из существующего IOSurface можно изменить данные, содержавшиеся в IOSurface или в основной программе, работающей на CPU, или в ядре OpenCL, работающем или на CPU или GPU.
Если Вы хотите изменить или считать IOSurface непосредственно на узле, то необходимо сначала вызвать IOSurfaceLock
функция. Вызовите IOSurfaceUnlock
функционируйте, когда сделано. Иначе, можно просто использовать изображение в OpenCL, как будто это было нормальное, старое изображение non-IOSurface-backed.
Создание или получение IOSurface
Можно или создать IOSurface в коде, или можно запросить IOSurface от другого рабочего процесса, такого как Фотоавтомат. Базовый механизм передачи текстуры для IOSurface объединяется GL_UNPACK_CLIENT_STORAGE_APPLE
и GL_STORAGE_HINT_CACHED_APPLE
вместе. Передача сделана как прямой DMA к и от системной памяти и видеопамяти без преобразований формата любого вида (кроме некоторых специфичных для GPU подробных данных расположения памяти). Независимо от того, сколько различных контекстов OpenGL (в том же процессе или не) ограничивает текстуру к IOSurface, они все совместно используют ту же системную память и копии памяти GPU данных.
Создание объекта изображения от IOSurface
Как только Вы создали или получили IOSurface перед использованием его в OpenCL необходимо создать объект видеопамяти OpenCL использование IOSurface. При создании объекта памяти Вы не делаете копию; объект видеопамяти указывает на ту же память как исходный IOSurface. Это делает использование очень эффективного IOSurface.
При использовании GCD для взаимодействия с IOSurface, создайте IOSurface-поддержанное изображение CL как показано в Перечислении 12-1.
Перечисление 12-1 , создающее IOSurface-поддержанное изображение CL
// Create a 2D image (depth = 0 or 1) or a 3D image (depth > 1). |
// Can also be used to create an image from an IOSurfaceRef. |
cl_image gcl_create_image( |
const cl_image_format *image_format, |
size_t image_width, |
size_t image_height, |
size_t image_depth, |
IOSurfaceRef io_surface); |
Если Вы используете стандартный OpenCL API и не используете GCD для создания IOSurface-поддержанного объекта OpenCL, использовать clCreateImageFromIOSurface2D
как показано в Перечислении 12-2.
Перечисление 12-2 , извлекающее изображение из IOSurface
cl_image_format image_format; |
image_format.image_channel_order = CL_RGBA; |
image_format.image_channel_data_type = CL_UNORM_INT8; |
cl_mem image = clCreateImageFromIOSurface2D( |
context, flags, image_format, width, height, surface, &err |
); |
Совместное использование IOSurface с устройством OpenCL
Совместное использование IOSurface в OpenCL очень просто. Ключ должен заблокировать IOSurface должным образом.
Если Ваш CPU (узел) собирается изменить IOSurface и затем совместно использовать его с устройством OpenCL, необходимо заблокировать IOSurface прежде, чем читать или записать в него, то разблокировать его прежде, чем передать его ядру:
Узел создает или получает IOSurface и создает свой объект изображения OpenCL.
Если узел будет писать в IOSurface, блокировки записи узла IOSurface путем вызова
IOSurfaceLock(..., write type lock)
функция. Если узел будет только читать из IOSurface, блокировки чтения узла это.Узел пишет в и читает из IOSurface по мере необходимости.
Узел разблокировал IOSurface путем вызова
IOSurfaceUnlock(...)
функция. Это говорит системе об изменении данных. Можно тогда использовать IOSurface-поддержанное изображение в OpenCL. Объект IOSurface обрабатывает любую необходимую блокировку чтения внутренне для Вас.Узел ставит в очередь ядро OpenCL, передавая его IOSurface.
Блокировка и разблокирование являются просто минимальными вызовами, должен был дать OS X достаточно информации, чтобы гарантировать, что каждое устройство всегда получает последние, корректные данные.
При использовании OpenCL для изменения IOSurface, Вы не должны блокировать его. Просто получите доступ к объекту видеопамяти непосредственно.