Используя 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 прежде, чем читать или записать в него, то разблокировать его прежде, чем передать его ядру:

Блокировка и разблокирование являются просто минимальными вызовами, должен был дать OS X достаточно информации, чтобы гарантировать, что каждое устройство всегда получает последние, корректные данные.

При использовании OpenCL для изменения IOSurface, Вы не должны блокировать его. Просто получите доступ к объекту видеопамяти непосредственно.