none
DirectX11 異なるデバイス間のテクスチャのコピーについて RRS feed

  • 質問

  • お世話になります。
    デバイス(ID3D11Device)が複数(例としてAとB)あり、デバイスBでCreateTexture2Dして作成したテクスチャ(ID3D11Texture2D)をデバイスAでCreateTexture2Dして作成したテクスチャ(ID3D11Texture2D)へとコピーしたいです。
    デバイスBのコンテキスト(ID3D11DeviceContext)で、CopySubresourceRegion()を行うとコピーはされるのですが、デバッグログに下記の例外が大量に出力されていました(デバイスAのコンテキストだとコピーはされませんでした)。
    検証したところ、異なるデバイスで作成されたID3D11Texture2DをCopySubresourceRegion()でコピーしようとすると発生するようです。

    本題なのですが、この例外を発生しないようにするにはどうしたらよいのか、または、別のコピー方法があれば教えて頂きたいです。
    ID3D11DeviceContext::CopyResource()はAとBのテクスチャの型が違うため?かできないみたいでした。

    以上です。よろしくお願いします。

    ■出力された例外
    0x74A0FD62 で例外がスローされました (SYSTEM4.exe 内): Microsoft C++ の例外: _com_error (メモリの場所 0x0081A408)。

    ■デバイスAのテクスチャ作成部分

    ID3D11Texture2D* m_pTexA;
    D3D11_TEXTURE2D_DESC desc = {0};
    desc.Width = 1600;
    desc.Height = 900;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.Usage = D3D11_USAGE_DYNAMIC;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    desc.MiscFlags = 0;
    hr = m_deviceA->CreateTexture2D(&desc, NULL, &m_pTexA);

    ■デバイスBのテクスチャ作成部分

    ID3D11Texture2D* m_pTexB;
    D3D11_TEXTURE2D_DESC desc2 = {0};
    desc2.Width = 1600;
    desc2.Height = 900;
    desc2.MipLevels = 0;
    desc2.ArraySize = 1;
    desc2.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    desc2.SampleDesc.Count = 1;
    desc2.SampleDesc.Quality = 0;
    desc2.Usage = D3D11_USAGE_DEFAULT;
    desc2.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
    desc2.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    desc2.MiscFlags = 0;
    hr = m_deviceB->CreateTexture2D(&desc2, NULL, &m_pTexB);

    ■開発環境
    Visual Studio 2017 pro ver 15.9.16
    C++
    DirectX11.1
    Windows Kits 10.0.17763.0
    Windows 10 pro 1809 64bit
    NVIDIA GeForce GTX 1050




    • 編集済み gama55 2019年9月25日 7:52
    2019年9月25日 7:41

回答

  • 自己解決しました。

    D3D11_USAGE_STAGINGでテクスチャCを作成し、
    B→CはCopySubresourceRegion()でコピーし、C→AはそれぞれをMap/Unmapで開いてmemcpy()で
    ピクセルをコピーすることで実現できました。
    • 回答としてマーク gama55 2019年10月1日 8:08
    2019年10月1日 8:07