在 opencl 中更改 Directx 获取表面的图像格式

Posted

技术标签:

【中文标题】在 opencl 中更改 Directx 获取表面的图像格式【英文标题】:Changing image format of a Directx acquired surface in opencl 【发布时间】:2015-08-20 07:12:48 【问题描述】:

我在 opencl 工作,从 Directx 获取媒体表面

  /* Working on NV12 surfaces, associate the shared buffer with the kernel object*/
  p->memobj[0] = clCreateFromDX9MediaSurfaceINTEL(p->context, CL_MEM_READ_ONLY, input_D3D_surf, input_D3D_surf_hdl, 0, &error);
  p->memobj[1] = clCreateFromDX9MediaSurfaceINTEL(p->context, CL_MEM_READ_ONLY, input_D3D_surf, input_D3D_surf_hdl, 1, &error);
  p->memobj[2] = clCreateFromDX9MediaSurfaceINTEL(p->context, CL_MEM_READ_ONLY, input_D3D_surf, input_D3D_surf_hdl, 0, &error);
  p->memobj[3] = clCreateFromDX9MediaSurfaceINTEL(p->context, CL_MEM_READ_ONLY, input_D3D_surf, input_D3D_surf_hdl, 1, &error);
  cl_mem surfaces[4];
  surfaces[0] = p->memobj[0];
  surfaces[1] = p->memobj[1];
  surfaces[2] = p->memobj[2];
  surfaces[3] = p->memobj[3];

  error = clEnqueueAcquireDX9ObjectsINTEL(p->command_queue, 4, surfaces, 0, NULL, NULL);

媒体表面具有如下指定的 NV12 格式和here

MAKEFOURCC(?N?,?V?,?1?,?2?),Plane0    CL_R         CL_UNORM_INT8
MAKEFOURCC(?N?,?V?,?1?,?2?),Plane1    CL_RG        CL_UNORM_INT8

我想将opencl对象的平面0(表示surface[0]和surface[2])的图像格式更改为CL_RGBA,有什么办法可以做到吗?

【问题讨论】:

【参考方案1】:

您可以使用英特尔 OpenCL SDK 从 NV12 转换为 RGBA。 (https://software.intel.com/en-us/intel-opencl)

示例代码在这里。 (https://github.com/ChiahungTai/OpenCL-playgorund/tree/master/intel/ResourceSharing/DXVASurfaceSharing)

【讨论】:

以上是关于在 opencl 中更改 Directx 获取表面的图像格式的主要内容,如果未能解决你的问题,请参考以下文章

DirectX11 With Windows SDK--25 法线贴图

在 ffplay 中获得绿屏:使用 Live555 通过 RTP 流将桌面(DirectX 表面)流式传输为 H264 视频

nvidia/cuda 公开源中的devel和runtime有啥区别

旋转相机时 DirectX 基元不会在屏幕上移动

如何用DirectX显示YUV格式的图像 20HanZhu1

我的 OpenCL 代码根据看似 noop 更改输出