2011-07-16 21 views
5

Doğrudan Direct3D11 kullanmaya başlıyorum ve birkaç kez yeni verilerle güncelleştirmeyi planladığım dinamik bir doku oluşturmaya çalışıyorum. Sorun şu ki, her yeni veriyi yeni veriyle güncelleştirdiğimde, bu hatayı D3D Hata Ayıklayıcı'dan alıyor:"Zaten Eşlenen Hata" neden olan dinamik doku eşleme

D3D11: HATA: ID3D11DeviceContext :: Harita: Bu kaynak zaten eşlenmiş! [RESOURCE_MANIPULATION HATA # 2097213: RESOURCE_MAP_ALREADYMAPPED] sonunda bir süre uygulamayı çalıştırdıktan sonra Harita çağrısından bir E_OUTOFMEMORY Hata dönüşür

. Böyle verilerini

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)); 

ve güncelleme:

Bu gibi benim doku oluşturma

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); 

Ben doku oluşturmak ve buna harita verilerini önce, tüm ı yapmış Programım Direct3D cihazlarını başlatıyor. Yanlış yaptığım şeye tamamen saldırdım. Bu konuda msdn hakkında olabildiğince fazla okumaya çalışıyorum ama neyin yanlış gittiğini anlamak için hiçbir şey bana yardımcı olmadı. msdn göre, düzgün adımlara alıyorum:

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. 

Ben doğru çok doku açıklamasına doldurarak var oldukça eminim.

Sorun benim d3d aygıtlarımı başlatmamdan kaynaklanıyor olabilir mi? Harita fonksiyonunu yanlış mı kullanıyorum? Yeterli arka plan bilgisi vermedim mi? Neler olduğu hakkında bir fikrin var mı?

Ek Bilgi: Vertex gölgelendiricim için verileri sabit bir arabelleğe eşlemeye çalıştığımda aynı "kaynak zaten eşlenmiş" hatasını alıyorum. Ayrıca, farklı bir bilgisayarda test ettim ve aynı haritalama problemlerini aldım.

Güncelleme: D3D11 için bazı öğretici kodlarını indirdim ve doku oluşturma ve haritalama kodumu aldım ve eğitim kodu d3d'yi başlattıktan sonra sağa kaydırdım. Sadece bir haritalama hatası alıp almayacağımı görmek istedim. Beklendiği gibi, "zaten eşlenmiş bir kaynak" hatası almadım. Ayrıca, d3d başlatma kodunu öğreticiden kopyalayıp benimkiyle değiştirdiğimde, hala daha fazla kafa karıştırıcı olan ve hatta beni daha da şaşırtan bir hata alıyorum, çünkü d3d'yi başlatmadan önce yaptığım tek şey bir pencere oluşturuyor.

cevap

2

Takılı kaldığınız bir şey hakkında soru sormaya başladığınızda, haha ​​sorununu bulmak daha kolay hale gelir.

Sorunun ne olduğunu anladım. Harita aramayı çevreleyen İK makamımdı.

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

Hiçbir fikrim neden sorunun kökü olur, ama kesinlikle bu makro Harita çağrısıyla sorunu olurdu biliyorum istiyorum.

+4

Sorun, işlevi iki kez çalıştırıyor olmanızdır. Bunu yapmalısınız: HRESULT hr = (x); ise (FAILED (hr)) – notabene