目的是尝试在不同版本的两个不同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,或者我错过了我应该做的事情?
答案 0 :(得分:2)
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的互操作性。
如果您仔细阅读this page,您可以轻松得出结论:
答案 1 :(得分:0)
创建D3D9Ex设备时,它也是D3D9设备。因此,您不需要任何其他东西。
如果要将D3D9Ex设备存储到D3D9设备的指针中,请对IID_IDirect3DDevice9使用QueryInterface。