2011-07-16 8 views
5

Właśnie zaczynam używać Direct3D11 i próbuję stworzyć dynamiczną teksturę, którą planuję zaktualizować nowymi danymi kilka razy na sekundę. Mój problem polega na tym, że za każdym razem, gdy aktualizuję teksturę o nowe dane, pojawia się ten błąd z D3D Debugger:Odwzorowanie dynamicznej tekstury powodującej "Błąd już zmapowany"

D3D11: BŁĄD: ID3D11DeviceContext :: Mapa: Ten zasób jest już zmapowany! [RESOURCE_MANIPULATION ERROR # 2097213: RESOURCE_MAP_ALREADYMAPPED]

który ostatecznie przekształca się w błąd E_OUTOFMEMORY z rozmowy mapa po uruchomieniu aplikacji na chwilę.

tworzę moją teksturę tak:

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

i aktualizowania swoich danych tak:

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

Przed utworzyć teksturę i mapowania danych do niego, wszystko co zrobili w mój program inicjuje urządzenia Direct3D. Jestem całkowicie zaskoczony tym, co robię źle. Starałem się czytać tyle, ile mogę na temat msdn o tym, ale nic nie pomogło mi dowiedzieć się, co idzie źle. Zgodnie z MSDN, biorę do odpowiednich etapów:

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. 

jestem dość pewny ja wypełnienie opisu tekstury zbyt poprawnie.

Czy problem może wynikać z mojej inicjalizacji urządzeń d3d? Czy niewłaściwie używam funkcji mapy? Czy nie dostarczyłem wystarczających informacji ogólnych? Jakieś pomysły na to, co się dzieje?

Informacje dodatkowe: Podczas próby zmapowania danych do stałego bufora dla mojego procesora wierzchołków pojawia się ten sam błąd "zasób już zmapowany". Ponadto przetestowałem go na innym komputerze i uzyskałem te same problemy z odwzorowaniem.

Aktualizacja: Pobrałem kod samouczka dla D3D11 i wziąłem mój kod do tworzenia tekstury i odwzorowania i zapisałem go zaraz po zakończeniu kodu samouczka, inicjalizując d3d. Chciałem tylko sprawdzić, czy dostanę błąd mapowania. Zgodnie z oczekiwaniami nie otrzymałem błędu "zasób już zmapowany". Co więcej, kiedy skopiuję kod inicjalizacyjny d3d z samouczka i zastępuję go moim, nadal otrzymuję zasób już zmapowany błąd, który nawet myli mnie jeszcze bardziej, ponieważ wszystko, co robię przed zainicjowaniem d3d, tworzy okno.

Odpowiedz

2

To zabawne, kiedy zaczynasz zadawać pytania o coś, na czym utknąłeś, łatwiej jest znaleźć problem haha.

Uświadomiłem sobie, na czym polega problem. To było moje makro HR, które otaczałem wywołanie mapy.

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

Nie mam pojęcia, dlaczego miałby korzeniem problemu, ale na pewno chciałby wiedzieć, jak to makro miałoby problem z wezwaniem na mapę.

+4

Problem polega na dwukrotnym uruchomieniu funkcji. Powinieneś to zrobić: HRESULT hr = (x); jeśli (NIEPOWODZENIE (h)) – notabene

Powiązane problemy