SharpDX: создайте D3D11.Texture2D от D3D10.Texture2D?


Я использую SharpDX и пытаюсь создать D3D11.Texture2D, который указывает на те же данные, что и существующий D3D10.Texture2D. Я думаю, что мне нужно получить DXGI.Surface и использовать его для создания новой текстуры, но я всегда получаю эту бесполезную ошибку:

Значение HRESULT: [0x80070057], модуль: [неизвестен] ApiCode: [неизвестный/Unknown], сообщение: параметр задан неверно.

Вот мой текущий код, который компилируется, но не работает:

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    var texDesc = new D3D11.Texture2DDescription
    {
        ArraySize = 1,
        BindFlags = D3D11.BindFlags.ShaderResource | D3D11.BindFlags.UnorderedAccess,
        CpuAccessFlags = D3D11.CpuAccessFlags.None,
        Format = DXGI.Format.B8G8R8A8_UNorm,
        Height = d3d10Texture2D.Description.Height,
        MipLevels = 1,
        OptionFlags = D3D11.ResourceOptionFlags.None,
        SampleDescription = new DXGI.SampleDescription(1, 0),
        Usage = D3D11.ResourceUsage.Default,
        Width = d3d10Texture2D.Description.Width
    };

    SharpDX.DataRectangle dataRectangle;
    using (var surface = d3d10Texture2D.QueryInterface<DXGI.Surface>())
    {
        int pitch = d3d10Texture2D.Description.Width
            * (int)DXGI.FormatHelper.SizeOfInBytes(d3d10Texture2D.Description.Format);
        dataRectangle = new SharpDX.DataRectangle(surface.NativePointer, pitch);
    }

    return new D3D11.Texture2D(this.d3d11Device, texDesc, dataRectangle);
}

Обновить

Я наткнулся на ответ, что контуры Как разделить поверхности между различными устройствами DirectX. Исходя из этого, я считаю, что правильный способ получить D3D11.Texture2D от D3D10.Texture2D - это получить интерфейс ресурса и вызвать OpenSharedResource().

Это несколько упрощает мою функцию:

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    using (var resource = d3d10Texture2D.QueryInterface<DXGI.Resource>())
    {
        return this.d3d11Device.OpenSharedResource<D3D11.Texture2D>(resource.SharedHandle);
    }
}
Кажется, это работает. Это лучший способ сделать это?
1 2

1 ответ:

Чтобы разделить данные между несколькими текстурами, получите интерфейс DXGI.Resource, а затем вызовите OpenSharedResource(). Вот как это сделать с SharpDX:

private D3D11.Texture2D CreateD3D11Texture2D(D3D10.Texture2D d3d10Texture2D)
{
    using (var resource = d3d10Texture2D.QueryInterface<DXGI.Resource>())
    {
        return this.d3d11Device.OpenSharedResource<D3D11.Texture2D>(resource.SharedHandle);
    }
}

Вот ответ на другой вопрос с более общей информацией о совместном использовании поверхностей между различными устройствами DirectX.