Directx Windows7中的D3D9和D3D9Ex表面共享

Directx Windows7中的D3D9和D3D9Ex表面共享,directx,direct3d,directx-9,Directx,Direct3d,Directx 9,目的是尝试在两个不同版本的不同d3d设备之间共享表面,一个是d3d9,另一个是d3d9Ex或更高版本 基于MSDN文档,其中说明您可以从中执行此操作 Direct3D资源现在可以在设备或进程之间共享。这适用于任何Direct3D资源,包括纹理、顶点缓冲区、索引缓冲区或曲面(例如渲染目标、深度模具缓冲区或屏幕外平面曲面) 也基于MSDN文档,其中说明您不能从 Direct3D 10.0、Direct3D 9c和较早版本的Direct3D运行时不支持共享曲面。系统内存拷贝将继续用于与基于GDI或DX

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

基于MSDN文档,其中说明您可以从中执行此操作

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

也基于MSDN文档,其中说明您不能从

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,还是我错过了我应该做的事情

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

  • 您无法使用Direct3D 9进行曲面共享,本文档已明确说明了这一点,如下所示

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

    如果你仔细阅读,你很容易得出结论:

    • Direct3D 11、Direct2D和Direct3D 10.1支持同步曲面共享
    • Direct3D 9Ex支持非同步表面共享
    • Direct3D 10.0、Direct3D 9c和较早版本的Direct3D运行时不支持曲面共享

    创建D3D9Ex设备时,它也是D3D9设备。因此,您不需要任何单独的内容


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

    谢谢。我认为你是对的。我的印象是,由于最初的文档是关于d3d9ex的,所以表面共享是在d3d9和d3d9ex之间进行的。