我正在使用 direct3d 渲染 yuv 视频数据。基本流程是:
在这个表面上使用 CreateOffscreenPlain lockrectangle 创建一个 yv12 表面以获取数据指针,将 yuv 数据复制到它。从这个表面拉伸矩形到后台缓冲区调用存在以显示后台缓冲区。
在 LockRectangle 调用中有一个 LockFlags 参数,我们一直在使用 LockFlags.Discard,这听起来意味着我们将覆盖整个缓冲区。
这似乎在某些英特尔板载图形设备上引起了一些问题(目前有例外),而如果我将 LockFlags 更改为 LockFlags.None,问题似乎就消失了。我这样做是否创造了竞争条件?
我想我可能需要了解这里锁定的必要性。显示器是 32 位 rgb,所以我猜 yuv 到 rgb 的转换是在 stretchrectangle 调用上完成的。这个过程是同步的还是异步的?我想我已经读过礼物是异步的,但这对我来说并不重要,因为这是对我不直接接触的后缓冲区的操作。
如果这些问题没有意义,我深表歉意,我认为到目前为止我还没有很好地处理这个问题。