2

我正在尝试在两个进程之间共享一个 direct3d 表面。他们都在 Windows 7 上使用 D3D9Ex。MSDN文档指出:

要共享,您需要在创建时指定要共享的资源,并在默认池(D3DPOOL_DEFAULT)中找到该资源。

还:

要创建共享资源,请使用未初始化的句柄调用任何资源创建 API(见下文)(指针本身不是 NULL (pSharedHandle != NULL),但指针指向 NULL 值 (*pSharedHandle == NULL))。API 将生成一个共享资源并返回一个有效句柄。

所以这是我对 CreateTexture 创建共享纹理的调用:

IDirect3DTexture9* texture;
HANDLE sharedHandle = nullptr;

d3dDevice9Ex->CreateTexture(width, height, 1,
            D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, &sharedHandle);

这失败了;DgbView.exe 中的输出是:

[8788] Direct3D9: (ERROR) :Failure trying to create a texture
[8788] 
[8788] Direct3D9: (ERROR) :Source of shared texture must be in D3DPOOL_SYSTEMMEM. CreateTexture fails.

我不明白。似乎文档声明表面必须在 D3DPOOL_DEFAULT 中,但来自 Direct3D 的错误消息是表面必须在 D3DPOOL_SYSTEMMEM 中。它是哪一个,或者我调用这个方法的方式还有什么问题吗?

请注意,当我将参数更改为 D3DPOOL_SYSTEMMEM 时,错误消息变为:

[10068] Direct3D9: (ERROR) :Failure trying to create a texture
[10068] 
[10068] Direct3D9: (ERROR) :*pSharedHandle must be a valid pointer to create such D3DPOOL_SYSTEMMEM texture. CreateTexture fails.
4

1 回答 1

1

聚会有点晚了,但是在处理一些遗留代码时我遇到了同样的问题。

进入 CreateTexture 方法反汇编后,我发现代码中似乎存在错误(或至少未记录的“功能”)。

使用 pSharedHandle 创建共享 GPU 纹理时,必须将 *ppTexture 初始化为 NULL

如果不这样做,代码就会落入尝试使用系统位图作为纹理的路径中。

所以在上面的代码中,改变

IDirect3DTexture9* texture;

进入

IDirect3DTexture9* texture = nullptr;

会解决这个问题。

希望这可以节省我浪费在这上面的几个小时。

于 2018-10-31T16:35:58.033 回答