19 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
34 #if HAVE_OPENCL_VAAPI_BEIGNET
37 #include <va/va_drmcommon.h>
38 #include <CL/cl_intel.h>
42 #if HAVE_OPENCL_DRM_BEIGNET
44 #include <CL/cl_intel.h>
48 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
50 #include <mfxstructures.h>
53 #include <CL/cl_va_api_media_sharing_intel.h>
59 #include <CL/cl_dx9_media_sharing.h>
65 #include <CL/cl_d3d11.h>
69 #if HAVE_OPENCL_DRM_ARM
70 #include <CL/cl_ext.h>
71 #include <drm_fourcc.h>
75 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA && CONFIG_LIBMFX
93 #if HAVE_OPENCL_DRM_BEIGNET
94 int beignet_drm_mapping_usable;
95 clCreateImageFromFdINTEL_fn clCreateImageFromFdINTEL;
98 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
99 int qsv_mapping_usable;
100 clCreateFromVA_APIMediaSurfaceINTEL_fn
101 clCreateFromVA_APIMediaSurfaceINTEL;
102 clEnqueueAcquireVA_APIMediaSurfacesINTEL_fn
103 clEnqueueAcquireVA_APIMediaSurfacesINTEL;
104 clEnqueueReleaseVA_APIMediaSurfacesINTEL_fn
105 clEnqueueReleaseVA_APIMediaSurfacesINTEL;
108 #if HAVE_OPENCL_DXVA2
109 int dxva2_mapping_usable;
110 cl_dx9_media_adapter_type_khr dx9_media_adapter_type;
112 clCreateFromDX9MediaSurfaceKHR_fn
113 clCreateFromDX9MediaSurfaceKHR;
114 clEnqueueAcquireDX9MediaSurfacesKHR_fn
115 clEnqueueAcquireDX9MediaSurfacesKHR;
116 clEnqueueReleaseDX9MediaSurfacesKHR_fn
117 clEnqueueReleaseDX9MediaSurfacesKHR;
120 #if HAVE_OPENCL_D3D11
121 int d3d11_mapping_usable;
122 clCreateFromD3D11Texture2DKHR_fn
123 clCreateFromD3D11Texture2DKHR;
124 clEnqueueAcquireD3D11ObjectsKHR_fn
125 clEnqueueAcquireD3D11ObjectsKHR;
126 clEnqueueReleaseD3D11ObjectsKHR_fn
127 clEnqueueReleaseD3D11ObjectsKHR;
130 #if HAVE_OPENCL_DRM_ARM
131 int drm_arm_mapping_usable;
142 #if HAVE_OPENCL_DXVA2 || HAVE_OPENCL_D3D11
146 int nb_mapped_frames;
153 const void *private_info,
166 cle = clReleaseContext(hwctx->
context);
167 if (cle != CL_SUCCESS) {
169 "context: %d.\n", cle);
177 {
"platform_profile", CL_PLATFORM_PROFILE },
178 {
"platform_version", CL_PLATFORM_VERSION },
179 {
"platform_name", CL_PLATFORM_NAME },
180 {
"platform_vendor", CL_PLATFORM_VENDOR },
181 {
"platform_extensions", CL_PLATFORM_EXTENSIONS },
188 {
"device_name", CL_DEVICE_NAME },
189 {
"device_vendor", CL_DEVICE_VENDOR },
190 {
"driver_version", CL_DRIVER_VERSION },
191 {
"device_version", CL_DEVICE_VERSION },
192 {
"device_profile", CL_DEVICE_PROFILE },
193 {
"device_extensions", CL_DEVICE_EXTENSIONS },
200 {
"cpu", CL_DEVICE_TYPE_CPU },
201 {
"gpu", CL_DEVICE_TYPE_GPU },
202 {
"accelerator", CL_DEVICE_TYPE_ACCELERATOR },
203 {
"custom", CL_DEVICE_TYPE_CUSTOM },
204 {
"default", CL_DEVICE_TYPE_DEFAULT },
205 {
"all", CL_DEVICE_TYPE_ALL },
209 cl_platform_info
key)
214 cle = clGetPlatformInfo(platform_id,
key, 0,
NULL, &
size);
215 if (cle != CL_SUCCESS)
220 cle = clGetPlatformInfo(platform_id,
key,
size, str, &
size);
221 if (cle != CL_SUCCESS) {
235 cle = clGetDeviceInfo(device_id,
key, 0,
NULL, &
size);
236 if (cle != CL_SUCCESS)
241 cle = clGetDeviceInfo(device_id,
key,
size, str, &
size);
242 if (cle != CL_SUCCESS) {
256 CL_PLATFORM_EXTENSIONS);
257 if (str && strstr(str,
name))
269 CL_DEVICE_EXTENSIONS);
270 if (str && strstr(str,
name))
284 "%s found as platform extension.\n",
name);
290 "%s found as device extension.\n",
name);
298 cl_uint *nb_platforms,
299 cl_platform_id **platforms,
304 cle = clGetPlatformIDs(0,
NULL, nb_platforms);
305 if (cle != CL_SUCCESS) {
307 "OpenCL platforms: %d.\n", cle);
317 cle = clGetPlatformIDs(*nb_platforms, *platforms,
NULL);
318 if (cle != CL_SUCCESS) {
320 "platforms: %d.\n", cle);
329 cl_platform_id platform_id,
330 const char *platform_name,
348 "of platform \"%s\".\n",
364 cl_platform_id platform_id,
365 const char *platform_name,
367 cl_device_id **devices,
372 cle = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_ALL,
373 0,
NULL, nb_devices);
374 if (cle == CL_DEVICE_NOT_FOUND) {
376 "on platform \"%s\".\n", platform_name);
379 }
else if (cle != CL_SUCCESS) {
381 "on platform \"%s\": %d.\n", platform_name, cle);
385 "platform \"%s\".\n", *nb_devices, platform_name);
391 cle = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_ALL,
392 *nb_devices, *devices,
NULL);
393 if (cle != CL_SUCCESS) {
395 "on platform \"%s\": %d.\n", platform_name, cle);
404 cl_device_id device_id,
405 const char *device_name,
415 cl_device_type match_type = 0, device_type;
430 cle = clGetDeviceInfo(device_id, CL_DEVICE_TYPE,
431 sizeof(device_type), &device_type,
NULL);
432 if (cle != CL_SUCCESS) {
434 "of device \"%s\".\n", device_name);
438 if (!(device_type & match_type)) {
454 "of device \"%s\".\n",
474 cl_uint *nb_platforms,
475 cl_platform_id **platforms,
478 cl_platform_id platform_id,
479 const char *platform_name,
482 cl_platform_id platform_id,
483 const char *platform_name,
485 cl_device_id **devices,
488 cl_device_id device_id,
489 const char *device_name,
495 cl_context_properties *props)
497 cl_uint nb_platforms;
498 cl_platform_id *platforms =
NULL;
499 cl_platform_id platform_id;
501 cl_device_id *devices =
NULL;
504 cl_context_properties default_props[3];
505 char *platform_name_src =
NULL,
506 *device_name_src =
NULL;
507 int err, found, p,
d;
518 for (p = 0; p < nb_platforms; p++) {
519 const char *platform_name;
528 if (platform_name_src)
529 platform_name = platform_name_src;
531 platform_name =
"Unknown Platform";
544 &nb_devices, &devices,
549 for (
d = 0;
d < nb_devices;
d++) {
550 const char *device_name;
560 device_name = device_name_src;
562 device_name =
"Unknown Device";
575 platform_name, device_name);
578 platform_id = platforms[p];
597 props = default_props;
598 default_props[0] = CL_CONTEXT_PLATFORM;
599 default_props[1] = (intptr_t)platform_id;
600 default_props[2] = 0;
602 if (props[0] == CL_CONTEXT_PLATFORM && props[1] == 0)
603 props[1] = (intptr_t)platform_id;
637 if (device && device[0]) {
639 int d = -1, p = -1,
ret;
640 if (device[0] ==
'.')
641 ret = sscanf(device,
".%d", &
d);
643 ret = sscanf(device,
"%d.%d", &p, &
d);
646 "index specification \"%s\".\n", device);
667 if (cle != CL_SUCCESS) {
669 "command queue: %d.\n", cle);
679 "command queue: %d.\n", cle);
684 cle = clGetDeviceInfo(hwctx->
device_id, CL_DEVICE_PLATFORM,
687 if (cle != CL_SUCCESS) {
689 "platform containing the device.\n");
693 #define CL_FUNC(name, desc) do { \
696 priv->name = clGetExtensionFunctionAddressForPlatform( \
697 priv->platform_id, #name); \
699 av_log(hwdev, AV_LOG_VERBOSE, \
700 desc " function not found (%s).\n", #name); \
703 av_log(hwdev, AV_LOG_VERBOSE, \
704 desc " function found (%s).\n", #name); \
708 #if HAVE_OPENCL_DRM_BEIGNET
712 CL_FUNC(clCreateImageFromFdINTEL,
713 "Beignet DRM to OpenCL image mapping");
717 "mapping not usable.\n");
718 priv->beignet_drm_mapping_usable = 0;
720 priv->beignet_drm_mapping_usable = 1;
725 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
728 cl_context_properties *props =
NULL;
729 VADisplay va_display;
730 const char *va_ext =
"cl_intel_va_api_media_sharing";
735 "required for QSV to OpenCL mapping.\n", va_ext);
739 cle = clGetContextInfo(hwctx->
context, CL_CONTEXT_PROPERTIES,
740 0,
NULL, &props_size);
741 if (cle != CL_SUCCESS) {
743 "properties: %d.\n", cle);
746 if (props_size == 0) {
748 "enabled on context creation to use QSV to "
749 "OpenCL mapping.\n");
757 cle = clGetContextInfo(hwctx->
context, CL_CONTEXT_PROPERTIES,
758 props_size, props,
NULL);
759 if (cle != CL_SUCCESS) {
761 "properties: %d.\n", cle);
766 for (
i = 0;
i < (props_size /
sizeof(*props) - 1);
i++) {
767 if (props[
i] == CL_CONTEXT_VA_API_DISPLAY_INTEL) {
768 va_display = (VADisplay)(intptr_t)props[
i+1];
774 "enabled on context creation to use QSV to "
775 "OpenCL mapping.\n");
778 if (!vaDisplayIsValid(va_display)) {
780 "required on context creation to use QSV to "
781 "OpenCL mapping.\n");
785 CL_FUNC(clCreateFromVA_APIMediaSurfaceINTEL,
786 "Intel QSV to OpenCL mapping");
787 CL_FUNC(clEnqueueAcquireVA_APIMediaSurfacesINTEL,
788 "Intel QSV in OpenCL acquire");
789 CL_FUNC(clEnqueueReleaseVA_APIMediaSurfacesINTEL,
790 "Intel QSV in OpenCL release");
796 priv->qsv_mapping_usable = 0;
798 priv->qsv_mapping_usable = 1;
804 #if HAVE_OPENCL_DXVA2
808 CL_FUNC(clCreateFromDX9MediaSurfaceKHR,
809 "DXVA2 to OpenCL mapping");
810 CL_FUNC(clEnqueueAcquireDX9MediaSurfacesKHR,
811 "DXVA2 in OpenCL acquire");
812 CL_FUNC(clEnqueueReleaseDX9MediaSurfacesKHR,
813 "DXVA2 in OpenCL release");
818 priv->dxva2_mapping_usable = 0;
820 priv->dx9_media_adapter_type = CL_ADAPTER_D3D9EX_KHR;
821 priv->dxva2_mapping_usable = 1;
826 #if HAVE_OPENCL_D3D11
828 const char *d3d11_ext =
"cl_khr_d3d11_sharing";
829 const char *nv12_ext =
"cl_intel_d3d11_nv12_media_sharing";
834 "required for D3D11 to OpenCL mapping.\n", d3d11_ext);
838 "required for D3D11 to OpenCL mapping.\n", nv12_ext);
842 CL_FUNC(clCreateFromD3D11Texture2DKHR,
843 "D3D11 to OpenCL mapping");
844 CL_FUNC(clEnqueueAcquireD3D11ObjectsKHR,
845 "D3D11 in OpenCL acquire");
846 CL_FUNC(clEnqueueReleaseD3D11ObjectsKHR,
847 "D3D11 in OpenCL release");
852 priv->d3d11_mapping_usable = 0;
854 priv->d3d11_mapping_usable = 1;
859 #if HAVE_OPENCL_DRM_ARM
861 const char *drm_arm_ext =
"cl_arm_import_memory";
862 const char *image_ext =
"cl_khr_image2d_from_buffer";
867 "required for DRM to OpenCL mapping on ARM.\n",
873 "required for DRM to OpenCL mapping on ARM.\n",
883 priv->drm_arm_mapping_usable = 0;
885 priv->drm_arm_mapping_usable = 1;
902 if (cle != CL_SUCCESS) {
904 "command queue reference: %d.\n", cle);
910 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
912 cl_platform_id platform_id,
913 const char *platform_name,
919 if (!clGetExtensionFunctionAddressForPlatform(platform_id,
920 "clGetDeviceIDsFromVA_APIMediaAdapterINTEL")) {
922 "VAAPI device enumeration function.\n", platform_name);
930 cl_platform_id platform_id,
931 const char *platform_name,
933 cl_device_id **devices,
936 VADisplay va_display =
context;
937 clGetDeviceIDsFromVA_APIMediaAdapterINTEL_fn
938 clGetDeviceIDsFromVA_APIMediaAdapterINTEL;
941 clGetDeviceIDsFromVA_APIMediaAdapterINTEL =
942 clGetExtensionFunctionAddressForPlatform(platform_id,
943 "clGetDeviceIDsFromVA_APIMediaAdapterINTEL");
944 if (!clGetDeviceIDsFromVA_APIMediaAdapterINTEL) {
946 "clGetDeviceIDsFromVA_APIMediaAdapterINTEL().\n");
950 cle = clGetDeviceIDsFromVA_APIMediaAdapterINTEL(
951 platform_id, CL_VA_API_DISPLAY_INTEL, va_display,
952 CL_PREFERRED_DEVICES_FOR_VA_API_INTEL, 0,
NULL, nb_devices);
953 if (cle == CL_DEVICE_NOT_FOUND) {
955 "on platform \"%s\".\n", platform_name);
958 }
else if (cle != CL_SUCCESS) {
960 "on platform \"%s\": %d.\n", platform_name, cle);
968 cle = clGetDeviceIDsFromVA_APIMediaAdapterINTEL(
969 platform_id, CL_VA_API_DISPLAY_INTEL, va_display,
970 CL_PREFERRED_DEVICES_FOR_VA_API_INTEL, *nb_devices, *devices,
NULL);
971 if (cle != CL_SUCCESS) {
973 "devices on platform \"%s\": %d.\n", platform_name, cle);
982 cl_device_id device_id,
983 const char *device_name,
986 const char *va_ext =
"cl_intel_va_api_media_sharing";
992 "%s extension.\n", device_name, va_ext);
998 #if HAVE_OPENCL_DXVA2
1000 cl_platform_id platform_id,
1001 const char *platform_name,
1004 const char *dx9_ext =
"cl_khr_dx9_media_sharing";
1010 "%s extension.\n", platform_name, dx9_ext);
1016 cl_platform_id platform_id,
1017 const char *platform_name,
1018 cl_uint *nb_devices,
1019 cl_device_id **devices,
1022 IDirect3DDevice9 *device =
context;
1023 clGetDeviceIDsFromDX9MediaAdapterKHR_fn
1024 clGetDeviceIDsFromDX9MediaAdapterKHR;
1025 cl_dx9_media_adapter_type_khr media_adapter_type = CL_ADAPTER_D3D9EX_KHR;
1028 clGetDeviceIDsFromDX9MediaAdapterKHR =
1029 clGetExtensionFunctionAddressForPlatform(platform_id,
1030 "clGetDeviceIDsFromDX9MediaAdapterKHR");
1031 if (!clGetDeviceIDsFromDX9MediaAdapterKHR) {
1033 "clGetDeviceIDsFromDX9MediaAdapterKHR().\n");
1037 cle = clGetDeviceIDsFromDX9MediaAdapterKHR(
1038 platform_id, 1, &media_adapter_type, (
void**)&device,
1039 CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR,
1040 0,
NULL, nb_devices);
1041 if (cle == CL_DEVICE_NOT_FOUND) {
1043 "on platform \"%s\".\n", platform_name);
1046 }
else if (cle != CL_SUCCESS) {
1048 "on platform \"%s\": %d.\n", platform_name, cle);
1056 cle = clGetDeviceIDsFromDX9MediaAdapterKHR(
1057 platform_id, 1, &media_adapter_type, (
void**)&device,
1058 CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR,
1059 *nb_devices, *devices,
NULL);
1060 if (cle != CL_SUCCESS) {
1062 "devices on platform \"%s\": %d.\n", platform_name, cle);
1071 #if HAVE_OPENCL_D3D11
1073 cl_platform_id platform_id,
1074 const char *platform_name,
1077 const char *d3d11_ext =
"cl_khr_d3d11_sharing";
1083 "%s extension.\n", platform_name, d3d11_ext);
1089 cl_platform_id platform_id,
1090 const char *platform_name,
1091 cl_uint *nb_devices,
1092 cl_device_id **devices,
1096 clGetDeviceIDsFromD3D11KHR_fn clGetDeviceIDsFromD3D11KHR;
1099 clGetDeviceIDsFromD3D11KHR =
1100 clGetExtensionFunctionAddressForPlatform(platform_id,
1101 "clGetDeviceIDsFromD3D11KHR");
1102 if (!clGetDeviceIDsFromD3D11KHR) {
1104 "clGetDeviceIDsFromD3D11KHR().\n");
1108 cle = clGetDeviceIDsFromD3D11KHR(platform_id,
1109 CL_D3D11_DEVICE_KHR, device,
1110 CL_PREFERRED_DEVICES_FOR_D3D11_KHR,
1111 0,
NULL, nb_devices);
1112 if (cle == CL_DEVICE_NOT_FOUND) {
1114 "on platform \"%s\".\n", platform_name);
1117 }
else if (cle != CL_SUCCESS) {
1119 "on platform \"%s\": %d.\n", platform_name, cle);
1127 cle = clGetDeviceIDsFromD3D11KHR(platform_id,
1128 CL_D3D11_DEVICE_KHR, device,
1129 CL_PREFERRED_DEVICES_FOR_D3D11_KHR,
1130 *nb_devices, *devices,
NULL);
1131 if (cle != CL_SUCCESS) {
1133 "devices on platform \"%s\": %d.\n", platform_name, cle);
1142 #if HAVE_OPENCL_DXVA2 || HAVE_OPENCL_D3D11
1144 cl_device_id device_id,
1145 const char *device_name,
1148 cl_device_type device_type;
1151 cle = clGetDeviceInfo(device_id, CL_DEVICE_TYPE,
1152 sizeof(device_type), &device_type,
NULL);
1153 if (cle != CL_SUCCESS) {
1155 "of device \"%s\".\n", device_name);
1158 if (!(device_type & CL_DEVICE_TYPE_GPU)) {
1168 #if HAVE_OPENCL_DRM_ARM
1170 cl_platform_id platform_id,
1171 const char *platform_name,
1174 const char *drm_arm_ext =
"cl_arm_import_memory";
1180 "%s extension.\n", platform_name, drm_arm_ext);
1186 cl_device_id device_id,
1187 const char *device_name,
1190 const char *drm_arm_ext =
"cl_arm_import_memory";
1196 "%s extension.\n", device_name, drm_arm_ext);
1207 switch (src_ctx->
type) {
1209 #if HAVE_OPENCL_DRM_BEIGNET
1218 err =
av_dict_set(&selector_opts,
"platform_vendor",
"Intel", 0);
1220 err =
av_dict_set(&selector_opts,
"platform_version",
"beignet", 0);
1225 .context = selector_opts,
1229 .filter_device =
NULL,
1238 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
1245 cl_context_properties props[7] = {
1246 CL_CONTEXT_PLATFORM,
1248 CL_CONTEXT_VA_API_DISPLAY_INTEL,
1250 CL_CONTEXT_INTEROP_USER_SYNC,
1257 .context = src_hwctx->
display,
1259 .filter_platform = &opencl_filter_intel_media_vaapi_platform,
1260 .enumerate_devices = &opencl_enumerate_intel_media_vaapi_devices,
1261 .filter_device = &opencl_filter_intel_media_vaapi_device,
1269 #if HAVE_OPENCL_DXVA2
1273 IDirect3DDevice9 *device;
1274 HANDLE device_handle;
1277 hr = IDirect3DDeviceManager9_OpenDeviceHandle(src_hwctx->
devmgr,
1281 "for Direct3D9 device: %lx.\n", (
unsigned long)hr);
1286 hr = IDirect3DDeviceManager9_LockDevice(src_hwctx->
devmgr,
1289 if (SUCCEEDED(hr)) {
1290 cl_context_properties props[5] = {
1291 CL_CONTEXT_PLATFORM,
1293 CL_CONTEXT_ADAPTER_D3D9EX_KHR,
1302 .filter_platform = &opencl_filter_dxva2_platform,
1303 .enumerate_devices = &opencl_enumerate_dxva2_devices,
1304 .filter_device = &opencl_filter_gpu_device,
1309 IDirect3DDeviceManager9_UnlockDevice(src_hwctx->
devmgr,
1310 device_handle, FALSE);
1313 "for Direct3D9 device: %lx.\n", (
unsigned long)hr);
1317 IDirect3DDeviceManager9_CloseDeviceHandle(src_hwctx->
devmgr,
1323 #if HAVE_OPENCL_D3D11
1327 cl_context_properties props[5] = {
1328 CL_CONTEXT_PLATFORM,
1330 CL_CONTEXT_D3D11_DEVICE_KHR,
1331 (intptr_t)src_hwctx->
device,
1337 .context = src_hwctx->
device,
1339 .filter_platform = &opencl_filter_d3d11_platform,
1340 .enumerate_devices = &opencl_enumerate_d3d11_devices,
1341 .filter_device = &opencl_filter_gpu_device,
1349 #if HAVE_OPENCL_DRM_ARM
1357 .filter_platform = &opencl_filter_drm_arm_platform,
1359 .filter_device = &opencl_filter_drm_arm_device,
1377 cl_image_format *image_format,
1378 cl_image_desc *image_desc)
1397 wsub = 1 <<
desc->log2_chroma_w;
1403 for (
c = 0;
c <
desc->nb_components;
c++) {
1405 if (
comp->plane != plane)
1408 if (
comp->step != 1 &&
comp->step != 2 &&
1409 comp->step != 4 &&
comp->step != 8)
1413 if (
comp->shift +
comp->depth != 8 &&
1418 if (depth &&
comp->depth != depth)
1422 if (
comp->depth > 8 &&
1430 depth =
comp->depth;
1431 order = order * 10 +
comp->offset / ((depth + 7) / 8) + 1;
1434 c ==
desc->nb_components - 1);
1440 memset(image_format, 0,
sizeof(*image_format));
1441 memset(image_desc, 0,
sizeof(*image_desc));
1442 image_desc->image_type = CL_MEM_OBJECT_IMAGE2D;
1444 if (plane == 0 ||
alpha) {
1445 image_desc->image_width =
width;
1446 image_desc->image_height =
height;
1447 image_desc->image_row_pitch =
step *
width;
1449 image_desc->image_width =
width / wsub;
1451 image_desc->image_row_pitch =
step *
width / wsub;
1455 image_format->image_channel_data_type = CL_UNORM_INT8;
1458 image_format->image_channel_data_type = CL_UNORM_INT16;
1459 else if (depth == 32)
1460 image_format->image_channel_data_type = CL_FLOAT;
1465 #define CHANNEL_ORDER(order, type) \
1466 case order: image_format->image_channel_order = type; break;
1479 #undef CHANNEL_ORDER
1485 const void *hwconfig,
1489 cl_uint nb_image_formats;
1490 cl_image_format *image_formats =
NULL;
1493 int err, pix_fmts_found;
1494 size_t max_width, max_height;
1496 cle = clGetDeviceInfo(hwctx->
device_id, CL_DEVICE_IMAGE2D_MAX_WIDTH,
1497 sizeof(max_width), &max_width,
NULL);
1498 if (cle != CL_SUCCESS) {
1500 "supported image width: %d.\n", cle);
1504 cle = clGetDeviceInfo(hwctx->
device_id, CL_DEVICE_IMAGE2D_MAX_HEIGHT,
1505 sizeof(max_height), &max_height,
NULL);
1506 if (cle != CL_SUCCESS) {
1508 "supported image height: %d.\n", cle);
1515 cle = clGetSupportedImageFormats(hwctx->
context,
1517 CL_MEM_OBJECT_IMAGE2D,
1518 0,
NULL, &nb_image_formats);
1519 if (cle != CL_SUCCESS) {
1521 "image formats: %d.\n", cle);
1525 if (nb_image_formats == 0) {
1527 "driver (zero supported image formats).\n");
1534 if (!image_formats) {
1539 cle = clGetSupportedImageFormats(hwctx->
context,
1541 CL_MEM_OBJECT_IMAGE2D,
1543 image_formats,
NULL);
1544 if (cle != CL_SUCCESS) {
1546 "image formats: %d.\n", cle);
1553 cl_image_format image_format;
1554 cl_image_desc image_desc;
1557 for (plane = 0;; plane++) {
1564 for (
i = 0;
i < nb_image_formats;
i++) {
1565 if (image_formats[
i].image_channel_order ==
1566 image_format.image_channel_order &&
1567 image_formats[
i].image_channel_data_type ==
1568 image_format.image_channel_data_type)
1571 if (
i == nb_image_formats) {
1618 for (p = 0; p <
desc->nb_planes; p++) {
1619 cle = clReleaseMemObject(
desc->planes[p]);
1620 if (cle != CL_SUCCESS) {
1636 cl_image_format image_format;
1637 cl_image_desc image_desc;
1648 &image_format, &image_desc);
1656 image_desc.image_row_pitch = 0;
1658 image = clCreateImage(hwctx->
context, CL_MEM_READ_WRITE,
1659 &image_format, &image_desc,
NULL, &cle);
1662 "plane %d: %d.\n", p, cle);
1666 desc->planes[p] = image;
1669 desc->nb_planes = p;
1679 for (p = 0;
desc->planes[p]; p++)
1680 clReleaseMemObject(
desc->planes[p]);
1695 if (cle != CL_SUCCESS) {
1697 "command queue: %d.\n", cle);
1722 #if HAVE_OPENCL_DXVA2 || HAVE_OPENCL_D3D11
1724 for (
i = 0;
i < priv->nb_mapped_frames;
i++) {
1726 for (p = 0; p <
desc->nb_planes; p++) {
1727 cle = clReleaseMemObject(
desc->planes[p]);
1728 if (cle != CL_SUCCESS) {
1730 "frame object (frame %d plane %d): %d.\n",
1740 if (cle != CL_SUCCESS) {
1742 "command queue: %d.\n", cle);
1759 for (p = 0; p <
desc->nb_planes; p++)
1787 cl_event *events,
int nb_events)
1792 cle = clWaitForEvents(nb_events, events);
1793 if (cle != CL_SUCCESS) {
1795 "completion: %d.\n", cle);
1799 for (
i = 0;
i < nb_events;
i++) {
1800 cle = clReleaseEvent(events[
i]);
1801 if (cle != CL_SUCCESS) {
1803 "event: %d.\n", cle);
1814 cl_image_format image_format;
1815 cl_image_desc image_desc;
1817 size_t origin[3] = { 0, 0, 0 };
1828 &image_format, &image_desc);
1835 if (!dst->
data[p]) {
1837 "destination frame for transfer.\n", p);
1842 region[0] = image_desc.image_width;
1843 region[1] = image_desc.image_height;
1847 (cl_mem)
src->data[p],
1848 CL_FALSE, origin, region,
1851 0,
NULL, &events[p]);
1852 if (cle != CL_SUCCESS) {
1854 "OpenCL image plane %d: %d.\n", p, cle);
1869 cl_image_format image_format;
1870 cl_image_desc image_desc;
1872 size_t origin[3] = { 0, 0, 0 };
1883 &image_format, &image_desc);
1890 if (!
src->data[p]) {
1892 "source frame for transfer.\n", p);
1897 region[0] = image_desc.image_width;
1898 region[1] = image_desc.image_height;
1902 (cl_mem)dst->
data[p],
1903 CL_FALSE, origin, region,
1904 src->linesize[p], 0,
1906 0,
NULL, &events[p]);
1907 if (cle != CL_SUCCESS) {
1909 "OpenCL image plane %d: %d.\n", p, cle);
1937 if (!
map->address[p])
1943 0,
NULL, &events[e]);
1944 if (cle != CL_SUCCESS) {
1946 "image plane %d: %d.\n", p, cle);
1960 cl_map_flags map_flags;
1961 cl_image_format image_format;
1962 cl_image_desc image_desc;
1965 size_t origin[3] = { 0, 0, 0 };
1977 map_flags = CL_MAP_WRITE_INVALIDATE_REGION;
1981 map_flags |= CL_MAP_READ;
1983 map_flags |= CL_MAP_WRITE;
1993 &image_format, &image_desc);
1999 region[0] = image_desc.image_width;
2000 region[1] = image_desc.image_height;
2005 (cl_mem)
src->data[p],
2006 CL_FALSE, map_flags, origin, region,
2009 if (!
map->address[p]) {
2011 "image plane %d: %d.\n", p, cle);
2016 dst->
data[p] =
map->address[p];
2019 p,
src->data[p], dst->
data[p]);
2038 if (!
map->address[p])
2041 (cl_mem)
src->data[p],
2043 0,
NULL, &events[p]);
2051 #if HAVE_OPENCL_DRM_BEIGNET
2053 typedef struct DRMBeignetToOpenCLMapping {
2058 } DRMBeignetToOpenCLMapping;
2063 DRMBeignetToOpenCLMapping *mapping = hwmap->
priv;
2067 for (
i = 0;
i < mapping->frame.nb_planes;
i++) {
2068 cle = clReleaseMemObject(mapping->frame.planes[
i]);
2069 if (cle != CL_SUCCESS) {
2071 "of plane %d of DRM frame: %d.\n",
i, cle);
2084 DRMBeignetToOpenCLMapping *mapping;
2096 for (
i = 0;
i <
desc->nb_layers;
i++) {
2098 for (j = 0; j < layer->
nb_planes; j++) {
2103 cl_import_image_info_intel image_info = {
2105 .size =
object->size,
2106 .type = CL_MEM_OBJECT_IMAGE2D,
2108 .row_pitch = plane->
pitch,
2110 cl_image_desc image_desc;
2118 "plane %d is not representable in OpenCL: %d.\n",
2122 image_info.width = image_desc.image_width;
2123 image_info.height = image_desc.image_height;
2125 mapping->frame.planes[p] =
2126 priv->clCreateImageFromFdINTEL(hwctx->
context,
2128 if (!mapping->frame.planes[p]) {
2130 "from layer %d plane %d of DRM frame: %d.\n",
2136 dst->
data[p] = (uint8_t*)mapping->frame.planes[p];
2137 mapping->frame.nb_planes = ++p;
2142 &opencl_unmap_from_drm_beignet,
2153 for (p = 0; p < mapping->frame.nb_planes; p++) {
2154 if (mapping->frame.planes[p])
2155 clReleaseMemObject(mapping->frame.planes[p]);
2158 memset(dst->
data, 0,
sizeof(dst->
data));
2162 #if HAVE_OPENCL_VAAPI_BEIGNET
2181 err = opencl_map_from_drm_beignet(dst_fc, dst,
tmp,
flags);
2199 return CL_MEM_READ_WRITE;
2201 return CL_MEM_READ_ONLY;
2203 return CL_MEM_WRITE_ONLY;
2208 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
2222 cle = device_priv->clEnqueueReleaseVA_APIMediaSurfacesINTEL(
2225 if (cle != CL_SUCCESS) {
2227 "handles: %d.\n", cle);
2232 for (p = 0; p <
desc->nb_planes; p++) {
2233 cle = clReleaseMemObject(
desc->planes[p]);
2234 if (cle != CL_SUCCESS) {
2236 "image of plane %d of QSV/VAAPI surface: %d\n",
2253 VASurfaceID va_surface;
2254 cl_mem_flags cl_flags;
2262 mfxFrameSurface1 *mfx_surface = (mfxFrameSurface1*)
src->data[3];
2268 va_surface = *(VASurfaceID *)base_handle;
2272 va_surface = (VASurfaceID)(uintptr_t)
src->data[3];
2282 "OpenCL.\n", va_surface);
2290 desc->nb_planes = 2;
2292 for (p = 0; p <
desc->nb_planes; p++) {
2294 device_priv->clCreateFromVA_APIMediaSurfaceINTEL(
2295 dst_dev->context, cl_flags, &va_surface, p, &cle);
2296 if (!
desc->planes[p]) {
2298 "image from plane %d of QSV/VAAPI surface "
2299 "%#x: %d.\n", p, va_surface, cle);
2304 dst->
data[p] = (uint8_t*)
desc->planes[p];
2307 cle = device_priv->clEnqueueAcquireVA_APIMediaSurfacesINTEL(
2310 if (cle != CL_SUCCESS) {
2312 "handles: %d.\n", cle);
2322 &opencl_unmap_from_qsv,
desc);
2332 for (p = 0; p <
desc->nb_planes; p++)
2333 if (
desc->planes[p])
2334 clReleaseMemObject(
desc->planes[p]);
2336 memset(dst->
data, 0,
sizeof(dst->
data));
2342 #if HAVE_OPENCL_DXVA2
2355 cle = device_priv->clEnqueueReleaseDX9MediaSurfacesKHR(
2358 if (cle != CL_SUCCESS) {
2360 "handle: %d.\n", cle);
2381 "OpenCL.\n",
src->data[3]);
2383 for (
i = 0;
i < src_hwctx->nb_surfaces;
i++) {
2384 if (src_hwctx->surfaces[
i] == (IDirect3DSurface9*)
src->data[3])
2387 if (
i >= src_hwctx->nb_surfaces) {
2389 "is not in the mapped frames context.\n");
2393 desc = &frames_priv->mapped_frames[
i];
2395 cle = device_priv->clEnqueueAcquireDX9MediaSurfacesKHR(
2398 if (cle != CL_SUCCESS) {
2400 "handle: %d.\n", cle);
2408 for (
i = 0;
i <
desc->nb_planes;
i++)
2412 &opencl_unmap_from_dxva2,
desc);
2422 cle = device_priv->clEnqueueReleaseDX9MediaSurfacesKHR(
2425 if (cle == CL_SUCCESS)
2427 memset(dst->
data, 0,
sizeof(dst->
data));
2438 cl_mem_flags cl_flags;
2440 int err,
i, p, nb_planes;
2444 "for DXVA2 to OpenCL mapping.\n");
2451 "for DXVA2 to OpenCL mapping.\n");
2459 frames_priv->nb_mapped_frames = src_hwctx->
nb_surfaces;
2461 frames_priv->mapped_frames =
2462 av_calloc(frames_priv->nb_mapped_frames,
2463 sizeof(*frames_priv->mapped_frames));
2464 if (!frames_priv->mapped_frames)
2467 for (
i = 0;
i < frames_priv->nb_mapped_frames;
i++) {
2469 cl_dx9_surface_info_khr surface_info = {
2471 .shared_handle =
NULL,
2473 desc->nb_planes = nb_planes;
2474 for (p = 0; p < nb_planes; p++) {
2476 device_priv->clCreateFromDX9MediaSurfaceKHR(
2478 device_priv->dx9_media_adapter_type,
2479 &surface_info, p, &cle);
2480 if (!
desc->planes[p]) {
2482 "image from plane %d of DXVA2 surface %d: %d.\n",
2493 for (
i = 0;
i < frames_priv->nb_mapped_frames;
i++) {
2495 for (p = 0; p <
desc->nb_planes; p++) {
2496 if (
desc->planes[p])
2497 clReleaseMemObject(
desc->planes[p]);
2500 av_freep(&frames_priv->mapped_frames);
2501 frames_priv->nb_mapped_frames = 0;
2507 #if HAVE_OPENCL_D3D11
2518 cle = device_priv->clEnqueueReleaseD3D11ObjectsKHR(
2521 if (cle != CL_SUCCESS) {
2523 "handle: %d.\n", cle);
2540 if (
index >= frames_priv->nb_mapped_frames) {
2542 "mapping: %d >= %d.\n",
index, frames_priv->nb_mapped_frames);
2549 desc = &frames_priv->mapped_frames[
index];
2551 cle = device_priv->clEnqueueAcquireD3D11ObjectsKHR(
2554 if (cle != CL_SUCCESS) {
2556 "handle: %d.\n", cle);
2564 for (
i = 0;
i <
desc->nb_planes;
i++)
2568 &opencl_unmap_from_d3d11,
desc);
2578 cle = device_priv->clEnqueueReleaseD3D11ObjectsKHR(
2581 if (cle == CL_SUCCESS)
2583 memset(dst->
data, 0,
sizeof(dst->
data));
2594 cl_mem_flags cl_flags;
2596 int err,
i, p, nb_planes;
2600 "for D3D11 to OpenCL mapping.\n");
2607 "for D3D11 to OpenCL mapping.\n");
2617 frames_priv->mapped_frames =
2618 av_calloc(frames_priv->nb_mapped_frames,
2619 sizeof(*frames_priv->mapped_frames));
2620 if (!frames_priv->mapped_frames)
2623 for (
i = 0;
i < frames_priv->nb_mapped_frames;
i++) {
2625 desc->nb_planes = nb_planes;
2626 for (p = 0; p < nb_planes; p++) {
2627 UINT subresource = 2 *
i + p;
2630 device_priv->clCreateFromD3D11Texture2DKHR(
2633 if (!
desc->planes[p]) {
2635 "image from plane %d of D3D texture "
2636 "index %d (subresource %u): %d.\n",
2637 p,
i, (
unsigned int)subresource, cle);
2647 for (
i = 0;
i < frames_priv->nb_mapped_frames;
i++) {
2649 for (p = 0; p <
desc->nb_planes; p++) {
2650 if (
desc->planes[p])
2651 clReleaseMemObject(
desc->planes[p]);
2654 av_freep(&frames_priv->mapped_frames);
2655 frames_priv->nb_mapped_frames = 0;
2661 #if HAVE_OPENCL_DRM_ARM
2663 typedef struct DRMARMtoOpenCLMapping {
2668 } DRMARMtoOpenCLMapping;
2673 DRMARMtoOpenCLMapping *mapping = hwmap->
priv;
2676 for (
i = 0;
i < mapping->nb_planes;
i++)
2677 clReleaseMemObject(mapping->plane_images[
i]);
2679 for (
i = 0;
i < mapping->nb_objects;
i++)
2680 clReleaseMemObject(mapping->object_buffers[
i]);
2692 DRMARMtoOpenCLMapping *mapping =
NULL;
2693 cl_mem_flags cl_flags;
2694 const cl_import_properties_arm props[3] = {
2695 CL_IMPORT_TYPE_ARM, CL_IMPORT_TYPE_DMA_BUF_ARM, 0,
2710 mapping->nb_objects =
desc->nb_objects;
2711 for (
i = 0;
i <
desc->nb_objects;
i++) {
2712 int fd =
desc->objects[
i].fd;
2716 if (
desc->objects[
i].format_modifier) {
2718 "nonzero format modifier %"PRId64
", result may not "
2719 "be as expected.\n",
i, fd,
2720 desc->objects[
i].format_modifier);
2723 mapping->object_buffers[
i] =
2724 clImportMemoryARM(dst_dev->
context, cl_flags, props,
2725 &fd,
desc->objects[
i].size, &cle);
2726 if (!mapping->object_buffers[
i]) {
2728 "from object %d (fd %d, size %"SIZE_SPECIFIER") of DRM frame: %d.\n",
2729 i, fd,
desc->objects[
i].size, cle);
2735 mapping->nb_planes = 0;
2736 for (
i = 0;
i <
desc->nb_layers;
i++) {
2739 for (j = 0; j < layer->
nb_planes; j++) {
2741 cl_mem plane_buffer;
2742 cl_image_format image_format;
2743 cl_image_desc image_desc;
2744 cl_buffer_region region;
2745 int p = mapping->nb_planes;
2749 &image_format, &image_desc);
2752 "layer %d plane %d): %d.\n", p,
i, j, err);
2756 region.origin = plane->
offset;
2757 region.size = image_desc.image_row_pitch *
2758 image_desc.image_height;
2761 clCreateSubBuffer(mapping->object_buffers[plane->
object_index],
2763 CL_BUFFER_CREATE_TYPE_REGION,
2765 if (!plane_buffer) {
2767 "for plane %d: %d.\n", p, cle);
2772 image_desc.buffer = plane_buffer;
2774 mapping->plane_images[p] =
2775 clCreateImage(dst_dev->
context, cl_flags,
2776 &image_format, &image_desc,
NULL, &cle);
2780 clReleaseMemObject(plane_buffer);
2782 if (!mapping->plane_images[p]) {
2784 "for plane %d: %d.\n", p, cle);
2789 ++mapping->nb_planes;
2793 for (
i = 0;
i < mapping->nb_planes;
i++)
2794 dst->
data[
i] = (uint8_t*)mapping->plane_images[
i];
2797 &opencl_unmap_from_drm_arm, mapping);
2807 for (
i = 0;
i < mapping->nb_planes;
i++) {
2808 clReleaseMemObject(mapping->plane_images[
i]);
2810 for (
i = 0;
i < mapping->nb_objects;
i++) {
2811 if (mapping->object_buffers[
i])
2812 clReleaseMemObject(mapping->object_buffers[
i]);
2815 memset(dst->
data, 0,
sizeof(dst->
data));
2835 switch (
src->format) {
2836 #if HAVE_OPENCL_DRM_BEIGNET
2838 if (priv->beignet_drm_mapping_usable)
2839 return opencl_map_from_drm_beignet(hwfc, dst,
src,
flags);
2841 #if HAVE_OPENCL_VAAPI_BEIGNET
2843 if (priv->beignet_drm_mapping_usable)
2844 return opencl_map_from_vaapi(hwfc, dst,
src,
flags);
2846 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
2849 if (priv->qsv_mapping_usable)
2850 return opencl_map_from_qsv(hwfc, dst,
src,
flags);
2852 #if HAVE_OPENCL_DXVA2
2854 if (priv->dxva2_mapping_usable)
2855 return opencl_map_from_dxva2(hwfc, dst,
src,
flags);
2857 #if HAVE_OPENCL_D3D11
2859 if (priv->d3d11_mapping_usable)
2860 return opencl_map_from_d3d11(hwfc, dst,
src,
flags);
2862 #if HAVE_OPENCL_DRM_ARM
2864 if (priv->drm_arm_mapping_usable)
2865 return opencl_map_from_drm_arm(hwfc, dst,
src,
flags);
2876 #if HAVE_OPENCL_DRM_BEIGNET
2878 if (!priv->beignet_drm_mapping_usable)
2882 #if HAVE_OPENCL_VAAPI_BEIGNET
2884 if (!priv->beignet_drm_mapping_usable)
2888 #if HAVE_OPENCL_VAAPI_INTEL_MEDIA
2891 if (!priv->qsv_mapping_usable)
2895 #if HAVE_OPENCL_DXVA2
2897 if (!priv->dxva2_mapping_usable)
2901 err = opencl_frames_derive_from_dxva2(dst_fc, src_fc,
flags);
2907 #if HAVE_OPENCL_D3D11
2909 if (!priv->d3d11_mapping_usable)
2913 err = opencl_frames_derive_from_d3d11(dst_fc, src_fc,
flags);
2919 #if HAVE_OPENCL_DRM_ARM
2921 if (!priv->drm_arm_mapping_usable)