使用专用 GPU 时,无法从 D3D11 在 D3D9 中创建共享纹理

Cannot create shared texture in D3D9 from D3D11 when using dedicated GPU

提问人:svenno 提问时间:11/15/2023 更新时间:11/15/2023 访问量:16

问:

我正在处理 DirectX 11 和 DirectX 9 之间的互操作,首先创建 D3D11 纹理,获取共享的 DXGI 句柄,然后使用句柄创建 D3D9 纹理。对于设备创建,我使用 DX11 和 DX9 的默认适配器。

只要我在NVIDIA控制面板中将“自动选择”或“集成显卡”设置为首选图形处理器,它就可以正常工作,但是当我选择高性能选项时,它就会失败。在这种情况下,设备创建也正常工作,并且按预期选择了我的专用 GPU。

在我的 IDirect3DDevice9Ex 上调用 CreateTexture 时,我得到的错误是“值不在预期范围内”。像这样的纹理共享是否适用于 GPU,或者我在资源配置中是否遗漏了某些内容?

我正在使用 DirectX 的 Silk.NET 包装器。以下是我用于创建纹理的片段

首先是 D3D11 纹理:

var texture2DDesc = new Texture2DDesc()
{
    BindFlags       = (uint)(BindFlag.RenderTarget),
    Format          = Silk.NET.DXGI.Format.FormatB8G8R8A8Unorm,
    Width           = width,
    Height          = height,
    MipLevels       = 1,
    SampleDesc      = new SampleDesc(1, 0),
    Usage           = Usage.Default,
    MiscFlags       = (uint)ResourceMiscFlag.None,
    CPUAccessFlags  = 0, 
    ArraySize       = 1
};

然后通过 GetSharedHandle 从 IDXGIResource 接口获取共享句柄,并使用它来创建 D3D9 纹理:

d3D9ExDevice.CreateTexture(
                Width:          width,
                Height:         height,
                Levels:         1,
                Usage:          D3D9.UsageRendertarget,
                Format:         Silk.NET.Direct3D9.Format.A8R8G8B8, 
                Pool:           Pool.Default, 
                ppTexture:      ref d3D9Texture,
                pSharedHandle:  &sharedHandle
            );

此函数失败。

DirectX 互操作 DirectX-11 DirectX-9

评论


答:

0赞 svenno 11/15/2023 #1

发现问题:

Texture2DDesc 中缺少一个标志,如果您设置以下内容,它就会起作用。

BindFlags = (uint)(BindFlag.RenderTarget | BindFlag.ShaderResource)