2011-07-16 8 views
5

ちょうどDirect3D11の使用を開始しました。新しいデータで1秒に数回更新する予定の動的テクスチャを作成しようとしています。私の問題は、新しいデータでテクスチャを更新するたびに、D3Dデバッガからこのエラーが発生することです。"既にマッピングされたエラー"を引き起こすダイナミックテクスチャのマッピング

D3D11:エラー:ID3D11DeviceContext :: Map:このリソースは既にマップされています! [RESOURCE_MANIPULATIONエラー#2097213:RESOURCE_MAP_ALREADYMAPPED]最終的にはしばらくの間、アプリケーションを実行した後、地図の呼び出しからE_OUTOFMEMORYエラーになり

私はこのように私のテクスチャを作成しています:

D3D11_TEXTURE2D_DESC td; 
td.ArraySize = 1; 
td.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
td.Format = DXGI_FORMAT_B8G8R8X8_UNORM; 
td.Height = height; 
td.Width = width; 
td.MipLevels = 1; 
td.MiscFlags = 0; 
td.SampleDesc.Count = 1; 
td.SampleDesc.Quality = 0; 
td.Usage = D3D11_USAGE_DYNAMIC; 

HR(m_device->CreateTexture2D(&td, 0, &texture)); 

と、このようにそのデータ更新:私はテクスチャを作成し、そこにデータをマッピングする前に

HR(m_deviceContext->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource)); 
BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData); 
for(UINT i = 0; i < height; ++i) 
{ 
    memcpy(mappedData, buffer,rowspan); 
    mappedData += mappedResource.RowPitch; 
    buffer += rowspan; 
} 
m_deviceContext->Unmap(texture, 0); 

を、私が行っているすべての私のプログラムはDirect3Dデバイスを初期化しています。私は間違っていることを完全に困惑しています。私はこれについてmsdnにできるだけ多くを読むように努力してきましたが、何が間違っているのか把握するのに役立つものは何もありませんでした。 MSDNによると、私は適切な手順を取っています:

http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic

To fill a dynamic texture (one created with D3D11_USAGE_DYNAMIC): 
Get a pointer to the texture memory by passing in D3D11_MAP_WRITE_DISCARD when calling    
ID3D11DeviceContext::Map. 
Write data to the memory. 
Call ID3D11DeviceContext::Unmap when you are finished writing data. 

私は正しく、あまりにもテクスチャの説明を記入しているかなり確信しています。

私のd3dデバイスの初期化によって問題が発生する可能性がありますか?私はマップ機能を悪用していますか?十分な背景情報を提供していませんか?何が起こっているかについてのアイデア?

追加情報:頂点シェーダの定数バッファにデータをマップしようとすると、同じ「リソースは既にマップされています」というエラーが表示されます。また、私は別のコンピュータでそれをテストし、同じマッピングの問題を抱えていました。

アップデート: D3D11用のチュートリアルコードをダウンロードしました。チュートリアルコードがd3dの初期化を完了した直後に、テクスチャの作成とマッピングコードを取得してそれをプルしました。私はちょうど私がマッピングエラーを取得するかどうかを見たいと思った。予想どおり、私は "リソースは既にマップされている"エラーを取得しませんでした。さらに、チュートリアルのd3d初期化コードをコピーして私のものと置き換えると、リソースをすでにマップしているエラーが発生し、さらに混乱してしまいます。なぜなら、d3dを初期化する前にすべて行うのはウィンドウを作成するからです。

答えて

2

面白いのですが、あなたが立ち往生したことについて質問をすると、問題が見つかるはずです。

私は問題が何かを考え出しました。それは私のHRマクロで、私はマップ呼び出しを囲んでいました。

#define HR(x)             
{                
    HRESULT hr = (x);           
    if(FAILED(x))            
    {               
     DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); 
    }              
} 

私はなぜそれが問題の根本だろう見当がつかないが、私は間違いなくこのマクロは、地図コールの問題を持っているだろうかを知っているしたいと思います。

+4

問題は、関数を2回実行していることです。あなたはそれを行うべきです:HRESULT hr =(x); if(FAILED(時)) – notabene

関連する問題