lockflags在direct3d中做了什么

时间:2012-07-19 21:46:33

标签: video rendering direct3d

我正在使用direct3d来渲染yuv视频数据。基本过程是:

使用CreateOffscreenPlain创建yv12表面 在这个表面上的lockrectangle获取数据指针,将yuv数据复制到它。 从这个表面伸展到后缓冲区 调用present以显示后台缓冲区。

在LockRectangle调用上有一个LockFlags参数,我们一直在使用LockFlags.Discard,听起来这意味着我们将覆盖整个缓冲区。

这似乎在一些英特尔板载图形设备上引起了一些问题(目前的例外),而如果我将LockFlags更改为LockFlags.None,问题似乎就会消失。我这样做了一个竞争条件吗?

我想我可能需要了解锁的必要性。显示是32位rgb所以我猜测yuv到rgb的转换是在stretchrectangle调用上完成的。这个过程假设是同步还是异步?我想我已经读过现在是异步的,但这对我来说无关紧要,因为这是我不直接接触的后备缓冲器的操作。

如果问题没有意义,我会道歉,我认为到目前为止我还没有很好的处理。

1 个答案:

答案 0 :(得分:0)

我觉得你使用D3D9?无论哪种方式都适用于所有API。

使用“D3DLOCK_DISCARD”时,应始终重写缓冲区中的所有数据。听起来你可能不是吗?

如果您的意图是重写缓冲区中的所有数据,那么出于性能原因,您确实希望使用“Discard”。如果您只编写部分数据,则可以使用“无”。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx “如果使用D3DLOCK_DISCARD调用锁定时图形处理器仍在使用缓冲区,则返回指向新内存区域的指针,而不是旧缓冲区数据。”