在Windows 7中D3D9和D3D9Ex表面共享

时间:2014-03-05 21:57:05

标签: directx direct3d directx-9

目的是尝试在不同版本的两个不同d3d设备之间共享表面,一个是d3d9,另一个是d3d9Ex或更高版本。

根据MSDN文档的说明,您可以从link进行说明。

  

现在可以在设备或进程之间共享Direct3D资源。这适用于任何Direct3D资源,包括纹理,顶点缓冲区,索引缓冲区或曲面(如渲染目标,深度模板缓冲区或屏幕外平面)。

同样基于MSDN文档,其中声明您无法从another link

执行此操作
  

Direct3D 10.0,Direct3D 9c和较旧的Direct3D运行时不支持共享表面。系统内存副本将继续用于与基于GDI或DXGI的API的互操作性。

验证是自己尝试,因此代码:

HANDLE SharedHandle = NULL;

IDirect3DTexture9 *d3d9Tex;
pD3D9Dev->CreateTexture(Width, Height, 1, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &d3d9Tex, &SharedHanlde);
if(FAILED(hr))
{
    LOG("failed %s %s", GetD3DErrorString(hr), CNGetErrorString(GetLastError()));
}

IDirect3DTexture9 *d3d9ExTex;
pD3D9DevEx->CreateTexture(Width, Height, 1, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &d3d9ExTex, &SharedHanlde);
if(FAILED(hr))
{
    LOG("failed %s %s", GetD3DErrorString(hr), CNGetErrorString(GetLastError()));
}

给出了:

Direct3D9: (ERROR) :Device is not capable of sharing resource. CreateTexture fails.

CreateRenderTarget给出相同的结果。

对结果感到非常失望,我的问题是,资源共享是否适用于d3d9,或者我错过了我应该做的事情?

2 个答案:

答案 0 :(得分:2)

  1. Direct3D是一个通用名称,它包括Direct3D 9,Direct3D 9EX,Direct3D 10和Direct3D 11 ...文档说现在可以共享Direct3D资源,这不是太糟糕,绝对可以用Direct3D做到这一点10.1和Direct3D 11。

  2. 你无法与Direct3D 9进行表面共享,该文件已经清楚地阐明了这一点。

  3.   

    Direct3D 10.0,Direct3D 9c和较旧的Direct3D运行时不支持   共享表面。系统内存副本将继续用于   与GDI或基于DXGI的API的互操作性。

    如果您仔细阅读this page,您可以轻松得出结论:

    • Direct3D 11,Direct2D和Direct3D 10.1支持同步表面共享
    • Direct3D 9Ex支持非同步表面共享。
    • Direct3D 10.0,Direct3D 9c和较旧的Direct3D运行时不支持曲面共享。

答案 1 :(得分:0)

创建D3D9Ex设备时,它也是D3D9设备。因此,您不需要任何其他东西。

如果要将D3D9Ex设备存储到D3D9设备的指针中,请对IID_IDirect3DDevice9使用QueryInterface。